1 package Analysis.SSJava;
3 import java.util.HashSet;
6 import IR.ClassDescriptor;
8 import IR.FieldDescriptor;
9 import IR.VarDescriptor;
11 public class FlowNode {
13 // descriptor tuple is a unique identifier of the flow node
14 protected NTuple<Descriptor> descTuple;
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;
20 // set true if this node stores a return value
21 private boolean isReturn;
23 private boolean isDeclarationNode = false;
25 private boolean isIntermediate;
27 private CompositeLocation compLoc;
29 private boolean isSkeleton;
31 private boolean isFormHolder = false;
33 private NTuple<Descriptor> baseTuple;
35 public boolean isIntermediate() {
36 return isIntermediate;
39 public void setIntermediate(boolean isIntermediate) {
40 this.isIntermediate = isIntermediate;
43 public void setFormHolder(boolean in) {
47 public boolean isFromHolder() {
51 public void setBaseTuple(NTuple<Descriptor> in) {
55 public NTuple<Descriptor> getBaseTuple() {
59 public Set<FlowNode> getFieldNodeSet() {
63 public FlowNode(NTuple<Descriptor> tuple) {
65 this.isSkeleton = false;
66 this.isIntermediate = false;
68 NTuple<Descriptor> base = null;
69 Descriptor desc = null;
70 if (tuple.size() > 1) {
71 base = tuple.subList(0, tuple.size() - 1);
72 desc = tuple.get(tuple.size() - 1);
76 fieldNodeSet = new HashSet<FlowNode>();
77 descTuple = new NTuple<Descriptor>();
79 descTuple.addAll(base);
87 public void setCompositeLocation(CompositeLocation in) {
88 System.out.println("$$$set compLoc=" + in);
92 public CompositeLocation getCompositeLocation() {
96 public void addFieldNode(FlowNode node) {
97 fieldNodeSet.add(node);
100 public NTuple<Descriptor> getDescTuple() {
104 public Descriptor getOwnDescriptor() {
105 return descTuple.get(descTuple.size() - 1);
108 public boolean isPrimitiveType() {
109 Descriptor desc = descTuple.get(descTuple.size() - 1);
110 if (desc instanceof VarDescriptor) {
111 return ((VarDescriptor) desc).getType().isPrimitive();
112 } else if (desc instanceof FieldDescriptor) {
113 return ((FieldDescriptor) desc).getType().isPrimitive();
118 public String toString() {
119 String rtr = "[FlowNode]:";
123 rtr += ":" + descTuple;
127 public int hashCode() {
128 return 7 + descTuple.hashCode();
131 public boolean equals(Object obj) {
133 if (obj instanceof FlowNode) {
134 FlowNode in = (FlowNode) obj;
135 if (descTuple.equals(in.getDescTuple())) {
144 public String getID() {
146 for (int i = 0; i < descTuple.size(); i++) {
147 id += descTuple.get(i).getSymbol();
152 public String getPrettyID() {
154 String property = "";
155 for (int i = 0; i < descTuple.size(); i++) {
159 id += descTuple.get(i).getSymbol();
163 if (compLoc != null) {
171 // if (isSkeleton()) {
175 if (property.length() > 0) {
176 property = " [" + property + "]";
179 return id + property;
182 public void setDeclarationNode() {
183 isDeclarationNode = true;
186 public boolean isDeclaratonNode() {
187 return isDeclarationNode;
190 public NTuple<Descriptor> getCurrentDescTuple() {
192 if (compLoc == null) {
196 NTuple<Descriptor> curDescTuple = new NTuple<Descriptor>();
197 for (int i = 0; i < compLoc.getSize(); i++) {
198 Location locElement = compLoc.get(i);
199 curDescTuple.add(locElement.getLocDescriptor());
204 public boolean isSkeleton() {
208 public void setSkeleton(boolean isSkeleton) {
209 this.isSkeleton = isSkeleton;