Index: dom/org/eclipse/jdt/core/dom/AST.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java,v retrieving revision 1.49 diff -u -r1.49 AST.java --- dom/org/eclipse/jdt/core/dom/AST.java 4 Apr 2003 19:58:13 -0000 1.49 +++ dom/org/eclipse/jdt/core/dom/AST.java 8 Apr 2003 16:52:16 -0000 @@ -812,7 +812,7 @@ /** * Creates an unparented import declaration node owned by this AST. - * The import declaration initially contains a single-type import + * The import declaration initially contains a regular single-type import * of a type with an unspecified name. * * @return the new unparented import declaration node @@ -834,7 +834,11 @@ * and an empty class body. *
* To create an interface, use this method and then call
- * TypeDeclaration.setInterface(true)
and
+ * TypeDeclaration.setInterface(true)
.
+ *
+ * To create an enum declaration, use this method and then call
+ * TypeDeclaration.setEnumeration(true)
.
*
+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @return a new unparented throw statement node + * @since 2.2 + */ + public EnhancedForStatement newEnhancedForStatement() { + return new EnhancedForStatement(this); } //=============================== EXPRESSIONS =========================== Index: dom/org/eclipse/jdt/core/dom/ASTMatcher.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java,v retrieving revision 1.13 diff -u -r1.13 ASTMatcher.java --- dom/org/eclipse/jdt/core/dom/ASTMatcher.java 11 Mar 2003 15:03:51 -0000 1.13 +++ dom/org/eclipse/jdt/core/dom/ASTMatcher.java 8 Apr 2003 16:52:18 -0000 @@ -608,6 +608,74 @@ * other object is a node of the same type with structurally isomorphic * child subtrees. Subclasses may override this method as needed. * + *+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param node the node + * @param other the other object, ornull
+ * @return true
if the subtree matches, or
+ * false
if they do not match or the other object has a
+ * different node type or is null
+ * @since 2.2
+ */
+ public boolean match(EnhancedForStatement node, Object other) {
+ if (!(other instanceof EnhancedForStatement)) {
+ return false;
+ }
+ EnhancedForStatement o = (EnhancedForStatement) other;
+ return (
+ safeSubtreeMatch(node.getType(), o.getType())
+ && safeSubtreeMatch(node.getName(), o.getName())
+ && safeSubtreeMatch(node.getExpression(), o.getExpression())
+ && safeSubtreeMatch(node.getBody(), o.getBody()));
+ }
+
+ /**
+ * Returns whether the given node and the other object match.
+ * + * The default implementation provided by this class tests whether the + * other object is a node of the same type with structurally isomorphic + * child subtrees. Subclasses may override this method as needed. + *
+ *+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param node the node + * @param other the other object, ornull
+ * @return true
if the subtree matches, or
+ * false
if they do not match or the other object has a
+ * different node type or is null
+ * @since 2.2
+ */
+ public boolean match(EnumConstantDeclaration node, Object other) {
+ if (!(other instanceof EnumConstantDeclaration)) {
+ return false;
+ }
+ EnumConstantDeclaration o = (EnumConstantDeclaration) other;
+ return (
+ safeSubtreeMatch(node.getJavadoc(), o.getJavadoc())
+ && safeSubtreeMatch(node.getName(), o.getName())
+ && safeSubtreeListMatch(node.arguments(), o.arguments())
+ && safeSubtreeListMatch(
+ node.bodyDeclarations(),
+ o.bodyDeclarations()));
+ }
+
+ /**
+ * Returns whether the given node and the other object match.
+ * + * The default implementation provided by this class tests whether the + * other object is a node of the same type with structurally isomorphic + * child subtrees. Subclasses may override this method as needed. + *
* * @param node the node * @param other the other object, ornull
@@ -744,7 +812,8 @@
ImportDeclaration o = (ImportDeclaration) other;
return (
safeSubtreeMatch(node.getName(), o.getName())
- && node.isOnDemand() == o.isOnDemand());
+ && node.isOnDemand() == o.isOnDemand()
+ && node.isStatic() == o.isStatic());
}
/**
@@ -1475,6 +1544,7 @@
return (
(node.getModifiers() == o.getModifiers())
&& (node.isInterface() == o.isInterface())
+ && (node.isEnumeration() == o.isEnumeration())
&& safeSubtreeMatch(node.getJavadoc(), o.getJavadoc())
&& safeSubtreeMatch(node.getName(), o.getName())
&& safeSubtreeMatch(node.getSuperclass(), o.getSuperclass())
Index: dom/org/eclipse/jdt/core/dom/ASTNode.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java,v
retrieving revision 1.28
diff -u -r1.28 ASTNode.java
--- dom/org/eclipse/jdt/core/dom/ASTNode.java 11 Mar 2003 15:03:51 -0000 1.28
+++ dom/org/eclipse/jdt/core/dom/ASTNode.java 8 Apr 2003 16:52:20 -0000
@@ -549,6 +549,34 @@
public static final int INSTANCEOF_EXPRESSION = 62;
/**
+ * Node type constant indicating a node of type
+ * EnhancedForStatement
.
+ * + * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * @see EnhancedForStatement + * @since 2.2 + */ + public static final int ENHANCED_FOR_STATEMENT = 63; + + /** + * Node type constant indicating a node of type + *EnumConstantDeclaration
.
+ * + * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * @see EnumConstantDeclaration + * @since 2.2 + */ + public static final int ENUM_CONSTANT_DECLARATION = 64; + + /** * Owning AST. */ private final AST owner; Index: dom/org/eclipse/jdt/core/dom/ASTVisitor.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java,v retrieving revision 1.9 diff -u -r1.9 ASTVisitor.java --- dom/org/eclipse/jdt/core/dom/ASTVisitor.java 11 Mar 2003 15:03:51 -0000 1.9 +++ dom/org/eclipse/jdt/core/dom/ASTVisitor.java 8 Apr 2003 16:52:21 -0000 @@ -181,6 +181,32 @@ public boolean visit(EmptyStatement node) { return true; } + /** Visits the given node. + *+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + public boolean visit(EnhancedForStatement node) { + return true; + } + /** Visits the given node. + *+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + public boolean visit(EnumConstantDeclaration node) { + return true; + } public boolean visit(ExpressionStatement node) { return true; } @@ -347,6 +373,30 @@ public void endVisit(DoStatement node) { } public void endVisit(EmptyStatement node) { + } + /** End of visit of the given node. + *+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + public void endVisit(EnhancedForStatement node) { + } + /** End of visit of the given node. + *+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + public void endVisit(EnumConstantDeclaration node) { } public void endVisit(ExpressionStatement node) { } Index: dom/org/eclipse/jdt/core/dom/BindingResolver.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java,v retrieving revision 1.18 diff -u -r1.18 BindingResolver.java --- dom/org/eclipse/jdt/core/dom/BindingResolver.java 4 Apr 2003 22:10:19 -0000 1.18 +++ dom/org/eclipse/jdt/core/dom/BindingResolver.java 8 Apr 2003 16:52:21 -0000 @@ -246,6 +246,29 @@ IVariableBinding resolveVariable(VariableDeclaration variable) { return null; } + + /** + * Resolves the loop variable of the given enhanced for statement and + * returns the binding for it. + *
+ * The default implementation of this method returns null
.
+ * Subclasses may reimplement.
+ *
+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param statement the enhanced for statement of interest + * @return the binding for the loop variable for the given enhanced for + * statement, ornull
if no binding is available
+ * @since 2.2
+ */
+ IVariableBinding resolveVariable(EnhancedForStatement statement) {
+ return null;
+ }
/**
* Resolves the given field declaration and returns the binding for it.
@@ -265,6 +288,33 @@
* null
if no binding is available
*/
IVariableBinding resolveVariable(FieldDeclaration variable) {
+ return null;
+ }
+
+ /**
+ * Resolves the given enum constant declaration and returns the binding for
+ * the field.
+ *
+ * The implementation of EnumConstantDeclaration.resolveVariable
+ * forwards to this method.
+ *
+ * The default implementation of this method returns null
.
+ * Subclasses may reimplement.
+ *
+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param enumConstant the enum constant declaration of interest + * @return the field binding for the given enum constant declaration, or + *null
if no binding is available
+ * @since 2.2
+ */
+ IVariableBinding resolveVariable(EnumConstantDeclaration enumConstant) {
return null;
}
Index: dom/org/eclipse/jdt/core/dom/BodyDeclaration.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java,v
retrieving revision 1.5
diff -u -r1.5 BodyDeclaration.java
--- dom/org/eclipse/jdt/core/dom/BodyDeclaration.java 11 Mar 2003 15:03:51 -0000 1.5
+++ dom/org/eclipse/jdt/core/dom/BodyDeclaration.java 8 Apr 2003 16:52:21 -0000
@@ -13,21 +13,21 @@
/**
* Abstract base class of all AST nodes that represent body declarations
- * that may appear in the body of a class or interface declaration.
+ * that may appear in the body of some kind of class or interface declaration,
+ * including anonymous class declarations, enumeration declarations, and
+ * enumeration constant declarations.
+ *
* *
- * ClassBodyDeclaration: + * BodyDeclaration: * ClassDeclaration * InterfaceDeclaration + * EnumDeclaration * MethodDeclaration * ConstructorDeclaration * FieldDeclaration * Initializer - * InterfaceBodyDeclaration: - * ClassDeclaration - * InterfaceDeclaration - * MethodDeclaration - * FieldDeclaration + * EnumConstantDeclaration ** *
Index: dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java =================================================================== RCS file: dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java diff -N dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java 8 Apr 2003 16:52:22 -0000 @@ -0,0 +1,285 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.jdt.core.dom; + +/** + * Enhanced For statement AST node type. + * + *
+ * EnhancedForStatement: + * for ( Type Identifier: Expression ) + * Statement + *+ * + *
+ * Note: Enhanced for statements are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * @since 2.2 + */ +public class EnhancedForStatement extends Statement { + + /** + * The type; lazily initialized; defaults to a unspecified, + * legal type. + */ + private Type type = null; + + /** + * The variable name; lazily initialized; defaults to an unspecified, + * legal Java identifier. + */ + private SimpleName variableName = null; + + /** + * The expression; lazily initialized; defaults to a unspecified, but legal, + * expression. + */ + private Expression expression = null; + + /** + * The body statement; lazily initialized; defaults to an empty block + * statement. + */ + private Statement body = null; + + /** + * Creates a new AST node for an enchanced for statement owned by the + * given AST. By default, the type, name, and expression are unspecified + * but legal subtrees, and the body is an empty block. + * + * @param ast the AST that is to own this node + */ + EnhancedForStatement(AST ast) { + super(ast); + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + public int getNodeType() { + return ENHANCED_FOR_STATEMENT; + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + ASTNode clone(AST target) { + EnhancedForStatement result = new EnhancedForStatement(target); + result.setSourceRange(this.getStartPosition(), this.getLength()); + result.copyLeadingComment(this); + result.setType((Type) getType().clone(target)); + result.setName((SimpleName) getName().clone(target)); + result.setExpression((Expression) getExpression().clone(target)); + result.setBody( + (Statement) ASTNode.copySubtree(target, getBody())); + return result; + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + public boolean subtreeMatch(ASTMatcher matcher, Object other) { + // dispatch to correct overloaded match method + return matcher.match(this, other); + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + void accept0(ASTVisitor visitor) { + boolean visitChildren = visitor.visit(this); + if (visitChildren) { + // visit children in normal left to right reading order + acceptChild(visitor, getType()); + acceptChild(visitor, getName()); + acceptChild(visitor, getExpression()); + acceptChild(visitor, getBody()); + } + visitor.endVisit(this); + } + + /** + * Returns the type in this enhanced for statement. + * + * @return the type + */ + public Type getType() { + if (type == null) { + // lazy initialize - use setter to ensure parent link set too + long count = getAST().modificationCount(); + setType(getAST().newPrimitiveType(PrimitiveType.INT)); + getAST().setModificationCount(count); + } + return type; + } + + /** + * Sets the type in this enhanced for statement to the given type. + * + * @param type the new type + * @exception IllegalArgumentException if: + *+ * Note that bindings are generally unavailable unless requested when the + * AST is being built. + *
+ * + * @return the binding, ornull
if the binding cannot be
+ * resolved
+ */
+ public IVariableBinding resolveBinding() {
+ return getAST().getBindingResolver().resolveVariable(this);
+ }
+
+ /* (omit javadoc for this method)
+ * Method declared on ASTNode.
+ */
+ int memSize() {
+ return super.memSize() + 4 * 4;
+ }
+
+ /* (omit javadoc for this method)
+ * Method declared on ASTNode.
+ */
+ int treeSize() {
+ return
+ memSize()
+ + (type == null ? 0 : getType().treeSize())
+ + (variableName == null ? 0 : getName().treeSize())
+ + (expression == null ? 0 : getExpression().treeSize())
+ + (body == null ? 0 : getBody().treeSize());
+ }
+}
Index: dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
===================================================================
RCS file: dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
diff -N dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java 8 Apr 2003 16:52:22 -0000
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jdt.core.dom;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Enumeration constant declaration AST node type.
+ *
+ * + * EnumConstantDeclaration: + * [ Javadoc ] Identifier + * [ ( [ Expression { , Expression } ] ) ] + * [ { { ClassBodyDeclaration | ; } } ] + *+ *
+ * When a Javadoc comment is present, the source + * range begins with the first character of the "/**" comment delimiter. + * When there is no Javadoc comment, the source range begins with the first + * character of the identifier. If there are class body declarations, the + * source range extends through the last character of the last character of + * the "}" token following the body declarations. If there are arguments but + * no class body declarations, the source range extends through the last + * character of the ")" token following the arguments. If there are no + * arguments and no class body declarations, the source range extends through + * the last character of the identifier. + *
+ *+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ +public class EnumConstantDeclaration extends BodyDeclaration { + + /** + * The constant name; lazily initialized; defaults to a unspecified, + * legal Java class identifier. + */ + private SimpleName constantName = null; + + /** + * The list of argument expressions (element type: + *Expression
). Defaults to an empty list.
+ */
+ private ASTNode.NodeList arguments =
+ new ASTNode.NodeList(true, Expression.class);
+
+ /**
+ * The body declarations (element type: BodyDeclaration
).
+ * Defaults to an empty list.
+ */
+ private ASTNode.NodeList bodyDeclarations =
+ new ASTNode.NodeList(true, BodyDeclaration.class);
+
+ /**
+ * Creates a new AST node for an enumeration constants declaration owned by
+ * the given AST. By default, the enumeration constant has an unspecified,
+ * but legal, name; no javadoc; an empty list of arguments; and an empty
+ * list of body declarations.
+ * + * N.B. This constructor is package-private; all subclasses must be + * declared in the same package; clients are unable to declare + * additional subclasses. + *
+ * + * @param ast the AST that is to own this node + */ + EnumConstantDeclaration(AST ast) { + super(ast); + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + public int getNodeType() { + return ENUM_CONSTANT_DECLARATION; + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + ASTNode clone(AST target) { + EnumConstantDeclaration result = new EnumConstantDeclaration(target); + result.setSourceRange(this.getStartPosition(), this.getLength()); + result.setJavadoc( + (Javadoc) ASTNode.copySubtree(target,(ASTNode) getJavadoc())); + result.setName((SimpleName) getName().clone(target)); + result.arguments().addAll(ASTNode.copySubtrees(target, arguments())); + result.bodyDeclarations().addAll( + ASTNode.copySubtrees(target, bodyDeclarations())); + return result; + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + public boolean subtreeMatch(ASTMatcher matcher, Object other) { + // dispatch to correct overloaded match method + return matcher.match(this, other); + } + + /* (omit javadoc for this method) + * Method declared on ASTNode. + */ + void accept0(ASTVisitor visitor) { + boolean visitChildren = visitor.visit(this); + if (visitChildren) { + // visit children in normal left to right reading order + acceptChild(visitor, getJavadoc()); + acceptChild(visitor, getName()); + acceptChildren(visitor, arguments); + acceptChildren(visitor, bodyDeclarations); + } + visitor.endVisit(this); + } + + /** + * Returns the name of the constant declared in this enum declaration. + * + * @return the constant name node + */ + public SimpleName getName() { + if (constantName == null) { + // lazy initialize - use setter to ensure parent link set too + long count = getAST().modificationCount(); + setName(new SimpleName(getAST())); + getAST().setModificationCount(count); + } + return constantName; + } + + /** + * Sets the name of the constant declared in this enum declaration to the + * given name. + * + * @param constantName the new constant name + * @exception IllegalArgumentException if: + *Expression
)
+ */
+ public List arguments() {
+ return arguments;
+ }
+
+ /**
+ * Returns the live ordered list of body declarations of this enumeration
+ * constant declaration. Note that an empty list is equivalent to not
+ * explicitly specifying any body declarations.
+ *
+ * @return the live list of body declarations
+ * (element type: BodyDeclaration
)
+ */
+ public List bodyDeclarations() {
+ return bodyDeclarations;
+ }
+
+ /**
+ * Resolves and returns the field binding for this enum constant.
+ * + * Note that bindings are generally unavailable unless requested when the + * AST is being built. + *
+ * + * @return the binding, ornull
if the binding cannot be
+ * resolved
+ */
+ public IVariableBinding resolveVariable() {
+ return getAST().getBindingResolver().resolveVariable(this);
+ }
+
+ /* (omit javadoc for this method)
+ * Method declared on ASTNode.
+ */
+ void appendDebugString(StringBuffer buffer) {
+ buffer.append("EnumConstantDeclaration[");//$NON-NLS-1$
+ buffer.append(getName().getIdentifier());
+ buffer.append(" ");//$NON-NLS-1$
+ if (!arguments().isEmpty()) {
+ buffer.append("(");//$NON-NLS-1$
+ for (Iterator it = arguments().iterator(); it.hasNext(); ) {
+ Expression e = (Expression) it.next();
+ e.appendDebugString(buffer);
+ if (it.hasNext()) {
+ buffer.append(",");//$NON-NLS-1$
+ }
+ }
+ buffer.append(")");//$NON-NLS-1$
+ }
+ if (!bodyDeclarations().isEmpty()) {
+ buffer.append(" {");//$NON-NLS-1$
+ for (Iterator it = bodyDeclarations().iterator(); it.hasNext(); ) {
+ BodyDeclaration d = (BodyDeclaration) it.next();
+ d.appendDebugString(buffer);
+ if (it.hasNext()) {
+ buffer.append(";");//$NON-NLS-1$
+ }
+ }
+ buffer.append("}");//$NON-NLS-1$
+ }
+ buffer.append("]");//$NON-NLS-1$
+ }
+
+ /* (omit javadoc for this method)
+ * Method declared on ASTNode.
+ */
+ int memSize() {
+ return super.memSize() + 3 * 4;
+ }
+
+ /* (omit javadoc for this method)
+ * Method declared on ASTNode.
+ */
+ int treeSize() {
+ return
+ memSize()
+ + (getJavadoc() == null ? 0 : getJavadoc().treeSize())
+ + (constantName == null ? 0 : getName().treeSize())
+ + arguments.listSize()
+ + bodyDeclarations.listSize();
+ }
+}
+
Index: dom/org/eclipse/jdt/core/dom/ImportDeclaration.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java,v
retrieving revision 1.11
diff -u -r1.11 ImportDeclaration.java
--- dom/org/eclipse/jdt/core/dom/ImportDeclaration.java 11 Mar 2003 15:03:51 -0000 1.11
+++ dom/org/eclipse/jdt/core/dom/ImportDeclaration.java 8 Apr 2003 16:52:22 -0000
@@ -16,9 +16,15 @@
*
* * ImportDeclaration: - * import Name [ . * ] ; + * import [ static ] Name [ . * ] ; ** + *
+ * Note: Static imports are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
* @since 2.0 */ public class ImportDeclaration extends ASTNode { @@ -34,9 +40,22 @@ private boolean onDemand = false; /** + * Static versus regular; defaults to regular import. + *+ * Note: Static imports are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + private boolean isStatic = false; + + /** * Creates a new AST node for an import declaration owned by the - * given AST. The import declaration initially is a single type - * import for an unspecified, but legal, Java type name. + * given AST. The import declaration initially is a regular (non-static) + * single type import for an unspecified, but legal, Java type name. ** N.B. This constructor is package-private; all subclasses must be * declared in the same package; clients are unable to declare @@ -63,6 +82,7 @@ ImportDeclaration result = new ImportDeclaration(target); result.setSourceRange(this.getStartPosition(), this.getLength()); result.setOnDemand(isOnDemand()); + result.setStatic(isStatic()); result.setName((Name) getName().clone(target)); return result; } @@ -89,8 +109,11 @@ /** * Returns the name imported by this declaration. *
- * For an on-demand import, this is the name of a package. For a - * single-type import, this is the qualified name of a type. + * For a regular on-demand import, this is the name of a package. + * For a static on-demand import, this is the qualified name of + * a type. For a regular single-type import, this is the qualified name + * of a type. For a static single-type import, this is the qualified name + * of a static member of a type. *
* * @return the imported name node @@ -109,8 +132,11 @@ /** * Sets the name of this import declaration to the given name. *- * For an on-demand import, this is the name of a package. For a - * single-type import, this is the qualified name of a type. + * For a regular on-demand import, this is the name of a package. + * For a static on-demand import, this is the qualified name of + * a type. For a regular single-type import, this is the qualified name + * of a type. For a static single-type import, this is the qualified name + * of a static member of a type. *
* * @param name the new import name @@ -152,6 +178,41 @@ } /** + * Returns whether this import declaration is a static import. + *+ * Note: Static imports are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @returntrue
if this is a static import,
+ * and false
if this is a regular import
+ * @since 2.2
+ */
+ public boolean isStatic() {
+ return isStatic;
+ }
+
+ /**
+ * Sets whether this import declaration is a static import.
+ * + * Note: Static imports are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param isStatictrue
if this is a static import,
+ * and false
if this is a regular import
+ * @since 2.2
+ */
+ public void setStatic(boolean isStatic) {
+ modifying();
+ this.isStatic = isStatic;
+ }
+
+ /**
* Resolves and returns the binding for the package or type imported by
* this import declaration.
*
@@ -171,7 +232,7 @@
* Method declared on ASTNode.
*/
int memSize() {
- return BASE_NODE_SIZE + 2 * 4;
+ return BASE_NODE_SIZE + 3 * 4;
}
/* (omit javadoc for this method)
Index: dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java,v
retrieving revision 1.9
diff -u -r1.9 NaiveASTFlattener.java
--- dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java 11 Mar 2003 15:03:51 -0000 1.9
+++ dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java 8 Apr 2003 16:52:23 -0000
@@ -376,6 +376,50 @@
}
/*
+ * @see ASTVisitor#visit(EnhancedForStatement)
+ * @since 2.2
+ */
+ public boolean visit(EnhancedForStatement node) {
+ buffer.append("for (");//$NON-NLS-1$
+ node.getType().accept(this);
+ buffer.append(" ");//$NON-NLS-1$
+ node.getName().accept(this);
+ buffer.append(" : ");//$NON-NLS-1$
+ node.getExpression().accept(this);
+ buffer.append(") ");//$NON-NLS-1$
+ node.getBody().accept(this);
+ return false;
+ }
+
+ /*
+ * @see ASTVisitor#visit(EnumConstantDeclaration)
+ * @since 2.2
+ */
+ public boolean visit(EnumConstantDeclaration node) {
+ node.getName().accept(this);
+ if (!node.arguments().isEmpty()) {
+ buffer.append("(");//$NON-NLS-1$
+ for (Iterator it = node.arguments().iterator(); it.hasNext(); ) {
+ Expression e = (Expression) it.next();
+ e.accept(this);
+ if (it.hasNext()) {
+ buffer.append(",");//$NON-NLS-1$
+ }
+ }
+ buffer.append(")");//$NON-NLS-1$
+ }
+ if (!node.bodyDeclarations().isEmpty()) {
+ buffer.append("{");//$NON-NLS-1$
+ for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext(); ) {
+ BodyDeclaration d = (BodyDeclaration) it.next();
+ d.accept(this);
+ }
+ buffer.append("}");//$NON-NLS-1$
+ }
+ return false;
+ }
+
+ /*
* @see ASTVisitor#visit(ExpressionStatement)
*/
public boolean visit(ExpressionStatement node) {
@@ -458,6 +502,9 @@
*/
public boolean visit(ImportDeclaration node) {
buffer.append("import ");//$NON-NLS-1$
+ if (node.isStatic()) {
+ buffer.append("static ");//$NON-NLS-1$
+ }
node.getName().accept(this);
if (node.isOnDemand()) {
buffer.append(".*");//$NON-NLS-1$
@@ -869,8 +916,20 @@
buffer.append(" ");//$NON-NLS-1$
}
buffer.append("{");//$NON-NLS-1$
+ BodyDeclaration prev = null;
for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext(); ) {
BodyDeclaration d = (BodyDeclaration) it.next();
+ if (prev instanceof EnumConstantDeclaration) {
+ // enum constant declarations do not include punctuation
+ if (d instanceof EnumConstantDeclaration) {
+ // enum constant declarations are separated by commas
+ buffer.append(", ");//$NON-NLS-1$
+ } else {
+ // semicolon separates last enum constant declaration from
+ // first class body declarations
+ buffer.append("; ");//$NON-NLS-1$
+ }
+ }
d.accept(this);
}
buffer.append("}");//$NON-NLS-1$
Index: dom/org/eclipse/jdt/core/dom/SimpleName.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java,v
retrieving revision 1.25
diff -u -r1.25 SimpleName.java
--- dom/org/eclipse/jdt/core/dom/SimpleName.java 11 Mar 2003 15:03:51 -0000 1.25
+++ dom/org/eclipse/jdt/core/dom/SimpleName.java 8 Apr 2003 16:52:23 -0000
@@ -140,6 +140,10 @@
* providing isConstructor
is false
.
*
VariableDeclaration
* node.EnumConstantDeclaration
+ * node.EnhancedForStatement
+ * node.* Note that this is a convenience method that simply checks whether @@ -173,6 +177,15 @@ if (parent instanceof VariableDeclarationFragment) { VariableDeclarationFragment p = (VariableDeclarationFragment) parent; // make sure its the name of the variable (not the initializer) + return (p.getName() == this); + } + if (parent instanceof EnumConstantDeclaration) { + // could only be the name of the enum constant + return true; + } + if (parent instanceof EnhancedForStatement) { + EnhancedForStatement p = (EnhancedForStatement) parent; + // make sure its the name of the loop variable (not the initializer) return (p.getName() == this); } return false; Index: dom/org/eclipse/jdt/core/dom/Statement.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Statement.java,v retrieving revision 1.19 diff -u -r1.19 Statement.java --- dom/org/eclipse/jdt/core/dom/Statement.java 11 Mar 2003 15:03:51 -0000 1.19 +++ dom/org/eclipse/jdt/core/dom/Statement.java 8 Apr 2003 16:52:23 -0000 @@ -25,6 +25,7 @@ * Block * IfStatement * ForStatement + * EnhancedForStatement * WhileStatement * DoStatement * TryStatement Index: dom/org/eclipse/jdt/core/dom/TypeDeclaration.java =================================================================== RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java,v retrieving revision 1.20 diff -u -r1.20 TypeDeclaration.java --- dom/org/eclipse/jdt/core/dom/TypeDeclaration.java 7 Apr 2003 18:28:42 -0000 1.20 +++ dom/org/eclipse/jdt/core/dom/TypeDeclaration.java 8 Apr 2003 16:52:24 -0000 @@ -22,6 +22,7 @@ * TypeDeclaration: * ClassDeclaration * InterfaceDeclaration + * EnumDeclaration * ClassDeclaration: * [ Javadoc ] { Modifier } class Identifier * [ extends Type] @@ -31,16 +32,28 @@ * [ Javadoc ] { Modifier } interface Identifier * [ extends Type { , Type } ] * { { InterfaceBodyDeclaration | ; } } + * EnumDeclaration: + * [ Javadoc ] { Modifier } enum Identifier + * [ implements Type { , Type } ] + * { + * [ EnumConstantDeclaration [ , EnumConstantDeclaration ] ] + * [ ; { ClassBodyDeclaration | ; } ] + * } * *
* When a Javadoc comment is present, the source * range begins with the first character of the "/**" comment delimiter. * When there is no Javadoc comment, the source range begins with the first * character of the first modifier keyword (if modifiers), or the - * first character of the "class" or "interface": keyword (if no modifiers). - * The source range extends through the last character of the ";" token (if - * no body), or the last character of the "}" token following the body - * declarations. + * first character of the "class", "interface", or "enum" keyword (if no + * modifiers). The source range extends through the last character of the "}" + * token following the body declarations. + *
+ *+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. *
* * @since 2.0 @@ -62,6 +75,20 @@ private boolean isInterface = false; /** + *true
for an enumeration, false
for a class.
+ * Defaults to class. This field is ignored for interfaces.
+ * + * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @since 2.2 + */ + private boolean isEnumeration = false; + + /** * The modifiers; bit-wise or of Modifier flags. * Defaults to none. */ @@ -129,6 +156,7 @@ result.setJavadoc( (Javadoc) ASTNode.copySubtree(target,(ASTNode) getJavadoc())); result.setInterface(isInterface()); + result.setEnumeration(isEnumeration()); result.setName((SimpleName) getName().clone(target)); result.setSuperclass( (Name) ASTNode.copySubtree(target,(ASTNode) getSuperclass())); @@ -168,7 +196,7 @@ * interface. * * @returntrue
if this is an interface declaration,
- * and false
if this is a class declaration
+ * and false
if this is a class or enumeration declaration
*/
public boolean isInterface() {
return isInterface;
@@ -179,7 +207,7 @@
* interface.
*
* @param isInterface true
if this is an interface
- * declaration, and false
if this is a class
+ * declaration, and false
if this is a class or enumeration
* declaration
*/
public void setInterface(boolean isInterface) {
@@ -188,6 +216,44 @@
}
/**
+ * Returns whether this type declaration declares a class or an
+ * enumeration. Note that this property is not relevant for interfaces.
+ * + * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @returntrue
if this is an enumeration declaration,
+ * and false
if this is a class declaration
+ * @since 2.2
+ */
+ public boolean isEnumeration() {
+ return isEnumeration;
+ }
+
+ /**
+ * Sets whether this type declaration declares a class or an
+ * enumeration. Note that this property is not relevant for interfaces.
+ * + * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @param isEnumerationtrue
if this is an enumeration
+ * declaration, and false
if this is a class
+ * declaration
+ * @since 2.2
+ */
+ public void setEnumeration(boolean isEnumeration) {
+ modifying();
+ this.isEnumeration = isEnumeration;
+ }
+
+ /**
* Returns the modifiers explicitly specified on this declaration.
*
* Note that deprecated is not included.
@@ -266,8 +332,9 @@
* Returns the name of the superclass declared in this type
* declaration, or null
if there is none.
*
- * Note that this child is not relevant for interface declarations - * (although it does still figure in subtree equality comparisons). + * Note that this child is not relevant for interface and + * enumeration declarations (although it does still figure in subtree + * equality comparisons). *
* * @return the superclass name node, ornull
if
@@ -281,8 +348,9 @@
* Sets or clears the name of the superclass declared in this type
* declaration.
* - * Note that this child is not relevant for interface declarations - * (although it does still figure in subtree equality comparisons). + * Note that this child is not relevant for interface and + * enumeration declarations (although it does still figure in subtree + * equality comparisons). *
* * @param superclassName the superclass name node, ornull
if
@@ -302,9 +370,10 @@
/**
* Returns the live ordered list of names of superinterfaces of this type
- * declaration. For a class declaration, these are the names of the
- * interfaces that this class implements; for an interface declaration,
- * these are the names of the interfaces that this interface extends.
+ * declaration. For a class or enumeration declaration, these are the names
+ * of the interfaces that this class implements; for an interface
+ * declaration, these are the names of the interfaces that this interface
+ * extends.
*
* @return the live list of interface names
* (element type: Name
)
@@ -317,8 +386,11 @@
* Returns the live ordered list of body declarations of this type
* declaration. For a class declaration, these are the
* initializer, field, method, constructor, and member type
- * declarations; for an interface declaration, these are
- * the constant, method, and member type declarations.
+ * declarations; for an interface declaration, these are the constant,
+ * method, and member type declarations. For an enumeration declaration,
+ * these are the enum constant declarations, which are always at the
+ * front of the list, followed by any initializer, field, method,
+ * constructor, and member type declarations.
*
* @return the live list of body declarations
* (element type: BodyDeclaration
)
@@ -331,7 +403,9 @@
* Returns the ordered list of field declarations of this type
* declaration. For a class declaration, these are the
* field declarations; for an interface declaration, these are
- * the constant declarations.
+ * the constant declarations; for an enum declaration, these are
+ * the explicitly declared field declarations (excludes enum
+ * constant declarations).
*
* This convenience method returns this node's body declarations
* with non-fields filtered out. Unlike bodyDeclarations
,
@@ -421,6 +495,44 @@
}
/**
+ * Returns the ordered list of enum constant declarations of this enum
+ * declaration. This method is not relevant for class and interface
+ * declarations, for which enum constant declarations are meaningless.
+ *
+ * This convenience method returns this node's enum constant declarations
+ * with non-enum constants filtered out. Unlike bodyDeclarations
,
+ * this method does not return a live result.
+ *
+ * Note: Enum declarations are an experimental language feature + * under discussion in JSR-201 and under consideration for inclusion + * in the 1.5 release of J2SE. The support here is therefore tentative + * and subject to change. + *
+ * + * @return the (possibly empty) list of enum constant declarations + * @since 2.2 + */ + public EnumConstantDeclaration[] getEnumConstants() { + List bd = bodyDeclarations(); + int enumCount = 0; + for (Iterator it = bd.listIterator(); it.hasNext(); ) { + if (it.next() instanceof EnumConstantDeclaration) { + enumCount++; + } + } + EnumConstantDeclaration[] enumConstants = new EnumConstantDeclaration[enumCount]; + int next = 0; + for (Iterator it = bd.listIterator(); it.hasNext(); ) { + Object decl = it.next(); + if (decl instanceof EnumConstantDeclaration) { + enumConstants[next++] = (EnumConstantDeclaration) decl; + } + } + return enumConstants; + } + + /** * Returns whether this type declaration is a package member (that is, * a top-level type). *@@ -440,18 +552,19 @@ * Returns whether this type declaration is a type member. *
* Note that this is a convenience method that simply checks whether - * this node's parent is a type declaration node or an anonymous - * class declaration. + * this node's parent is a type declaration node, an anonymous + * class declaration, or an enumeration constant declaration. *
* * @returntrue
if this type declaration is a child of
- * a type declaration node or a class instance creation node, and
- * false
otherwise
+ * a type declaration node, a class instance creation node, or an
+ * enum constant declaration, and false
otherwise
*/
public boolean isMemberTypeDeclaration() {
ASTNode parent = getParent();
return (parent instanceof TypeDeclaration)
- || (parent instanceof AnonymousClassDeclaration);
+ || (parent instanceof AnonymousClassDeclaration)
+ || (parent instanceof EnumConstantDeclaration);
}
/**
@@ -488,25 +601,28 @@
* Method declared on ASTNode.
*/
void appendDebugString(StringBuffer buffer) {
- buffer.append("TypeDeclaration[");//$NON-NLS-1$
- buffer.append(isInterface() ? "interface " : "class ");//$NON-NLS-2$//$NON-NLS-1$
+ buffer.append("TypeDeclaration["); //$NON-NLS-1$
+ buffer.append(isInterface()
+ ? "interface " //$NON-NLS-1$
+ : (isEnumeration()
+ ? "enum " : "class ")); //$NON-NLS-2$//$NON-NLS-1$
buffer.append(getName().getIdentifier());
- buffer.append(" ");//$NON-NLS-1$
- for (Iterator it = bodyDeclarations().iterator(); it.hasNext(); ) {
+ buffer.append(" "); //$NON-NLS-1$
+ for (Iterator it = bodyDeclarations().iterator(); it.hasNext();) {
BodyDeclaration d = (BodyDeclaration) it.next();
d.appendDebugString(buffer);
if (it.hasNext()) {
- buffer.append(";");//$NON-NLS-1$
+ buffer.append(";"); //$NON-NLS-1$
}
}
- buffer.append("]");//$NON-NLS-1$
+ buffer.append("]"); //$NON-NLS-1$
}
/* (omit javadoc for this method)
* Method declared on ASTNode.
*/
int memSize() {
- return super.memSize() + 6 * 4;
+ return super.memSize() + 7 * 4;
}
/* (omit javadoc for this method)