00001 package edu.ksu.cis.bandera.dspin;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import edu.ksu.cis.bandera.bir.Collection;
00036
00037
00038 import java.io.*;
00039 import java.util.*;
00040
00041 import edu.ksu.cis.bandera.bir.*;
00042
00043 public class DSpinTypeName extends AbstractTypeSwitch implements BirConstants
00044 {
00045
00046 public void caseArray(Array type, Object o)
00047 {
00048 if (o == null)
00049 setResult(type.typeName());
00050 else {
00051 type.getBaseType().apply(this,null);
00052 String elementType = (String) getResult();
00053 if (type.getBaseType().isKind(REF))
00054 elementType = elementType.substring(0,elementType.length() - 4)
00055 + "_aref";
00056 setResult("{ byte refIndex; byte length; "
00057 + elementType +"& elements; }");
00058 }
00059 }
00060 public void caseBool(Bool type, Object o)
00061 {
00062 if (o == null)
00063 setResult(type.typeName());
00064 else
00065 setResult("bool");
00066 }
00067 public void caseCollection(Collection type, Object o)
00068 {
00069 setResult("");
00070 }
00071 public void caseEnumerated(Enumerated type, Object o)
00072 {
00073 if (o == null)
00074 setResult(type.typeName());
00075 else {
00076 if (type.getEnumeratedSize() < 256 && type.getFirstElement() >= 0)
00077 setResult("byte");
00078 else
00079 setResult("int");
00080 }
00081 }
00082 public void caseField(Field type, Object o)
00083 {
00084 type.getType().apply(this,null);
00085 setResult( (String) getResult() + " " + type.getName() + "; ");
00086 }
00087 public void caseLock(Lock type, Object o)
00088 {
00089 if (o == null)
00090 setResult(type.typeName());
00091 else {
00092 String r = (type.isReentrant()) ? "R" : "";
00093 String w = (type.isWaiting()) ? "W" : "";
00094 setResult("lock_" + r + w);
00095 }
00096 }
00097 public void caseRange(Range type, Object o)
00098 {
00099 if (o == null)
00100 setResult(type.typeName());
00101 else {
00102 if (type.getRangeSize() < 256 && type.getFirstElement() >= 0)
00103 setResult("byte");
00104 else
00105 setResult("int");
00106 }
00107 }
00108 public void caseRecord(Record type, Object o)
00109 {
00110 if (o == null)
00111 setResult(type.typeName());
00112 else {
00113 String result = "byte refIndex; ";
00114 Vector fields = type.getFields();
00115 for (int i = 0; i < fields.size(); i++) {
00116 ((Field)fields.elementAt(i)).apply(this,null);
00117 result += (String) getResult();
00118 }
00119 setResult("{ " + result + "}");
00120 }
00121 }
00122 public void caseRef(Ref type, Object o)
00123 {
00124 if (o == null)
00125 setResult(type.typeName());
00126 else {
00127 type.getTargetType().apply(this,null);
00128 String targetTypeName = (String) getResult();
00129 if (targetTypeName == null)
00130 targetTypeName = "object";
00131 setResult(targetTypeName + "&");
00132 }
00133 }
00134 public void defaultCase(Object obj) {
00135 throw new RuntimeException("Construct not handled: " + obj);
00136 }
00137 }