duke@1: /* jjg@815: * Copyright (c) 2005, 2011, 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: /** 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: /** 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 intf) { duke@1: associatedInterface = intf; duke@1: } duke@1: duke@1: public Class asInterface() { duke@1: return associatedInterface; duke@1: } duke@1: duke@1: private final Class 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 result type of this operation. duke@1: * @param type of additonal data. duke@1: */ duke@1: R accept(TreeVisitor visitor, D data); duke@1: }