51f1b08db11a64073901e5601b92bef8b83542e2
[IRC.git] / Robust / src / Analysis / SSJava / FlowNode.java
1 package Analysis.SSJava;
2
3 import java.util.HashSet;
4 import java.util.Iterator;
5 import java.util.Set;
6
7 import IR.Descriptor;
8 import IR.FieldDescriptor;
9 import IR.VarDescriptor;
10
11 public class FlowNode {
12
13   // descriptor tuple is a unique identifier of the flow node
14   private NTuple<Descriptor> descTuple;
15
16   // if the infer node represents the base type of field access,
17   // this set contains fields of the base type
18   private Set<FlowNode> fieldNodeSet;
19
20   // set true if this node stores a return value
21   private boolean isReturn;
22
23   private boolean isDeclarationNode = false;
24
25   private boolean isIntermediate;
26
27   private CompositeLocation compLoc;
28
29   private boolean isSkeleton;
30
31   public boolean isIntermediate() {
32     return isIntermediate;
33   }
34
35   public void setIntermediate(boolean isIntermediate) {
36     this.isIntermediate = isIntermediate;
37   }
38
39   public Set<FlowNode> getFieldNodeSet() {
40     return fieldNodeSet;
41   }
42
43   public FlowNode(NTuple<Descriptor> tuple) {
44
45     this.isSkeleton = false;
46     this.isIntermediate = false;
47
48     NTuple<Descriptor> base = null;
49     Descriptor desc = null;
50     if (tuple.size() > 1) {
51       base = tuple.subList(0, tuple.size() - 1);
52       desc = tuple.get(tuple.size() - 1);
53     } else {
54       base = tuple;
55     }
56     fieldNodeSet = new HashSet<FlowNode>();
57     descTuple = new NTuple<Descriptor>();
58     if (base != null) {
59       descTuple.addAll(base);
60     }
61     if (desc != null) {
62       descTuple.add(desc);
63     }
64
65   }
66
67   public void setCompositeLocation(CompositeLocation in) {
68     compLoc = in;
69   }
70
71   public CompositeLocation getCompositeLocation() {
72     return compLoc;
73   }
74
75   public void addFieldNode(FlowNode node) {
76     fieldNodeSet.add(node);
77   }
78
79   public NTuple<Descriptor> getDescTuple() {
80     return descTuple;
81   }
82
83   public Descriptor getOwnDescriptor() {
84     return descTuple.get(descTuple.size() - 1);
85   }
86
87   public boolean isReturn() {
88     return isReturn;
89   }
90
91   public void setReturn(boolean isReturn) {
92     this.isReturn = isReturn;
93   }
94
95   public boolean isPrimitiveType() {
96     Descriptor desc = descTuple.get(descTuple.size() - 1);
97     if (desc instanceof VarDescriptor) {
98       return ((VarDescriptor) desc).getType().isPrimitive();
99     } else if (desc instanceof FieldDescriptor) {
100       return ((FieldDescriptor) desc).getType().isPrimitive();
101     }
102     return false;
103   }
104
105   public String toString() {
106     String rtr = "[FlowNode]:";
107     if (isSkeleton()) {
108       rtr += "SKELETON:";
109     }
110     rtr += ":" + descTuple;
111     return rtr;
112   }
113
114 //  public Iterator<FlowEdge> iteratorOfOutEdges() {
115 //    return outEdgeSet.iterator();
116 //  }
117 //
118 //  public void addOutEdge(FlowEdge out) {
119 //    outEdgeSet.add(out);
120 //  }
121 //
122 //  public Set<FlowEdge> getOutEdgeSet() {
123 //    return outEdgeSet;
124 //  }
125
126   public int hashCode() {
127     return 7 + descTuple.hashCode();
128   }
129
130   public boolean equals(Object obj) {
131
132     if (obj instanceof FlowNode) {
133       FlowNode in = (FlowNode) obj;
134       if (descTuple.equals(in.getDescTuple())) {
135         return true;
136       }
137     }
138
139     return false;
140
141   }
142
143   public String getID() {
144     String id = "";
145     for (int i = 0; i < descTuple.size(); i++) {
146       id += descTuple.get(i).getSymbol();
147     }
148     return id;
149   }
150
151   public String getPrettyID() {
152     String id = "<";
153     String property = "";
154     for (int i = 0; i < descTuple.size(); i++) {
155       if (i != 0) {
156         id += ",";
157       }
158       id += descTuple.get(i).getSymbol();
159     }
160     id += ">";
161
162     if (compLoc != null) {
163       id += " " + compLoc;
164     }
165
166     if (isReturn()) {
167       property += "R";
168     }
169
170     if (isSkeleton()) {
171       property += "S";
172     }
173
174     if (property.length() > 0) {
175       property = " [" + property + "]";
176     }
177
178     return id + property;
179   }
180
181   public void setDeclarationNode() {
182     isDeclarationNode = true;
183   }
184
185   public boolean isDeclaratonNode() {
186     return isDeclarationNode;
187   }
188
189   public NTuple<Descriptor> getCurrentDescTuple() {
190
191     if (compLoc == null) {
192       return descTuple;
193     }
194
195     NTuple<Descriptor> curDescTuple = new NTuple<Descriptor>();
196     for (int i = 0; i < compLoc.getSize(); i++) {
197       Location locElement = compLoc.get(i);
198       curDescTuple.add(locElement.getLocDescriptor());
199     }
200     return curDescTuple;
201   }
202
203   public boolean isSkeleton() {
204     return isSkeleton;
205   }
206
207   public void setSkeleton(boolean isSkeleton) {
208     this.isSkeleton = isSkeleton;
209   }
210
211 }