package sk.stuba.fiit.perconik.eclipse.jdt.core.dom; import java.util.Set; import javax.annotation.Nullable; import com.google.common.base.CaseFormat; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; import org.eclipse.jdt.core.dom.ArrayAccess; import org.eclipse.jdt.core.dom.ArrayCreation; import org.eclipse.jdt.core.dom.ArrayInitializer; import org.eclipse.jdt.core.dom.ArrayType; import org.eclipse.jdt.core.dom.AssertStatement; import org.eclipse.jdt.core.dom.Assignment; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.BlockComment; import org.eclipse.jdt.core.dom.BooleanLiteral; import org.eclipse.jdt.core.dom.BreakStatement; import org.eclipse.jdt.core.dom.CastExpression; import org.eclipse.jdt.core.dom.CatchClause; import org.eclipse.jdt.core.dom.CharacterLiteral; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ConditionalExpression; import org.eclipse.jdt.core.dom.ConstructorInvocation; import org.eclipse.jdt.core.dom.ContinueStatement; import org.eclipse.jdt.core.dom.DoStatement; import org.eclipse.jdt.core.dom.EmptyStatement; import org.eclipse.jdt.core.dom.EnhancedForStatement; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.ExpressionStatement; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.ForStatement; import org.eclipse.jdt.core.dom.IfStatement; import org.eclipse.jdt.core.dom.ImportDeclaration; import org.eclipse.jdt.core.dom.InfixExpression; import org.eclipse.jdt.core.dom.Initializer; import org.eclipse.jdt.core.dom.InstanceofExpression; import org.eclipse.jdt.core.dom.Javadoc; import org.eclipse.jdt.core.dom.LabeledStatement; import org.eclipse.jdt.core.dom.LineComment; import org.eclipse.jdt.core.dom.MarkerAnnotation; import org.eclipse.jdt.core.dom.MemberRef; import org.eclipse.jdt.core.dom.MemberValuePair; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.MethodRef; import org.eclipse.jdt.core.dom.MethodRefParameter; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.NormalAnnotation; import org.eclipse.jdt.core.dom.NullLiteral; import org.eclipse.jdt.core.dom.NumberLiteral; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.ParenthesizedExpression; import org.eclipse.jdt.core.dom.PostfixExpression; import org.eclipse.jdt.core.dom.PrefixExpression; import org.eclipse.jdt.core.dom.PrimitiveType; import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.QualifiedType; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SimpleType; import org.eclipse.jdt.core.dom.SingleMemberAnnotation; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; import org.eclipse.jdt.core.dom.SuperFieldAccess; import org.eclipse.jdt.core.dom.SuperMethodInvocation; import org.eclipse.jdt.core.dom.SwitchCase; import org.eclipse.jdt.core.dom.SwitchStatement; import org.eclipse.jdt.core.dom.SynchronizedStatement; import org.eclipse.jdt.core.dom.TagElement; import org.eclipse.jdt.core.dom.TextElement; import org.eclipse.jdt.core.dom.ThisExpression; import org.eclipse.jdt.core.dom.ThrowStatement; import org.eclipse.jdt.core.dom.TryStatement; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeDeclarationStatement; import org.eclipse.jdt.core.dom.TypeLiteral; import org.eclipse.jdt.core.dom.TypeParameter; import org.eclipse.jdt.core.dom.UnionType; import org.eclipse.jdt.core.dom.VariableDeclarationExpression; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.VariableDeclarationStatement; import org.eclipse.jdt.core.dom.WhileStatement; import org.eclipse.jdt.core.dom.WildcardType; import sk.stuba.fiit.perconik.utilities.constant.IntegralConstant; import sk.stuba.fiit.perconik.utilities.constant.IntegralConstantSupport; import sk.stuba.fiit.perconik.utilities.constant.TypeConstant; import sk.stuba.fiit.perconik.utilities.constant.TypeConstantSupport; import static java.util.Arrays.asList; import static com.google.common.collect.Sets.newHashSet; /** * AST node types. * * @see ASTNode * * @author Pavol Zbell * @since 1.0 */ public enum NodeType implements IntegralConstant, TypeConstant<ASTNode> { /** * @see ASTNode#ANONYMOUS_CLASS_DECLARATION */ ANONYMOUS_CLASS_DECLARATION(ASTNode.ANONYMOUS_CLASS_DECLARATION, AnonymousClassDeclaration.class), /** * @see ASTNode#ARRAY_ACCESS */ ARRAY_ACCESS(ASTNode.ARRAY_ACCESS, ArrayAccess.class), /** * @see ASTNode#ARRAY_CREATION */ ARRAY_CREATION(ASTNode.ARRAY_CREATION, ArrayCreation.class), /** * @see ASTNode#ARRAY_INITIALIZER */ ARRAY_INITIALIZER(ASTNode.ARRAY_INITIALIZER, ArrayInitializer.class), /** * @see ASTNode#ARRAY_TYPE */ ARRAY_TYPE(ASTNode.ARRAY_TYPE, ArrayType.class), /** * @see ASTNode#ASSERT_STATEMENT */ ASSERT_STATEMENT(ASTNode.ASSERT_STATEMENT, AssertStatement.class), /** * @see ASTNode#ASSIGNMENT */ ASSIGNMENT(ASTNode.ASSIGNMENT, Assignment.class), /** * @see ASTNode#BLOCK */ BLOCK(ASTNode.BLOCK, Block.class), /** * @see ASTNode#BOOLEAN_LITERAL */ BOOLEAN_LITERAL(ASTNode.BOOLEAN_LITERAL, BooleanLiteral.class), /** * @see ASTNode#BREAK_STATEMENT */ BREAK_STATEMENT(ASTNode.BREAK_STATEMENT, BreakStatement.class), /** * @see ASTNode#CAST_EXPRESSION */ CAST_EXPRESSION(ASTNode.CAST_EXPRESSION, CastExpression.class), /** * @see ASTNode#CATCH_CLAUSE */ CATCH_CLAUSE(ASTNode.CATCH_CLAUSE, CatchClause.class), /** * @see ASTNode#CHARACTER_LITERAL */ CHARACTER_LITERAL(ASTNode.CHARACTER_LITERAL, CharacterLiteral.class), /** * @see ASTNode#CLASS_INSTANCE_CREATION */ CLASS_INSTANCE_CREATION(ASTNode.CLASS_INSTANCE_CREATION, ClassInstanceCreation.class), /** * @see ASTNode#COMPILATION_UNIT */ COMPILATION_UNIT(ASTNode.COMPILATION_UNIT, CompilationUnit.class), /** * @see ASTNode#CONDITIONAL_EXPRESSION */ CONDITIONAL_EXPRESSION(ASTNode.CONDITIONAL_EXPRESSION, ConditionalExpression.class), /** * @see ASTNode#CONSTRUCTOR_INVOCATION */ CONSTRUCTOR_INVOCATION(ASTNode.CONSTRUCTOR_INVOCATION, ConstructorInvocation.class), /** * @see ASTNode#CONTINUE_STATEMENT */ CONTINUE_STATEMENT(ASTNode.CONTINUE_STATEMENT, ContinueStatement.class), /** * @see ASTNode#DO_STATEMENT */ DO_STATEMENT(ASTNode.DO_STATEMENT, DoStatement.class), /** * @see ASTNode#EMPTY_STATEMENT */ EMPTY_STATEMENT(ASTNode.EMPTY_STATEMENT, EmptyStatement.class), /** * @see ASTNode#EXPRESSION_STATEMENT */ EXPRESSION_STATEMENT(ASTNode.EXPRESSION_STATEMENT, ExpressionStatement.class), /** * @see ASTNode#FIELD_ACCESS */ FIELD_ACCESS(ASTNode.FIELD_ACCESS, FieldAccess.class), /** * @see ASTNode#FIELD_DECLARATION */ FIELD_DECLARATION(ASTNode.FIELD_DECLARATION, FieldDeclaration.class), /** * @see ASTNode#FOR_STATEMENT */ FOR_STATEMENT(ASTNode.FOR_STATEMENT, ForStatement.class), /** * @see ASTNode#IF_STATEMENT */ IF_STATEMENT(ASTNode.IF_STATEMENT, IfStatement.class), /** * @see ASTNode#IMPORT_DECLARATION */ IMPORT_DECLARATION(ASTNode.IMPORT_DECLARATION, ImportDeclaration.class), /** * @see ASTNode#INFIX_EXPRESSION */ INFIX_EXPRESSION(ASTNode.INFIX_EXPRESSION, InfixExpression.class), /** * @see ASTNode#INITIALIZER */ INITIALIZER(ASTNode.INITIALIZER, Initializer.class), /** * @see ASTNode#JAVADOC */ JAVADOC(ASTNode.JAVADOC, Javadoc.class), /** * @see ASTNode#LABELED_STATEMENT */ LABELED_STATEMENT(ASTNode.LABELED_STATEMENT, LabeledStatement.class), /** * @see ASTNode#METHOD_DECLARATION */ METHOD_DECLARATION(ASTNode.METHOD_DECLARATION, MethodDeclaration.class), /** * @see ASTNode#METHOD_INVOCATION */ METHOD_INVOCATION(ASTNode.METHOD_INVOCATION, MethodInvocation.class), /** * @see ASTNode#NULL_LITERAL */ NULL_LITERAL(ASTNode.NULL_LITERAL, NullLiteral.class), /** * @see ASTNode#NUMBER_LITERAL */ NUMBER_LITERAL(ASTNode.NUMBER_LITERAL, NumberLiteral.class), /** * @see ASTNode#PACKAGE_DECLARATION */ PACKAGE_DECLARATION(ASTNode.PACKAGE_DECLARATION, PackageDeclaration.class), /** * @see ASTNode#PARENTHESIZED_EXPRESSION */ PARENTHESIZED_EXPRESSION(ASTNode.PARENTHESIZED_EXPRESSION, ParenthesizedExpression.class), /** * @see ASTNode#POSTFIX_EXPRESSION */ POSTFIX_EXPRESSION(ASTNode.POSTFIX_EXPRESSION, PostfixExpression.class), /** * @see ASTNode#PREFIX_EXPRESSION */ PREFIX_EXPRESSION(ASTNode.PREFIX_EXPRESSION, PrefixExpression.class), /** * @see ASTNode#PRIMITIVE_TYPE */ PRIMITIVE_TYPE(ASTNode.PRIMITIVE_TYPE, PrimitiveType.class), /** * @see ASTNode#QUALIFIED_NAME */ QUALIFIED_NAME(ASTNode.QUALIFIED_NAME, QualifiedName.class), /** * @see ASTNode#RETURN_STATEMENT */ RETURN_STATEMENT(ASTNode.RETURN_STATEMENT, ReturnStatement.class), /** * @see ASTNode#SIMPLE_NAME */ SIMPLE_NAME(ASTNode.SIMPLE_NAME, SimpleName.class), /** * @see ASTNode#SIMPLE_TYPE */ SIMPLE_TYPE(ASTNode.SIMPLE_TYPE, SimpleType.class), /** * @see ASTNode#SINGLE_VARIABLE_DECLARATION */ SINGLE_VARIABLE_DECLARATION(ASTNode.SINGLE_VARIABLE_DECLARATION, SingleVariableDeclaration.class), /** * @see ASTNode#STRING_LITERAL */ STRING_LITERAL(ASTNode.STRING_LITERAL, StringLiteral.class), /** * @see ASTNode#SUPER_CONSTRUCTOR_INVOCATION */ SUPER_CONSTRUCTOR_INVOCATION(ASTNode.SUPER_CONSTRUCTOR_INVOCATION, SuperConstructorInvocation.class), /** * @see ASTNode#SUPER_FIELD_ACCESS */ SUPER_FIELD_ACCESS(ASTNode.SUPER_FIELD_ACCESS, SuperFieldAccess.class), /** * @see ASTNode#SUPER_METHOD_INVOCATION */ SUPER_METHOD_INVOCATION(ASTNode.SUPER_METHOD_INVOCATION, SuperMethodInvocation.class), /** * @see ASTNode#SWITCH_CASE */ SWITCH_CASE(ASTNode.SWITCH_CASE, SwitchCase.class), /** * @see ASTNode#SWITCH_STATEMENT */ SWITCH_STATEMENT(ASTNode.SWITCH_STATEMENT, SwitchStatement.class), /** * @see ASTNode#SYNCHRONIZED_STATEMENT */ SYNCHRONIZED_STATEMENT(ASTNode.SYNCHRONIZED_STATEMENT, SynchronizedStatement.class), /** * @see ASTNode#THIS_EXPRESSION */ THIS_EXPRESSION(ASTNode.THIS_EXPRESSION, ThisExpression.class), /** * @see ASTNode#THROW_STATEMENT */ THROW_STATEMENT(ASTNode.THROW_STATEMENT, ThrowStatement.class), /** * @see ASTNode#TRY_STATEMENT */ TRY_STATEMENT(ASTNode.TRY_STATEMENT, TryStatement.class), /** * @see ASTNode#TYPE_DECLARATION */ TYPE_DECLARATION(ASTNode.TYPE_DECLARATION, TypeDeclaration.class), /** * @see ASTNode#TYPE_DECLARATION_STATEMENT */ TYPE_DECLARATION_STATEMENT(ASTNode.TYPE_DECLARATION_STATEMENT, TypeDeclarationStatement.class), /** * @see ASTNode#TYPE_LITERAL */ TYPE_LITERAL(ASTNode.TYPE_LITERAL, TypeLiteral.class), /** * @see ASTNode#VARIABLE_DECLARATION_EXPRESSION */ VARIABLE_DECLARATION_EXPRESSION(ASTNode.VARIABLE_DECLARATION_EXPRESSION, VariableDeclarationExpression.class), /** * @see ASTNode#VARIABLE_DECLARATION_FRAGMENT */ VARIABLE_DECLARATION_FRAGMENT(ASTNode.VARIABLE_DECLARATION_FRAGMENT, VariableDeclarationFragment.class), /** * @see ASTNode#VARIABLE_DECLARATION_STATEMENT */ VARIABLE_DECLARATION_STATEMENT(ASTNode.VARIABLE_DECLARATION_STATEMENT, VariableDeclarationStatement.class), /** * @see ASTNode#WHILE_STATEMENT */ WHILE_STATEMENT(ASTNode.WHILE_STATEMENT, WhileStatement.class), /** * @see ASTNode#INSTANCEOF_EXPRESSION */ INSTANCEOF_EXPRESSION(ASTNode.INSTANCEOF_EXPRESSION, InstanceofExpression.class), /** * @see ASTNode#LINE_COMMENT */ LINE_COMMENT(ASTNode.LINE_COMMENT, LineComment.class), /** * @see ASTNode#BLOCK_COMMENT */ BLOCK_COMMENT(ASTNode.BLOCK_COMMENT, BlockComment.class), /** * @see ASTNode#TAG_ELEMENT */ TAG_ELEMENT(ASTNode.TAG_ELEMENT, TagElement.class), /** * @see ASTNode#TEXT_ELEMENT */ TEXT_ELEMENT(ASTNode.TEXT_ELEMENT, TextElement.class), /** * @see ASTNode#MEMBER_REF */ MEMBER_REF(ASTNode.MEMBER_REF, MemberRef.class), /** * @see ASTNode#METHOD_REF */ METHOD_REF(ASTNode.METHOD_REF, MethodRef.class), /** * @see ASTNode#METHOD_REF_PARAMETER */ METHOD_REF_PARAMETER(ASTNode.METHOD_REF_PARAMETER, MethodRefParameter.class), /** * @see ASTNode#ENHANCED_FOR_STATEMENT */ ENHANCED_FOR_STATEMENT(ASTNode.ENHANCED_FOR_STATEMENT, EnhancedForStatement.class), /** * @see ASTNode#ENUM_DECLARATION */ ENUM_DECLARATION(ASTNode.ENUM_DECLARATION, EnumDeclaration.class), /** * @see ASTNode#ENUM_CONSTANT_DECLARATION */ ENUM_CONSTANT_DECLARATION(ASTNode.ENUM_CONSTANT_DECLARATION, EnumConstantDeclaration.class), /** * @see ASTNode#TYPE_PARAMETER */ TYPE_PARAMETER(ASTNode.TYPE_PARAMETER, TypeParameter.class), /** * @see ASTNode#PARAMETERIZED_TYPE */ PARAMETERIZED_TYPE(ASTNode.PARAMETERIZED_TYPE, ParameterizedType.class), /** * @see ASTNode#QUALIFIED_TYPE */ QUALIFIED_TYPE(ASTNode.QUALIFIED_TYPE, QualifiedType.class), /** * @see ASTNode#WILDCARD_TYPE */ WILDCARD_TYPE(ASTNode.WILDCARD_TYPE, WildcardType.class), /** * @see ASTNode#NORMAL_ANNOTATION */ NORMAL_ANNOTATION(ASTNode.NORMAL_ANNOTATION, NormalAnnotation.class), /** * @see ASTNode#MARKER_ANNOTATION */ MARKER_ANNOTATION(ASTNode.MARKER_ANNOTATION, MarkerAnnotation.class), /** * @see ASTNode#SINGLE_MEMBER_ANNOTATION */ SINGLE_MEMBER_ANNOTATION(ASTNode.SINGLE_MEMBER_ANNOTATION, SingleMemberAnnotation.class), /** * @see ASTNode#MEMBER_VALUE_PAIR */ MEMBER_VALUE_PAIR(ASTNode.MEMBER_VALUE_PAIR, MemberValuePair.class), /** * @see ASTNode#ANNOTATION_TYPE_DECLARATION */ ANNOTATION_TYPE_DECLARATION(ASTNode.ANNOTATION_TYPE_DECLARATION, AnnotationTypeDeclaration.class), /** * @see ASTNode#ANNOTATION_TYPE_MEMBER_DECLARATION */ ANNOTATION_TYPE_MEMBER_DECLARATION(ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION, AnnotationTypeMemberDeclaration.class), /** * @see ASTNode#MODIFIER */ MODIFIER(ASTNode.MODIFIER, Modifier.class), /** * @see ASTNode#UNION_TYPE */ UNION_TYPE(ASTNode.UNION_TYPE, UnionType.class); private static final IntegralConstantSupport<NodeType> integers = IntegralConstantSupport.of(NodeType.class); private static final TypeConstantSupport<NodeType, ASTNode> types = TypeConstantSupport.of(NodeType.class); private static final int count = values().length; private final String name; private final int value; private final Class<? extends ASTNode> type; private NodeType(final int value, final Class<? extends ASTNode> type) { assert type != null; this.name = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, this.name()); this.value = value; this.type = type; } public static int count() { return count; } public static Set<Integer> valuesAsIntegers() { return integers.getIntegers(); } public static Set<Class<? extends ASTNode>> valuesAsTypes() { return types.getTypes(); } public static NodeType valueOf(final int value) { return integers.getConstant(value); } public static NodeType valueOf(final Class<? extends ASTNode> type) { return types.getConstant(type); } public static NodeType valueOf(final ASTNode node) { return valueOf(node.getNodeType()); } public static Set<NodeType> setOf(final Iterable<Class<? extends ASTNode>> types) { Set<NodeType> result = newHashSet(); for (Class<? extends ASTNode> type: types) { result.add(valueOf(type)); } return result; } public static boolean isInstance(@Nullable final ASTNode node, final NodeType a) { return node != null && a.isInstance(node); } public static boolean isInstance(@Nullable final ASTNode node, final NodeType a, final NodeType b) { return node != null && (a.isInstance(node) || b.isInstance(node)); } public static boolean isInstance(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c) { return node != null && (a.isInstance(node) || b.isInstance(node) || c.isInstance(node)); } public static boolean isInstance(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c, final NodeType d) { return node != null && (a.isInstance(node) || b.isInstance(node) || c.isInstance(node) || d.isInstance(node)); } public static boolean isInstance(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c, final NodeType d, final NodeType ... rest) { return isInstance(node, a, b, c, d) || isInstance(node, asList(rest)); } public static boolean isInstance(@Nullable final ASTNode node, final Iterable<NodeType> types) { if (node == null) { return false; } for (NodeType type: types) { if (type.isInstance(node)) { return true; } } return false; } public static boolean isMatching(@Nullable final ASTNode node, final NodeType a) { return node != null && a.isMatching(node); } public static boolean isMatching(@Nullable final ASTNode node, final NodeType a, final NodeType b) { return node != null && (a.isMatching(node) || b.isMatching(node)); } public static boolean isMatching(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c) { return node != null && (a.isMatching(node) || b.isMatching(node) || c.isMatching(node)); } public static boolean isMatching(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c, final NodeType d) { return node != null && (a.isMatching(node) || b.isMatching(node) || c.isMatching(node) || d.isMatching(node)); } public static boolean isMatching(@Nullable final ASTNode node, final NodeType a, final NodeType b, final NodeType c, final NodeType d, final NodeType ... rest) { return isMatching(node, a, b, c, d) || isMatching(node, asList(rest)); } public static boolean isMatching(@Nullable final ASTNode node, final Iterable<NodeType> types) { if (node == null) { return false; } for (NodeType type: types) { if (type.isMatching(node)) { return true; } } return false; } public boolean isInstance(@Nullable final ASTNode node) { return node != null && this.type.isInstance(node); } public boolean isMatching(@Nullable final ASTNode node) { return node != null && this.value == node.getNodeType(); } @Override public String toString() { return this.getName(); } public String getName() { return this.name; } public int getValue() { return this.value; } public Class<? extends ASTNode> getType() { return this.type; } }