X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/DOMField.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/DOMField.java index a1e3280..f40cff6 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/DOMField.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/DOMField.java @@ -24,596 +24,682 @@ import net.sourceforge.phpdt.internal.core.util.CharArrayOps; /** * DOMField provides an implementation of IDOMField. - * + * * @see IDOMField * @see DOMNode */ class DOMField extends DOMMember implements IDOMField { - + /** - * Contains the type of the field when the type - * has been altered from the contents in the - * document, otherwise null. + * Contains the type of the field when the type has been altered from the + * contents in the document, otherwise null. */ protected String fType; /** - * The original inclusive source range of the - * field's type in the document. + * The original inclusive source range of the field's type in the document. */ protected int[] fTypeRange; - + /** - * The contents of the initializer when the - * initializer has been altered from the - * original state in the document, otherwise - * null. + * The contents of the initializer when the initializer has been altered + * from the original state in the document, otherwise null. */ protected String fInitializer; /** - * The original inclusive source range of the - * initializer in the document. + * The original inclusive source range of the initializer in the document. */ protected int[] fInitializerRange; -/** - * Constructs an empty field node. - */ -DOMField() { -} -/** - * Creates a new detailed FIELD document fragment on the given range of the document. - * - * @param document - the document containing this node's original contents - * @param sourceRange - a two element array of integers describing the - * entire inclusive source range of this node within its document. - * Contents start on and include the character at the first position. - * Contents end on and include the character at the last position. - * An array of -1's indicates this node's contents do not exist - * in the document. - * @param name - the identifier portion of the name of this field, - * corresponding to VariableDeclaratorId (JLS 8.3). - * @param nameRange - a two element array of integers describing the - * entire inclusive source range of this node's name within its document, - * including any array qualifiers that might follow the name. - * @param commentRange - a two element array describing the comments that precede - * the member declaration. The first matches the start of this node's - * sourceRange, and the second is the new-line or first non-whitespace - * character following the last comment. If no comments are present, - * this array contains two -1's. - * @param flags - an integer representing the modifiers for this member. The - * integer can be analyzed with net.sourceforge.phpdt.core.Flags - * @param modifierRange - a two element array describing the location of - * modifiers for this member within its source range. The first integer - * is the first character of the first modifier for this member, and - * the second integer is the last whitespace character preceeding the - * next part of this member declaration. If there are no modifiers present - * in this node's source code (that is, package default visibility), this array - * contains two -1's. - * @param typeRange- a two element array describing the location of the - * typeName in the document - the positions of the first and last characters - * of the typeName. - * @param type - the type of the field, in normalized form, as defined in - * Type in Field Declaration (JLS 8.3) - * @param hasInitializer - true if this field declaration includes an initializer, - * otherwise false - * @param initRange - a two element array describing the location of the initializer - * in the declaration. The first integer is the position of the character - * following the equals sign, and the position of the last character is the last - * in the initializer. If this field has no initializer, this array contains - * two -1's. - * @param isVariableDeclarator - true if the field is a seconday variable declarator - * for a previous field declaration. - */ -DOMField(char[] document, int[] sourceRange, String name, int[] nameRange, int[] commentRange, int flags, int[] modifierRange, int[] typeRange, String type, boolean hasInitializer, int[] initRange, boolean isVariableDeclarator) { - super(document, sourceRange, name, nameRange, commentRange, flags, modifierRange); + /** + * Constructs an empty field node. + */ + DOMField() { + } - fType= type; - fTypeRange= typeRange; - setHasInitializer(hasInitializer); - fInitializerRange= initRange; - setIsVariableDeclarator(isVariableDeclarator); - setMask(MASK_DETAILED_SOURCE_INDEXES, true); + /** + * Creates a new detailed FIELD document fragment on the given range of the + * document. + * + * @param document - + * the document containing this node's original contents + * @param sourceRange - + * a two element array of integers describing the entire + * inclusive source range of this node within its document. + * Contents start on and include the character at the first + * position. Contents end on and include the character at the + * last position. An array of -1's indicates this node's contents + * do not exist in the document. + * @param name - + * the identifier portion of the name of this field, + * corresponding to VariableDeclaratorId (JLS 8.3). + * @param nameRange - + * a two element array of integers describing the entire + * inclusive source range of this node's name within its + * document, including any array qualifiers that might follow the + * name. + * @param commentRange - + * a two element array describing the comments that precede the + * member declaration. The first matches the start of this node's + * sourceRange, and the second is the new-line or first + * non-whitespace character following the last comment. If no + * comments are present, this array contains two -1's. + * @param flags - + * an integer representing the modifiers for this member. The + * integer can be analyzed with net.sourceforge.phpdt.core.Flags + * @param modifierRange - + * a two element array describing the location of modifiers for + * this member within its source range. The first integer is the + * first character of the first modifier for this member, and the + * second integer is the last whitespace character preceeding the + * next part of this member declaration. If there are no + * modifiers present in this node's source code (that is, package + * default visibility), this array contains two -1's. + * @param typeRange- + * a two element array describing the location of the typeName in + * the document - the positions of the first and last characters + * of the typeName. + * @param type - + * the type of the field, in normalized form, as defined in Type + * in Field Declaration (JLS 8.3) + * @param hasInitializer - + * true if this field declaration includes an initializer, + * otherwise false + * @param initRange - + * a two element array describing the location of the initializer + * in the declaration. The first integer is the position of the + * character following the equals sign, and the position of the + * last character is the last in the initializer. If this field + * has no initializer, this array contains two -1's. + * @param isVariableDeclarator - + * true if the field is a seconday variable declarator for a + * previous field declaration. + */ + DOMField(char[] document, int[] sourceRange, String name, int[] nameRange, + int[] commentRange, int flags, int[] modifierRange, + int[] typeRange, String type, boolean hasInitializer, + int[] initRange, boolean isVariableDeclarator) { + super(document, sourceRange, name, nameRange, commentRange, flags, + modifierRange); -} -/** - * Creates a new simple FIELD document fragment on the given range of the document. - * - * @param document - the document containing this node's original contents - * @param sourceRange - a two element array of integers describing the - * entire inclusive source range of this node within its document. - * Contents start on and include the character at the first position. - * Contents end on and include the character at the last position. - * An array of -1's indicates this node's contents do not exist - * in the document. - * @param name - the identifier portion of the name of this field, - * corresponding to VariableDeclaratorId (JLS 8.3). - * @param nameRange - a two element array of integers describing the - * entire inclusive source range of this node's name within its document, - * including any array qualifiers that might follow the name. - * @param flags - an integer representing the modifiers for this member. The - * integer can be analyzed with net.sourceforge.phpdt.core.Flags - * @param type - the type of the field, in normalized form, as defined in - * Type in Field Declaration (JLS 8.3) - * @param isVariableDeclarator - true if the field is a seconday variable declarator - * for a previous field declaration. - */ -DOMField(char[] document, int[] sourceRange, String name, int[] nameRange, int flags, String type, boolean isVariableDeclarator) { - this(document, sourceRange, name, nameRange, new int[] {-1, -1}, flags, new int[] {-1, -1}, new int[] {-1, -1}, type, false, new int[] {-1, -1}, isVariableDeclarator); - setMask(MASK_DETAILED_SOURCE_INDEXES, false); -} -/** - * Appends this member's body contents to the given CharArrayBuffer. - * Body contents include the member body and any trailing whitespace. - * - *

A field does not have a body. - * - * @see DOMMember#appendMemberBodyContents(CharArrayBuffer) - */ -protected void appendMemberBodyContents(CharArrayBuffer buffer) {} -/** - * @see DOMMember#appendMemberDeclarationContents(CharArrayBuffer) - */ -protected void appendMemberDeclarationContents(CharArrayBuffer buffer) { - - if (isVariableDeclarator()) { - buffer.append(fDocument, fSourceRange[0], fNameRange[0] - fSourceRange[0]); - } else { - buffer - .append(getTypeContents()) - .append(fDocument, fTypeRange[1] + 1, fNameRange[0] - fTypeRange[1] - 1); - } - - buffer.append(getNameContents()); - if (hasInitializer()) { - if (fInitializerRange[0] < 0) { - buffer - .append('=') - .append(fInitializer) - .append(fDocument, fNameRange[1] + 1, fSourceRange[1] - fNameRange[1]); + fType = type; + fTypeRange = typeRange; + setHasInitializer(hasInitializer); + fInitializerRange = initRange; + setIsVariableDeclarator(isVariableDeclarator); + setMask(MASK_DETAILED_SOURCE_INDEXES, true); + + } + + /** + * Creates a new simple FIELD document fragment on the given range of the + * document. + * + * @param document - + * the document containing this node's original contents + * @param sourceRange - + * a two element array of integers describing the entire + * inclusive source range of this node within its document. + * Contents start on and include the character at the first + * position. Contents end on and include the character at the + * last position. An array of -1's indicates this node's contents + * do not exist in the document. + * @param name - + * the identifier portion of the name of this field, + * corresponding to VariableDeclaratorId (JLS 8.3). + * @param nameRange - + * a two element array of integers describing the entire + * inclusive source range of this node's name within its + * document, including any array qualifiers that might follow the + * name. + * @param flags - + * an integer representing the modifiers for this member. The + * integer can be analyzed with net.sourceforge.phpdt.core.Flags + * @param type - + * the type of the field, in normalized form, as defined in Type + * in Field Declaration (JLS 8.3) + * @param isVariableDeclarator - + * true if the field is a seconday variable declarator for a + * previous field declaration. + */ + DOMField(char[] document, int[] sourceRange, String name, int[] nameRange, + int flags, String type, boolean isVariableDeclarator) { + this(document, sourceRange, name, nameRange, new int[] { -1, -1 }, + flags, new int[] { -1, -1 }, new int[] { -1, -1 }, type, false, + new int[] { -1, -1 }, isVariableDeclarator); + setMask(MASK_DETAILED_SOURCE_INDEXES, false); + } + + /** + * Appends this member's body contents to the given CharArrayBuffer. Body + * contents include the member body and any trailing whitespace. + * + *

+ * A field does not have a body. + * + * @see DOMMember#appendMemberBodyContents(CharArrayBuffer) + */ + protected void appendMemberBodyContents(CharArrayBuffer buffer) { + } + + /** + * @see DOMMember#appendMemberDeclarationContents(CharArrayBuffer) + */ + protected void appendMemberDeclarationContents(CharArrayBuffer buffer) { + + if (isVariableDeclarator()) { + buffer.append(fDocument, fSourceRange[0], fNameRange[0] + - fSourceRange[0]); } else { - buffer - .append(fDocument, fNameRange[1] + 1, fInitializerRange[0] - fNameRange[1] - 1) - .append(getInitializer()) - .append(fDocument, fInitializerRange[1] + 1, fSourceRange[1] - fInitializerRange[1]); + buffer.append(getTypeContents()).append(fDocument, + fTypeRange[1] + 1, fNameRange[0] - fTypeRange[1] - 1); } - } else { - if (fInitializerRange[0] < 0) { - buffer.append(fDocument, fNameRange[1] + 1, fSourceRange[1] - fNameRange[1]); + + buffer.append(getNameContents()); + if (hasInitializer()) { + if (fInitializerRange[0] < 0) { + buffer.append('=').append(fInitializer).append(fDocument, + fNameRange[1] + 1, fSourceRange[1] - fNameRange[1]); + } else { + buffer.append(fDocument, fNameRange[1] + 1, + fInitializerRange[0] - fNameRange[1] - 1).append( + getInitializer()).append(fDocument, + fInitializerRange[1] + 1, + fSourceRange[1] - fInitializerRange[1]); + } } else { - buffer.append(fDocument, fInitializerRange[1] + 1, fSourceRange[1] - fInitializerRange[1]); + if (fInitializerRange[0] < 0) { + buffer.append(fDocument, fNameRange[1] + 1, fSourceRange[1] + - fNameRange[1]); + } else { + buffer.append(fDocument, fInitializerRange[1] + 1, + fSourceRange[1] - fInitializerRange[1]); + } } + } -} -/** - * Appends this member's header contents to the given CharArrayBuffer. - * Header contents include any preceding comments and modifiers. - * - *

If this field is a secondary variable declarator, there is no header. - * - * @see DOMMember#appendMemberHeaderFragment(CharArrayBuffer) - */ -protected void appendMemberHeaderFragment(CharArrayBuffer buffer) { + /** + * Appends this member's header contents to the given CharArrayBuffer. + * Header contents include any preceding comments and modifiers. + * + *

+ * If this field is a secondary variable declarator, there is no header. + * + * @see DOMMember#appendMemberHeaderFragment(CharArrayBuffer) + */ + protected void appendMemberHeaderFragment(CharArrayBuffer buffer) { + + if (isVariableDeclarator()) { + return; + } else { + super.appendMemberHeaderFragment(buffer); + } - if (isVariableDeclarator()) { - return; - } else { - super.appendMemberHeaderFragment(buffer); } -} -/** - * @see DOMMember#appendSimpleContents(CharArrayBuffer) - */ -protected void appendSimpleContents(CharArrayBuffer buffer) { - // append eveything before my name - buffer.append(fDocument, fSourceRange[0], fNameRange[0] - fSourceRange[0]); - // append my name - buffer.append(fName); - // append everything after my name - buffer.append(fDocument, fNameRange[1] + 1, fSourceRange[1] - fNameRange[1]); -} -/** - * Generates detailed source indexes for this node if possible. - * - * @exception DOMException if unable to generate detailed source indexes - * for this node - */ -//protected void becomeDetailed() throws DOMException { -// if (!isDetailed()) { -// if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { -// DOMNode first = getFirstFieldDeclaration(); -// DOMNode last = getLastFieldDeclaration(); -// DOMNode node= first; -// String source= first.getContents(); -// while (node != last) { -// node= node.fNextNode; -// source+=node.getContents(); -// } -// DOMBuilder builder = new DOMBuilder(); -// IDOMField[] details= builder.createFields(source.toCharArray()); -// if (details.length == 0) { -// throw new DOMException(ProjectPrefUtil.bind("dom.cannotDetail")); //$NON-NLS-1$ -// } else { -// node= this; -// for (int i= 0; i < details.length; i++) { -// node.shareContents((DOMNode)details[i]); -// node= node.fNextNode; -// } -// } -// } else { -// super.becomeDetailed(); -// } -// -// } -//} -/** - * @see IDOMNode#clone() - */ -public Object clone() { -// if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { -// return getFactory().createField(new String(getSingleVariableDeclaratorContents())); -// } else { + /** + * @see DOMMember#appendSimpleContents(CharArrayBuffer) + */ + protected void appendSimpleContents(CharArrayBuffer buffer) { + // append eveything before my name + buffer.append(fDocument, fSourceRange[0], fNameRange[0] + - fSourceRange[0]); + // append my name + buffer.append(fName); + // append everything after my name + buffer.append(fDocument, fNameRange[1] + 1, fSourceRange[1] + - fNameRange[1]); + } + + /** + * Generates detailed source indexes for this node if possible. + * + * @exception DOMException + * if unable to generate detailed source indexes for this + * node + */ + // protected void becomeDetailed() throws DOMException { + // if (!isDetailed()) { + // if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { + // DOMNode first = getFirstFieldDeclaration(); + // DOMNode last = getLastFieldDeclaration(); + // DOMNode node= first; + // String source= first.getContents(); + // while (node != last) { + // node= node.fNextNode; + // source+=node.getContents(); + // } + // DOMBuilder builder = new DOMBuilder(); + // IDOMField[] details= builder.createFields(source.toCharArray()); + // if (details.length == 0) { + // throw new DOMException(ProjectPrefUtil.bind("dom.cannotDetail")); + // //$NON-NLS-1$ + // } else { + // node= this; + // for (int i= 0; i < details.length; i++) { + // node.shareContents((DOMNode)details[i]); + // node= node.fNextNode; + // } + // } + // } else { + // super.becomeDetailed(); + // } + // + // } + // } + /** + * @see IDOMNode#clone() + */ + public Object clone() { + // if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { + // return getFactory().createField(new + // String(getSingleVariableDeclaratorContents())); + // } else { return super.clone(); -// } -} -/** - * Expands all variable declarators in this field declaration into - * stand-alone field declarations. - */ -protected void expand() { - if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { - Enumeration siblings= new SiblingEnumeration(getFirstFieldDeclaration()); - DOMField field= (DOMField)siblings.nextElement(); - DOMNode next= field.fNextNode; - while (siblings.hasMoreElements() && (next instanceof DOMField) && (((DOMField)next).isVariableDeclarator())) { + // } + } + + /** + * Expands all variable declarators in this field declaration into + * stand-alone field declarations. + */ + protected void expand() { + if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { + Enumeration siblings = new SiblingEnumeration( + getFirstFieldDeclaration()); + DOMField field = (DOMField) siblings.nextElement(); + DOMNode next = field.fNextNode; + while (siblings.hasMoreElements() && (next instanceof DOMField) + && (((DOMField) next).isVariableDeclarator())) { + field.localizeContents(); + if (field.fParent != null) { + field.fParent.fragment(); + } + field = (DOMField) siblings.nextElement(); + next = field.fNextNode; + } field.localizeContents(); - if (field.fParent != null) { - field.fParent.fragment(); + } + } + + /** + * @see DOMNode#getDetailedNode() + */ + // protected DOMNode getDetailedNode() { + // if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { + // return (DOMNode)getFactory().createField(new + // String(getSingleVariableDeclaratorContents())); + // } else { + // return (DOMNode)getFactory().createField(getContents()); + // } + // } + /** + * Returns the first field document fragment that defines the type for this + * variable declarator. + */ + protected DOMField getFirstFieldDeclaration() { + if (isVariableDeclarator()) { + return ((DOMField) fPreviousNode).getFirstFieldDeclaration(); + } else { + return this; + } + } + + /** + * @see IDOMField#getInitializer() + */ + public String getInitializer() { + becomeDetailed(); + if (hasInitializer()) { + if (fInitializer != null) { + return fInitializer; + } else { + return CharArrayOps.substring(fDocument, fInitializerRange[0], + fInitializerRange[1] + 1 - fInitializerRange[0]); } - field= (DOMField)siblings.nextElement(); - next= field.fNextNode; + } else { + return null; } - field.localizeContents(); } -} -/** - * @see DOMNode#getDetailedNode() - */ -//protected DOMNode getDetailedNode() { -// if (isVariableDeclarator() || hasMultipleVariableDeclarators()) { -// return (DOMNode)getFactory().createField(new String(getSingleVariableDeclaratorContents())); -// } else { -// return (DOMNode)getFactory().createField(getContents()); -// } -//} -/** - * Returns the first field document fragment that defines - * the type for this variable declarator. - */ -protected DOMField getFirstFieldDeclaration() { - if (isVariableDeclarator()) { - return ((DOMField)fPreviousNode).getFirstFieldDeclaration(); - } else { - return this; + + /** + * @see IDOMNode#getJavaElement + */ + public IJavaElement getJavaElement(IJavaElement parent) + throws IllegalArgumentException { + if (parent.getElementType() == IJavaElement.TYPE) { + return ((IType) parent).getField(getName()); + } else { + throw new IllegalArgumentException(Util + .bind("element.illegalParent")); //$NON-NLS-1$ + } } -} -/** - * @see IDOMField#getInitializer() - */ -public String getInitializer() { - becomeDetailed(); - if (hasInitializer()) { - if (fInitializer != null) { - return fInitializer; + + /** + * Returns the last field document fragment in this muli-declarator + * statement. + */ + protected DOMField getLastFieldDeclaration() { + DOMField field = this; + while (field.isVariableDeclarator() + || field.hasMultipleVariableDeclarators()) { + if (field.fNextNode instanceof DOMField + && ((DOMField) field.fNextNode).isVariableDeclarator()) { + field = (DOMField) field.fNextNode; + } else { + break; + } + } + return field; + } + + /** + * @see DOMMember#getMemberDeclarationStartPosition() + */ + protected int getMemberDeclarationStartPosition() { + return fTypeRange[0]; + } + + /** + * @see IDOMNode#getNodeType() + */ + public int getNodeType() { + return IDOMNode.FIELD; + } + + /** + * Returns a String representing this field declaration as a field + * declaration with one variable declarator. + */ + protected char[] getSingleVariableDeclaratorContents() { + + CharArrayBuffer buffer = new CharArrayBuffer(); + DOMField first = getFirstFieldDeclaration(); + if (first.isDetailed()) { + first.appendMemberHeaderFragment(buffer); + buffer.append(getType()); + if (isVariableDeclarator()) { + buffer.append(' '); + } else { + buffer.append(fDocument, fTypeRange[1] + 1, fNameRange[0] + - fTypeRange[1] - 1); + } + } else { + buffer.append(first.fDocument, first.fSourceRange[0], + first.fNameRange[0] - first.fSourceRange[0]); + } + + buffer.append(getName()); + if (hasInitializer()) { + if (fInitializerRange[0] < 0) { + buffer.append('=').append(fInitializer).append(';').append( + Util.LINE_SEPARATOR); + } else { + buffer.append(fDocument, fNameRange[1] + 1, + fInitializerRange[0] - fNameRange[1] - 1).append( + getInitializer()).append(';').append( + Util.LINE_SEPARATOR); + } } else { - return CharArrayOps.substring(fDocument, fInitializerRange[0], fInitializerRange[1] + 1 - fInitializerRange[0]); + buffer.append(';').append(Util.LINE_SEPARATOR); } - } else { - return null; + return buffer.getContents(); } -} -/** - * @see IDOMNode#getJavaElement - */ -public IJavaElement getJavaElement(IJavaElement parent) throws IllegalArgumentException { - if (parent.getElementType() == IJavaElement.TYPE) { - return ((IType)parent).getField(getName()); - } else { - throw new IllegalArgumentException(Util.bind("element.illegalParent")); //$NON-NLS-1$ + + /** + * @see IDOMField#getType() + */ + public String getType() { + return fType; } -} -/** - * Returns the last field document fragment in this muli-declarator statement. - */ -protected DOMField getLastFieldDeclaration() { - DOMField field = this; - while (field.isVariableDeclarator() || field.hasMultipleVariableDeclarators()) { - if (field.fNextNode instanceof DOMField && ((DOMField)field.fNextNode).isVariableDeclarator()) { - field= (DOMField)field.fNextNode; + + /** + * Returns the souce code to be used for this field's type. + */ + protected char[] getTypeContents() { + if (isTypeAltered()) { + return fType.toCharArray(); } else { - break; + return CharArrayOps.subarray(fDocument, fTypeRange[0], + fTypeRange[1] + 1 - fTypeRange[0]); } } - return field; -} -/** - * @see DOMMember#getMemberDeclarationStartPosition() - */ -protected int getMemberDeclarationStartPosition() { - return fTypeRange[0]; -} -/** - * @see IDOMNode#getNodeType() - */ -public int getNodeType() { - return IDOMNode.FIELD; -} -/** - * Returns a String representing this field declaration as a field - * declaration with one variable declarator. - */ -protected char[] getSingleVariableDeclaratorContents() { + /** + * Returns true if this field has an initializer expression, otherwise + * false. + */ + protected boolean hasInitializer() { + return getMask(MASK_FIELD_HAS_INITIALIZER); + } + + /** + * Returns true is this field declarations has more than one variable + * declarator, otherwise false; + */ + protected boolean hasMultipleVariableDeclarators() { + return fNextNode != null && (fNextNode instanceof DOMField) + && ((DOMField) fNextNode).isVariableDeclarator(); + } - CharArrayBuffer buffer= new CharArrayBuffer(); - DOMField first= getFirstFieldDeclaration(); - if (first.isDetailed()) { - first.appendMemberHeaderFragment(buffer); - buffer.append(getType()); + /** + * Inserts the given un-parented node as a sibling of this node, immediately + * before this node. Once inserted, the sibling is only dependent on this + * document fragment. + * + *

+ * When a sibling is inserted before a variable declarator, it must first be + * expanded. + * + * @see IDOMNode#insertSibling(IDOMNode) + */ + public void insertSibling(IDOMNode sibling) + throws IllegalArgumentException, DOMException { if (isVariableDeclarator()) { - buffer.append(' '); + expand(); + } + super.insertSibling(sibling); + } + + /** + * Returns true if this field's type has been altered from the original + * document contents. + */ + protected boolean isTypeAltered() { + return getMask(MASK_FIELD_TYPE_ALTERED); + } + + /** + * Returns true if this field is declared as a secondary variable declarator + * for a previous field declaration. + */ + protected boolean isVariableDeclarator() { + return getMask(MASK_FIELD_IS_VARIABLE_DECLARATOR); + } + + /** + * @see DOMNode + */ + protected DOMNode newDOMNode() { + return new DOMField(); + } + + /** + * Normalizes this DOMNode's end position. + */ + void normalizeEndPosition(ILineStartFinder finder, DOMNode next) { + if (next == null) { + // this node's end position includes all of the characters up + // to the end of the enclosing node + DOMNode parent = (DOMNode) getParent(); + if (parent == null || parent instanceof DOMCompilationUnit) { + setSourceRangeEnd(fDocument.length - 1); + } else { + // parent is a type + int temp = ((DOMType) parent).getCloseBodyPosition() - 1; + setSourceRangeEnd(temp); + fInsertionPosition = Math.max(finder.getLineStart(temp + 1), + getEndPosition()); + } } else { - buffer.append(fDocument, fTypeRange[1] + 1, fNameRange[0] - fTypeRange[1] - 1); + // this node's end position is just before the start of the next + // node + // unless the next node is a field that is declared along with this + // one + int temp = next.getStartPosition() - 1; + fInsertionPosition = Math.max(finder.getLineStart(temp + 1), + getEndPosition()); + + next.normalizeStartPosition(getEndPosition(), finder); + if (next instanceof DOMField) { + DOMField field = (DOMField) next; + if (field.isVariableDeclarator() + && fTypeRange[0] == field.fTypeRange[0]) + return; + } + setSourceRangeEnd(next.getStartPosition() - 1); } - } else { - buffer.append(first.fDocument, first.fSourceRange[0], first.fNameRange[0] - first.fSourceRange[0]); - } - - buffer.append(getName()); - if (hasInitializer()) { - if (fInitializerRange[0] < 0) { - buffer - .append('=') - .append(fInitializer) - .append(';') - .append(Util.LINE_SEPARATOR); + } + + /** + * Normalizes this DOMNode's start position. + */ + void normalizeStartPosition(int endPosition, ILineStartFinder finder) { + if (isVariableDeclarator()) { + // start position is end of last element + setStartPosition(fPreviousNode.getEndPosition() + 1); } else { - buffer - .append(fDocument, fNameRange[1] + 1, fInitializerRange[0] - fNameRange[1] - 1) - .append(getInitializer()) - .append(';') - .append(Util.LINE_SEPARATOR); + super.normalizeStartPosition(endPosition, finder); } - } else { - buffer.append(';').append(Util.LINE_SEPARATOR); } - return buffer.getContents(); -} -/** - * @see IDOMField#getType() - */ -public String getType() { - return fType; -} -/** - * Returns the souce code to be used for this - * field's type. - */ -protected char[] getTypeContents() { - if (isTypeAltered()) { - return fType.toCharArray(); - } else { - return CharArrayOps.subarray(fDocument, fTypeRange[0], fTypeRange[1] + 1 - fTypeRange[0]); + + /** + * Offsets all the source indexes in this node by the given amount. + */ + protected void offset(int offset) { + super.offset(offset); + offsetRange(fInitializerRange, offset); + offsetRange(fTypeRange, offset); } -} -/** - * Returns true if this field has an initializer expression, - * otherwise false. - */ -protected boolean hasInitializer() { - return getMask(MASK_FIELD_HAS_INITIALIZER); -} -/** - * Returns true is this field declarations has more than one - * variable declarator, otherwise false; - */ -protected boolean hasMultipleVariableDeclarators() { - return fNextNode != null && (fNextNode instanceof DOMField) && - ((DOMField)fNextNode).isVariableDeclarator(); -} -/** - * Inserts the given un-parented node as a sibling of this node, immediately before - * this node. Once inserted, the sibling is only dependent on this document fragment. - * - *

When a sibling is inserted before a variable declarator, it must first - * be expanded. - * - * @see IDOMNode#insertSibling(IDOMNode) - */ -public void insertSibling(IDOMNode sibling) throws IllegalArgumentException, DOMException { - if (isVariableDeclarator()) { + + /** + * Separates this node from its parent and siblings, maintaining any ties + * that this node has to the underlying document fragment. + * + *

+ * When a field with multiple declarators is removed, its declaration must + * first be expanded. + * + * @see IDOMNode#remove() + */ + public void remove() { expand(); - } - super.insertSibling(sibling); -} -/** - * Returns true if this field's type has been altered - * from the original document contents. - */ -protected boolean isTypeAltered() { - return getMask(MASK_FIELD_TYPE_ALTERED); -} -/** - * Returns true if this field is declared as a secondary variable - * declarator for a previous field declaration. - */ -protected boolean isVariableDeclarator() { - return getMask(MASK_FIELD_IS_VARIABLE_DECLARATOR); -} -/** - * @see DOMNode - */ -protected DOMNode newDOMNode() { - return new DOMField(); -} -/** - * Normalizes this DOMNode's end position. - */ -void normalizeEndPosition(ILineStartFinder finder, DOMNode next) { - if (next == null) { - // this node's end position includes all of the characters up - // to the end of the enclosing node - DOMNode parent = (DOMNode) getParent(); - if (parent == null || parent instanceof DOMCompilationUnit) { - setSourceRangeEnd(fDocument.length - 1); + super.remove(); + } + + /** + * @see IDOMMember#setComment(String) + */ + public void setComment(String comment) { + expand(); + super.setComment(comment); + } + + /** + * @see IDOMMember#setFlags(int) + */ + public void setFlags(int flags) { + expand(); + super.setFlags(flags); + } + + /** + * Sets the state of this field declaration as having an initializer + * expression. + */ + protected void setHasInitializer(boolean hasInitializer) { + setMask(MASK_FIELD_HAS_INITIALIZER, hasInitializer); + } + + /** + * @see IDOMField#setInitializer(char[]) + */ + public void setInitializer(String initializer) { + becomeDetailed(); + fragment(); + setHasInitializer(initializer != null); + fInitializer = initializer; + } + + /** + * Sets the initializer range. + */ + void setInitializerRange(int start, int end) { + fInitializerRange[0] = start; + fInitializerRange[1] = end; + } + + /** + * Sets the state of this field declaration as being a secondary variable + * declarator for a previous field declaration. + */ + protected void setIsVariableDeclarator(boolean isVariableDeclarator) { + setMask(MASK_FIELD_IS_VARIABLE_DECLARATOR, isVariableDeclarator); + } + + /** + * @see IDOMField#setName(char[]) + */ + public void setName(String name) throws IllegalArgumentException { + if (name == null) { + throw new IllegalArgumentException(Util.bind("element.nullName")); //$NON-NLS-1$ } else { - // parent is a type - int temp = ((DOMType)parent).getCloseBodyPosition() - 1; - setSourceRangeEnd(temp); - fInsertionPosition = Math.max(finder.getLineStart(temp + 1), getEndPosition()); + super.setName(name); + setTypeAltered(true); } - } else { - // this node's end position is just before the start of the next node - // unless the next node is a field that is declared along with this one - int temp = next.getStartPosition() - 1; - fInsertionPosition = Math.max(finder.getLineStart(temp + 1), getEndPosition()); - - next.normalizeStartPosition(getEndPosition(), finder); - if (next instanceof DOMField) { - DOMField field = (DOMField) next; - if (field.isVariableDeclarator() && fTypeRange[0] == field.fTypeRange[0]) - return; + } + + /** + * @see IDOMField#setType(char[]) + */ + public void setType(String typeName) throws IllegalArgumentException { + if (typeName == null) { + throw new IllegalArgumentException(Util.bind("element.nullType")); //$NON-NLS-1$ } - setSourceRangeEnd(next.getStartPosition() - 1); + becomeDetailed(); + expand(); + fragment(); + setTypeAltered(true); + setNameAltered(true); + fType = typeName; } -} -/** - * Normalizes this DOMNode's start position. - */ -void normalizeStartPosition(int endPosition, ILineStartFinder finder) { - if (isVariableDeclarator()) { - // start position is end of last element - setStartPosition(fPreviousNode.getEndPosition() + 1); - } else { - super.normalizeStartPosition(endPosition, finder); + + /** + * Sets the state of this field declaration as having the field type altered + * from the original document. + */ + protected void setTypeAltered(boolean typeAltered) { + setMask(MASK_FIELD_TYPE_ALTERED, typeAltered); } -} -/** - * Offsets all the source indexes in this node by the given amount. - */ -protected void offset(int offset) { - super.offset(offset); - offsetRange(fInitializerRange, offset); - offsetRange(fTypeRange, offset); -} -/** - * Separates this node from its parent and siblings, maintaining any ties that - * this node has to the underlying document fragment. - * - *

When a field with multiple declarators is removed, its declaration - * must first be expanded. - * - * @see IDOMNode#remove() - */ -public void remove() { - expand(); - super.remove(); -} -/** - * @see IDOMMember#setComment(String) - */ -public void setComment(String comment) { - expand(); - super.setComment(comment); -} -/** - * @see IDOMMember#setFlags(int) - */ -public void setFlags(int flags) { - expand(); - super.setFlags(flags); -} -/** - * Sets the state of this field declaration as having - * an initializer expression. - */ -protected void setHasInitializer(boolean hasInitializer) { - setMask(MASK_FIELD_HAS_INITIALIZER, hasInitializer); -} -/** - * @see IDOMField#setInitializer(char[]) - */ -public void setInitializer(String initializer) { - becomeDetailed(); - fragment(); - setHasInitializer(initializer != null); - fInitializer= initializer; -} -/** - * Sets the initializer range. - */ -void setInitializerRange(int start, int end) { - fInitializerRange[0] = start; - fInitializerRange[1] = end; -} -/** - * Sets the state of this field declaration as being a - * secondary variable declarator for a previous field - * declaration. - */ -protected void setIsVariableDeclarator(boolean isVariableDeclarator) { - setMask(MASK_FIELD_IS_VARIABLE_DECLARATOR, isVariableDeclarator); -} -/** - * @see IDOMField#setName(char[]) - */ -public void setName(String name) throws IllegalArgumentException { - if (name == null) { - throw new IllegalArgumentException(Util.bind("element.nullName")); //$NON-NLS-1$ - } else { - super.setName(name); - setTypeAltered(true); + + /** + * @see DOMNode#shareContents(DOMNode) + */ + protected void shareContents(DOMNode node) { + super.shareContents(node); + DOMField field = (DOMField) node; + fInitializer = field.fInitializer; + fInitializerRange = rangeCopy(field.fInitializerRange); + fType = field.fType; + fTypeRange = rangeCopy(field.fTypeRange); + } + + /** + * @see IDOMNode#toString() + */ + public String toString() { + return "FIELD: " + getName(); //$NON-NLS-1$ } -} -/** - * @see IDOMField#setType(char[]) - */ -public void setType(String typeName) throws IllegalArgumentException { - if (typeName == null) { - throw new IllegalArgumentException(Util.bind("element.nullType")); //$NON-NLS-1$ - } - becomeDetailed(); - expand(); - fragment(); - setTypeAltered(true); - setNameAltered(true); - fType= typeName; -} -/** - * Sets the state of this field declaration as having - * the field type altered from the original document. - */ -protected void setTypeAltered(boolean typeAltered) { - setMask(MASK_FIELD_TYPE_ALTERED, typeAltered); -} -/** - * @see DOMNode#shareContents(DOMNode) - */ -protected void shareContents(DOMNode node) { - super.shareContents(node); - DOMField field= (DOMField)node; - fInitializer= field.fInitializer; - fInitializerRange= rangeCopy(field.fInitializerRange); - fType= field.fType; - fTypeRange= rangeCopy(field.fTypeRange); -} -/** - * @see IDOMNode#toString() - */ -public String toString() { - return "FIELD: " + getName(); //$NON-NLS-1$ -} }