duke@1: /* jjg@1409: * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: package com.sun.source.tree; duke@1: duke@1: /** duke@1: * Common interface for all nodes in an abstract syntax tree. duke@1: * duke@1: *
WARNING: This interface and its sub-interfaces are
duke@1: * subject to change as the Java™ programming language evolves.
jjg@582: * These interfaces are implemented by the JDK Java compiler (javac)
duke@1: * and should not be implemented either directly or indirectly by
duke@1: * other applications.
duke@1: *
duke@1: * @author Peter von der Ahé
duke@1: * @author Jonathan Gibbons
duke@1: *
duke@1: * @since 1.6
duke@1: */
duke@1: public interface Tree {
duke@1:
duke@1: /**
duke@1: * Enumerates all kinds of trees.
duke@1: */
duke@1: public enum Kind {
jjg@308:
duke@1: /**
duke@1: * Used for instances of {@link AnnotationTree}.
duke@1: */
duke@1: ANNOTATION(AnnotationTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ArrayAccessTree}.
duke@1: */
duke@1: ARRAY_ACCESS(ArrayAccessTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ArrayTypeTree}.
duke@1: */
duke@1: ARRAY_TYPE(ArrayTypeTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link AssertTree}.
duke@1: */
duke@1: ASSERT(AssertTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link AssignmentTree}.
duke@1: */
duke@1: ASSIGNMENT(AssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BlockTree}.
duke@1: */
duke@1: BLOCK(BlockTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BreakTree}.
duke@1: */
duke@1: BREAK(BreakTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CaseTree}.
duke@1: */
duke@1: CASE(CaseTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CatchTree}.
duke@1: */
duke@1: CATCH(CatchTree.class),
duke@1:
duke@1: /**
jjg@662: * Used for instances of {@link ClassTree} representing classes.
duke@1: */
duke@1: CLASS(ClassTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompilationUnitTree}.
duke@1: */
duke@1: COMPILATION_UNIT(CompilationUnitTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ConditionalExpressionTree}.
duke@1: */
duke@1: CONDITIONAL_EXPRESSION(ConditionalExpressionTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ContinueTree}.
duke@1: */
duke@1: CONTINUE(ContinueTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link DoWhileLoopTree}.
duke@1: */
duke@1: DO_WHILE_LOOP(DoWhileLoopTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link EnhancedForLoopTree}.
duke@1: */
duke@1: ENHANCED_FOR_LOOP(EnhancedForLoopTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ExpressionStatementTree}.
duke@1: */
duke@1: EXPRESSION_STATEMENT(ExpressionStatementTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link MemberSelectTree}.
duke@1: */
duke@1: MEMBER_SELECT(MemberSelectTree.class),
duke@1:
duke@1: /**
mcimadamore@1143: * Used for instances of {@link MemberReferenceTree}.
mcimadamore@1143: */
mcimadamore@1143: MEMBER_REFERENCE(MemberReferenceTree.class),
mcimadamore@1143:
mcimadamore@1143: /**
duke@1: * Used for instances of {@link ForLoopTree}.
duke@1: */
duke@1: FOR_LOOP(ForLoopTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link IdentifierTree}.
duke@1: */
duke@1: IDENTIFIER(IdentifierTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link IfTree}.
duke@1: */
duke@1: IF(IfTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ImportTree}.
duke@1: */
duke@1: IMPORT(ImportTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link InstanceOfTree}.
duke@1: */
duke@1: INSTANCE_OF(InstanceOfTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LabeledStatementTree}.
duke@1: */
duke@1: LABELED_STATEMENT(LabeledStatementTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link MethodTree}.
duke@1: */
duke@1: METHOD(MethodTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link MethodInvocationTree}.
duke@1: */
duke@1: METHOD_INVOCATION(MethodInvocationTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ModifiersTree}.
duke@1: */
duke@1: MODIFIERS(ModifiersTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link NewArrayTree}.
duke@1: */
duke@1: NEW_ARRAY(NewArrayTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link NewClassTree}.
duke@1: */
duke@1: NEW_CLASS(NewClassTree.class),
duke@1:
duke@1: /**
mcimadamore@1142: * Used for instances of {@link LambdaExpressionTree}.
mcimadamore@1142: */
mcimadamore@1142: LAMBDA_EXPRESSION(LambdaExpressionTree.class),
mcimadamore@1142:
mcimadamore@1142: /**
duke@1: * Used for instances of {@link ParenthesizedTree}.
duke@1: */
duke@1: PARENTHESIZED(ParenthesizedTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link PrimitiveTypeTree}.
duke@1: */
duke@1: PRIMITIVE_TYPE(PrimitiveTypeTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ReturnTree}.
duke@1: */
duke@1: RETURN(ReturnTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link EmptyStatementTree}.
duke@1: */
duke@1: EMPTY_STATEMENT(EmptyStatementTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link SwitchTree}.
duke@1: */
duke@1: SWITCH(SwitchTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link SynchronizedTree}.
duke@1: */
duke@1: SYNCHRONIZED(SynchronizedTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ThrowTree}.
duke@1: */
duke@1: THROW(ThrowTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link TryTree}.
duke@1: */
duke@1: TRY(TryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ParameterizedTypeTree}.
duke@1: */
duke@1: PARAMETERIZED_TYPE(ParameterizedTypeTree.class),
duke@1:
duke@1: /**
darcy@969: * Used for instances of {@link UnionTypeTree}.
mcimadamore@550: */
darcy@969: UNION_TYPE(UnionTypeTree.class),
mcimadamore@550:
mcimadamore@550: /**
duke@1: * Used for instances of {@link TypeCastTree}.
duke@1: */
duke@1: TYPE_CAST(TypeCastTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link TypeParameterTree}.
duke@1: */
duke@1: TYPE_PARAMETER(TypeParameterTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link VariableTree}.
duke@1: */
duke@1: VARIABLE(VariableTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link WhileLoopTree}.
duke@1: */
duke@1: WHILE_LOOP(WhileLoopTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing postfix
duke@1: * increment operator {@code ++}.
duke@1: */
duke@1: POSTFIX_INCREMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing postfix
duke@1: * decrement operator {@code --}.
duke@1: */
duke@1: POSTFIX_DECREMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing prefix
duke@1: * increment operator {@code ++}.
duke@1: */
duke@1: PREFIX_INCREMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing prefix
duke@1: * decrement operator {@code --}.
duke@1: */
duke@1: PREFIX_DECREMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing unary plus
duke@1: * operator {@code +}.
duke@1: */
duke@1: UNARY_PLUS(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing unary minus
duke@1: * operator {@code -}.
duke@1: */
duke@1: UNARY_MINUS(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing bitwise
duke@1: * complement operator {@code ~}.
duke@1: */
duke@1: BITWISE_COMPLEMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link UnaryTree} representing logical
duke@1: * complement operator {@code !}.
duke@1: */
duke@1: LOGICAL_COMPLEMENT(UnaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * multiplication {@code *}.
duke@1: */
duke@1: MULTIPLY(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * division {@code /}.
duke@1: */
duke@1: DIVIDE(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * remainder {@code %}.
duke@1: */
duke@1: REMAINDER(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * addition or string concatenation {@code +}.
duke@1: */
duke@1: PLUS(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * subtraction {@code -}.
duke@1: */
duke@1: MINUS(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * left shift {@code <<}.
duke@1: */
duke@1: LEFT_SHIFT(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * right shift {@code >>}.
duke@1: */
duke@1: RIGHT_SHIFT(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * unsigned right shift {@code >>>}.
duke@1: */
duke@1: UNSIGNED_RIGHT_SHIFT(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * less-than {@code <}.
duke@1: */
duke@1: LESS_THAN(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * greater-than {@code >}.
duke@1: */
duke@1: GREATER_THAN(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * less-than-equal {@code <=}.
duke@1: */
duke@1: LESS_THAN_EQUAL(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * greater-than-equal {@code >=}.
duke@1: */
duke@1: GREATER_THAN_EQUAL(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * equal-to {@code ==}.
duke@1: */
duke@1: EQUAL_TO(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * not-equal-to {@code !=}.
duke@1: */
duke@1: NOT_EQUAL_TO(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * bitwise and logical "and" {@code &}.
duke@1: */
duke@1: AND(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * bitwise and logical "xor" {@code ^}.
duke@1: */
duke@1: XOR(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * bitwise and logical "or" {@code |}.
duke@1: */
duke@1: OR(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * conditional-and {@code &&}.
duke@1: */
duke@1: CONDITIONAL_AND(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link BinaryTree} representing
duke@1: * conditional-or {@code ||}.
duke@1: */
duke@1: CONDITIONAL_OR(BinaryTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * multiplication assignment {@code *=}.
duke@1: */
duke@1: MULTIPLY_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * division assignment {@code /=}.
duke@1: */
duke@1: DIVIDE_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * remainder assignment {@code %=}.
duke@1: */
duke@1: REMAINDER_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * addition or string concatenation assignment {@code +=}.
duke@1: */
duke@1: PLUS_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * subtraction assignment {@code -=}.
duke@1: */
duke@1: MINUS_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * left shift assignment {@code <<=}.
duke@1: */
duke@1: LEFT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * right shift assignment {@code >>=}.
duke@1: */
duke@1: RIGHT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * unsigned right shift assignment {@code >>>=}.
duke@1: */
duke@1: UNSIGNED_RIGHT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * bitwise and logical "and" assignment {@code &=}.
duke@1: */
duke@1: AND_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * bitwise and logical "xor" assignment {@code ^=}.
duke@1: */
duke@1: XOR_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link CompoundAssignmentTree} representing
duke@1: * bitwise and logical "or" assignment {@code |=}.
duke@1: */
duke@1: OR_ASSIGNMENT(CompoundAssignmentTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * an integral literal expression of type {@code int}.
duke@1: */
duke@1: INT_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * an integral literal expression of type {@code long}.
duke@1: */
duke@1: LONG_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * a floating-point literal expression of type {@code float}.
duke@1: */
duke@1: FLOAT_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * a floating-point literal expression of type {@code double}.
duke@1: */
duke@1: DOUBLE_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * a boolean literal expression of type {@code boolean}.
duke@1: */
duke@1: BOOLEAN_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * a character literal expression of type {@code char}.
duke@1: */
duke@1: CHAR_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * a string literal expression of type {@link String}.
duke@1: */
duke@1: STRING_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link LiteralTree} representing
duke@1: * the use of {@code null}.
duke@1: */
duke@1: NULL_LITERAL(LiteralTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link WildcardTree} representing
duke@1: * an unbounded wildcard type argument.
duke@1: */
duke@1: UNBOUNDED_WILDCARD(WildcardTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link WildcardTree} representing
duke@1: * an extends bounded wildcard type argument.
duke@1: */
duke@1: EXTENDS_WILDCARD(WildcardTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link WildcardTree} representing
duke@1: * a super bounded wildcard type argument.
duke@1: */
duke@1: SUPER_WILDCARD(WildcardTree.class),
duke@1:
duke@1: /**
duke@1: * Used for instances of {@link ErroneousTree}.
duke@1: */
duke@1: ERRONEOUS(ErroneousTree.class),
duke@1:
duke@1: /**
jjg@662: * Used for instances of {@link ClassTree} representing interfaces.
jjg@662: */
jjg@662: INTERFACE(ClassTree.class),
jjg@662:
jjg@662: /**
jjg@662: * Used for instances of {@link ClassTree} representing enums.
jjg@662: */
jjg@662: ENUM(ClassTree.class),
jjg@662:
jjg@662: /**
jjg@662: * Used for instances of {@link ClassTree} representing annotation types.
jjg@662: */
jjg@662: ANNOTATION_TYPE(ClassTree.class),
jjg@662:
jjg@662: /**
duke@1: * An implementation-reserved node. This is the not the node
duke@1: * you are looking for.
duke@1: */
duke@1: OTHER(null);
duke@1:
duke@1:
duke@1: Kind(Class extends Tree> intf) {
duke@1: associatedInterface = intf;
duke@1: }
duke@1:
duke@1: public Class extends Tree> asInterface() {
duke@1: return associatedInterface;
duke@1: }
duke@1:
duke@1: private final Class extends Tree> associatedInterface;
duke@1: }
duke@1:
duke@1: /**
duke@1: * Gets the kind of this tree.
duke@1: *
duke@1: * @return the kind of this tree.
duke@1: */
duke@1: Kind getKind();
duke@1:
duke@1: /**
duke@1: * Accept method used to implement the visitor pattern. The
duke@1: * visitor pattern is used to implement operations on trees.
duke@1: *
duke@1: * @param