001 package plugins.JavaRolePluginModule; 002 003 public class ParseTree { 004 private Entity root; 005 private Entity current; 006 private boolean hasSyntaxError; 007 008 public ParseTree(String file) { 009 hasSyntaxError=false; 010 hasSyntaxError=generateParseTree(file); 011 } 012 013 public boolean hasSyntaxError() { 014 return hasSyntaxError; 015 } 016 017 private boolean generateParseTree(String file) { 018 Entity currentParent = new Entity(file); 019 currentParent.type = Entity.FILE; 020 currentParent.startPos = 0; 021 022 Parser parser = new Parser(file); 023 024 current=parser.getNextEntity(); 025 026 while(current.type!=Entity.ENDOFFILE && 027 current.type!=Entity.SYNTAXERROR) { 028 029 //RMTester.print(current); 030 031 currentParent.addChild(current); 032 033 if(current.type==Entity.CLASSBODY) { 034 currentParent=current; 035 }else if(current.type==Entity.ENDOFCLASSBODY) { 036 if(currentParent.type==Entity.CLASSBODY) { 037 currentParent=currentParent.getParent(); 038 } else { 039 return true; 040 } 041 } 042 043 current=parser.getNextEntity(); 044 045 } 046 047 048 if(current.type==Entity.SYNTAXERROR) { 049 return true; 050 } 051 052 if(current.type==Entity.ENDOFFILE && currentParent.type==Entity.FILE) { 053 currentParent.addChild(current); 054 root=currentParent; 055 return false; 056 057 }else{ 058 return true; 059 } 060 } 061 062 063 public Entity getFirstChildOfFile() { 064 current=root.getFirstChild(); 065 return current; 066 } 067 068 public Entity getFirstChild() { 069 if(current!=null) { 070 current=current.getFirstChild(); 071 } 072 return current; 073 } 074 075 public Entity getNext() { 076 if(current==null) { 077 return null; 078 }else if(current.type==Entity.CLASSBODY || current.type==Entity.FILE) { 079 current=current.getFirstChild(); // has always at least one child 080 }else if(current.type==Entity.ENDOFFILE) { 081 current=null; 082 }else if(current.type==Entity.ENDOFCLASSBODY) { 083 current=current.getParent().getParent().getNextChild(); 084 }else{ 085 current=current.getParent().getNextChild(); 086 } 087 return current; 088 } 089 090 /** */ 091 public Entity getPrevious() { 092 if(current==null || current.type==Entity.FILE) { 093 current=null; 094 return current; 095 } 096 097 Entity parent=current.getParent(); 098 if(parent.isAtFirstChild()) { 099 current=parent; 100 return current; 101 } 102 103 current=parent.getPreviousChild(); 104 if(current.type==Entity.CLASSBODY) { 105 current=current.getLastChild(); 106 return current; 107 } else { 108 return current; 109 } 110 } 111 112 public Entity getParent() { 113 current=current.getParent(); 114 return current; 115 } 116 117 /** This method skips the first instance of a class 118 * or method and the body. 119 * If the next entity is different from *HEAD and *BODY 120 * this entity is returned. 121 * If the current entity is *HEAD the method skips the body 122 * and returns the entity after the body. 123 * If the current entity is *BODY the entity after the body 124 * is returned. 125 */ 126 public Entity getNextSkipHeadAndBody() { 127 if(current!=null) { 128 if(current.type==Entity.CLASSBODY || 129 current.type==Entity.SEMICOLON) { 130 Entity parent=current.getParent(); 131 current=parent.getNextChild(); 132 } else if(current.type==Entity.CLASSHEAD || 133 current.type==Entity.METHODHEAD) { 134 Entity parent=current.getParent(); 135 parent.getNextChild(); // body or semicolon 136 current=parent.getNextChild(); 137 } else { 138 getNext(); 139 if(current.type==Entity.CLASSHEAD || 140 current.type==Entity.METHODHEAD) { 141 Entity parent=current.getParent(); 142 parent.getNextChild(); // body or semicolon 143 current=parent.getNextChild(); 144 } 145 } 146 } 147 148 return current; 149 } 150 151 152 public Entity removeAndGetPrevious() { 153 Entity parent = current.getParent(); 154 current=parent.removeCurrentChildAndGetPrevious(); 155 if(current==null) { 156 current=parent; 157 } 158 return current; 159 } 160 161 public Entity removeAndGetNext() { 162 Entity parent = current.getParent(); 163 //System.out.print("Parent in removeAGN:"); 164 //RMTester.print(parent); 165 current=parent.removeCurrentChildAndGetNext(); 166 if(current==null) { 167 current=parent.getNextChild(); 168 } 169 return current; 170 } 171 172 public void insertBefore(Entity newEntity) { 173 Entity parent=current.getParent(); 174 parent.insertChildBefore(newEntity); 175 } 176 177 /* 178 public void insertAfter(Entity newEntity) { 179 Entity parent=current.getParent(); 180 parent.insertChildAfter(newEntity); 181 }*/ 182 183 184 185 186 public Entity getMatching(Entity matchingEntity) { 187 Entity parent=current.getParent(); 188 Entity entity=parent.getFirstChild(); 189 String temp1 = null, temp2 = null; 190 while(entity!=null) { 191 temp1 = entity.getContent(); 192 temp2 = matchingEntity.getContent(); 193 if(temp1.equals(temp2)) { 194 //System.out.println("Found match: "+'"'+temp1+'"'+" == "+'"'+temp2+'"'); 195 current=entity; 196 return current; 197 } 198 //System.out.println('"'+temp1+'"'+" != "+'"'+temp2+'"'); 199 entity=parent.getNextChild(); 200 } 201 202 /* No match */ 203 //System.out.println("Found no match for: "+'"'+temp1+'"'); 204 205 return null; 206 } 207 208 public String toString() { 209 StringBuffer sb=new StringBuffer(); 210 getFirstChildOfFile(); 211 while(current!=null) { 212 sb.append(current.getContentAndWhitespace()); 213 getNext(); 214 } 215 return sb.toString(); 216 } 217 218 219 } 220 221 222 223 224 225