1 11 package org.eclipse.jdt.internal.core.jdom; 12 13 import org.eclipse.jdt.core.Flags; 14 import org.eclipse.jdt.core.compiler.CharOperation; 15 import org.eclipse.jdt.core.jdom.*; 16 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; 17 import org.eclipse.jdt.internal.core.util.CharArrayBuffer; 18 27 abstract class DOMMember extends DOMNode implements IDOMMember { 28 29 33 protected int fFlags= 0; 34 35 39 protected String fComment= null; 40 41 47 protected int[] fCommentRange; 48 49 50 55 protected char[] fModifiers= null; 56 57 63 protected int[] fModifierRange; 64 65 68 DOMMember() { 69 } 71 101 DOMMember(char[] document, int[] sourceRange, String name, int[] nameRange, int[] commentRange, int flags, int[] modifierRange) { 102 super(document, sourceRange, name, nameRange); 103 fFlags= flags; 104 fComment= null; 105 fCommentRange= commentRange; 106 fModifierRange= modifierRange; 107 setHasComment(commentRange[0] >= 0); 108 } 109 124 protected void appendFragmentedContents(CharArrayBuffer buffer) { 125 if (isDetailed()) { 126 appendMemberHeaderFragment(buffer); 127 appendMemberDeclarationContents(buffer); 128 appendMemberBodyContents(buffer); 129 } else { 130 appendSimpleContents(buffer); 131 } 132 } 133 137 protected abstract void appendMemberBodyContents(CharArrayBuffer buffer); 138 143 protected abstract void appendMemberDeclarationContents(CharArrayBuffer buffer); 144 148 protected void appendMemberHeaderFragment(CharArrayBuffer buffer) { 149 150 int spaceStart, spaceEnd; 151 152 if (hasComment()) { 154 spaceStart= fSourceRange[0]; 155 spaceEnd= fCommentRange[0]; 156 if (spaceEnd > 0) { 157 buffer.append(fDocument, spaceStart, spaceEnd - spaceStart); 158 } 159 } 160 161 String fragment= getComment(); 162 if (fragment != null) { 163 buffer.append(fragment); 164 } 165 166 if (fCommentRange[1] >= 0) { 167 spaceStart= fCommentRange[1] + 1; 168 } else { 169 spaceStart= fSourceRange[0]; 170 } 171 if (fModifierRange[0] >= 0) { 172 spaceEnd= fModifierRange[0] - 1; 173 } else { 174 spaceEnd= getMemberDeclarationStartPosition() - 1; 175 } 176 177 if (spaceEnd >= spaceStart) { 178 buffer.append(fDocument, spaceStart, spaceEnd + 1 - spaceStart); 179 } 180 buffer.append(getModifiersText()); 181 182 } 183 189 protected abstract void appendSimpleContents(CharArrayBuffer buffer); 190 194 protected String [] appendString(String [] list, String element) { 195 String [] copy= new String [list.length + 1]; 196 System.arraycopy(list, 0, copy, 0, list.length); 197 copy[list.length]= element; 198 return copy; 199 } 200 206 protected char[] generateFlags() { 207 char[] flags= Flags.toString(getFlags()).toCharArray(); 208 if (flags.length == 0) { 209 return flags; 210 } else { 211 return CharOperation.concat(flags, new char[] {' '}); 212 } 213 } 214 217 public String getComment() { 218 becomeDetailed(); 219 if (hasComment()) { 220 if (fComment != null) { 221 return fComment; 222 } else { 223 return new String (fDocument, fCommentRange[0], fCommentRange[1] + 1 - fCommentRange[0]); 224 } 225 } else { 226 return null; 227 } 228 } 229 232 public int getFlags() { 233 return fFlags; 234 } 235 239 protected abstract int getMemberDeclarationStartPosition(); 240 245 protected char[] getModifiersText() { 246 if (fModifiers == null) { 247 if (fModifierRange[0] < 0) { 248 return null; 249 } else { 250 return CharOperation.subarray(fDocument, fModifierRange[0], fModifierRange[1] + 1); 251 } 252 } else { 253 return fModifiers; 254 } 255 } 256 259 protected boolean hasBody() { 260 return getMask(MASK_HAS_BODY); 261 } 262 265 protected boolean hasComment() { 266 return getMask(MASK_HAS_COMMENT); 267 } 268 271 protected void offset(int offset) { 272 super.offset(offset); 273 offsetRange(fCommentRange, offset); 274 offsetRange(fModifierRange, offset); 275 } 276 279 public void setComment(String comment) { 280 becomeDetailed(); 281 fComment= comment; 282 fragment(); 283 setHasComment(comment != null); 284 285 if (comment != null && comment.indexOf("@deprecated") >= 0) { fFlags= fFlags | ClassFileConstants.AccDeprecated; 287 return; 288 } 289 fFlags= fFlags & (~ClassFileConstants.AccDeprecated); 290 } 291 294 public void setFlags(int flags) { 295 becomeDetailed(); 296 if (Flags.isDeprecated(fFlags)) { 297 fFlags= flags | ClassFileConstants.AccDeprecated; 298 } else { 299 fFlags= flags & (~ClassFileConstants.AccDeprecated); 300 } 301 fragment(); 302 fModifiers= generateFlags(); 303 } 304 308 protected void setHasBody(boolean hasBody) { 309 setMask(MASK_HAS_BODY, hasBody); 310 } 311 315 protected void setHasComment(boolean hasComment) { 316 setMask(MASK_HAS_COMMENT, hasComment); 317 } 318 326 protected void setStartPosition(int start) { 327 if (fCommentRange[0] >= 0) { 328 fCommentRange[0]= start; 329 } 330 super.setStartPosition(start); 331 } 332 335 protected void shareContents(DOMNode node) { 336 super.shareContents(node); 337 DOMMember member= (DOMMember)node; 338 fComment= member.fComment; 339 fCommentRange= rangeCopy(member.fCommentRange); 340 fFlags= member.fFlags; 341 fModifiers= member.fModifiers; 342 fModifierRange= rangeCopy(member.fModifierRange); 343 } 344 } 345 | Popular Tags |