00001 package edu.ksu.cis.bandera.annotation;
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.jjjc.node.*;
00036 import edu.ksu.cis.bandera.jjjc.util.*;
00037 import edu.ksu.cis.bandera.jjjc.symboltable.*;
00038 import ca.mcgill.sable.soot.*;
00039 import ca.mcgill.sable.soot.jimple.*;
00040 import ca.mcgill.sable.util.*;
00041 import java.util.*;
00042 public class FieldDeclarationAnnotation extends SpecializedAnnotation implements java.lang.Comparable {
00043 private SootField sf;
00044 private Field f;
00045
00046
00047
00048
00049 public FieldDeclarationAnnotation(edu.ksu.cis.bandera.jjjc.node.Node node) {
00050 super(node);
00051 }
00052 public void apply(Switch sw)
00053 {
00054 ((AnnotationSwitch) sw).caseFieldDeclarationAnnotation(this);
00055 }
00056
00057
00058
00059
00060 public Object clone() {
00061 FieldDeclarationAnnotation result = new FieldDeclarationAnnotation((Node) node.clone());
00062
00063
00064
00065
00066
00067
00068
00069 result.sf = sf;
00070 result.f = f;
00071 return result;
00072 }
00073
00074
00075
00076
00077
00078 public int compareTo(Object o) {
00079 if (o instanceof FieldDeclarationAnnotation) {
00080 FieldDeclarationAnnotation fda = (FieldDeclarationAnnotation) o;
00081 return getField().getName().compareTo(fda.getField().getName());
00082 } else {
00083 return -1;
00084 }
00085 }
00086
00087
00088
00089
00090 public Field getField() {
00091 return f;
00092 }
00093
00094
00095
00096
00097 public SootField getSootField() {
00098 return sf;
00099 }
00100
00101
00102
00103
00104 public Stmt[] getStatements() {
00105 return toArray();
00106 }
00107
00108
00109
00110
00111
00112 public boolean removeStmt(Stmt stmt) {
00113 return remove(stmt);
00114 }
00115
00116
00117
00118
00119
00120 public boolean removeStmtByMark(Stmt stmt) {
00121 return removeByMark(stmt);
00122 }
00123
00124
00125
00126
00127
00128
00129 public boolean replaceStmt(Stmt oldStmt, Stmt newStmt) {
00130 return replace(oldStmt, newStmt);
00131 }
00132
00133
00134
00135
00136
00137
00138 public boolean replaceStmtByMark(Stmt oldStmt, Stmt newStmt) {
00139 return replaceByMark(oldStmt, newStmt);
00140 }
00141
00142
00143
00144
00145 public void setField(Field field) {
00146 f = field;
00147 }
00148
00149
00150
00151
00152 public void setSootField(SootField sootField) {
00153 sf = sootField;
00154 }
00155
00156
00157
00158
00159 public String toString() {
00160 AFieldDeclaration node = (AFieldDeclaration) this.node;
00161
00162 String result = node.getType().toString();
00163
00164 Object[] modifiers = node.getModifier().toArray();
00165 for (int i = modifiers.length - 1; i >= 0; i--) {
00166 result = modifiers[i].toString() + result;
00167 }
00168
00169 Object[] fields = node.getVariableDeclarator().toArray();
00170
00171 for (int i = 0; i < fields.length; i++) {
00172 if (fields[i] instanceof AAssignedVariableDeclarator) {
00173 String name = ((AAssignedVariableDeclarator) fields[i]).getVariableDeclaratorId().toString().trim();
00174
00175 if (name.equals(sf.getName().trim())) {
00176 result += fields[i].toString().trim();
00177 break;
00178 }
00179 } else {
00180 String name = ((AIdVariableDeclarator) fields[i]).getVariableDeclaratorId().toString().trim();
00181
00182 if (name.equals(sf.getName().trim())) {
00183 result += name;
00184 break;
00185 }
00186 }
00187 }
00188
00189 return result;
00190 }
00191 }