/** * Copyright 2011-2017 Asakusa Framework Team. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.asakusafw.utils.java.model.syntax; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Represents a kind of {@link Model}. * @since 0.1.0 * @version 0.9.1 */ public enum ModelKind { /** * Represents {@link AlternateConstructorInvocation}. */ ALTERNATE_CONSTRUCTOR_INVOCATION(AlternateConstructorInvocation.class, new PropertyKind[] { PropertyKind.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENTS, PropertyKind.CONSTRUCTOR_INVOCATION_ARGUMENTS, }), /** * Represents {@link AnnotationDeclaration}. */ ANNOTATION_DECLARATION(AnnotationDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.TYPE_DECLARATION_NAME, PropertyKind.TYPE_DECLARATION_BODY_DECLARATIONS, }), /** * Represents {@link AnnotationElement}. */ ANNOTATION_ELEMENT(AnnotationElement.class, new PropertyKind[] { PropertyKind.ANNOTATION_ELEMENT_NAME, PropertyKind.ANNOTATION_ELEMENT_EXPRESSION, }), /** * Represents {@link AnnotationElementDeclaration}. */ ANNOTATION_ELEMENT_DECLARATION(AnnotationElementDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.ANNOTATION_ELEMENT_DECLARATION_TYPE, PropertyKind.ANNOTATION_ELEMENT_DECLARATION_NAME, PropertyKind.ANNOTATION_ELEMENT_DECLARATION_DEFAULT_EXPRESSION, }), /** * Represents {@link ArrayAccessExpression}. */ ARRAY_ACCESS_EXPRESSION(ArrayAccessExpression.class, new PropertyKind[] { PropertyKind.ARRAY_ACCESS_EXPRESSION_ARRAY, PropertyKind.ARRAY_ACCESS_EXPRESSION_INDEX, }), /** * Represents {@link ArrayCreationExpression}. */ ARRAY_CREATION_EXPRESSION(ArrayCreationExpression.class, new PropertyKind[] { PropertyKind.ARRAY_CREATION_EXPRESSION_TYPE, PropertyKind.ARRAY_CREATION_EXPRESSION_DIMENSION_EXPRESSIONS, PropertyKind.ARRAY_CREATION_EXPRESSION_ARRAY_INITIALIZER, }), /** * Represents {@link ArrayInitializer}. */ ARRAY_INITIALIZER(ArrayInitializer.class, new PropertyKind[] { PropertyKind.ARRAY_INITIALIZER_ELEMENTS, }), /** * Represents {@link ArrayType}. */ ARRAY_TYPE(ArrayType.class, new PropertyKind[] { PropertyKind.ARRAY_TYPE_COMPONENT_TYPE, }), /** * Represents {@link AssertStatement}. */ ASSERT_STATEMENT(AssertStatement.class, new PropertyKind[] { PropertyKind.ASSERT_STATEMENT_EXPRESSION, PropertyKind.ASSERT_STATEMENT_MESSAGE, }), /** * Represents {@link AssignmentExpression}. */ ASSIGNMENT_EXPRESSION(AssignmentExpression.class, new PropertyKind[] { PropertyKind.ASSIGNMENT_EXPRESSION_LEFT_HAND_SIDE, PropertyKind.ASSIGNMENT_EXPRESSION_OPERATOR, PropertyKind.ASSIGNMENT_EXPRESSION_RIGHT_HAND_SIDE, }), /** * Represents {@link BasicType}. */ BASIC_TYPE(BasicType.class, new PropertyKind[] { PropertyKind.BASIC_TYPE_TYPE_KIND, }), /** * Represents {@link Block}. */ BLOCK(Block.class, new PropertyKind[] { PropertyKind.BLOCK_STATEMENTS, }), /** * Represents {@link BlockComment}. */ BLOCK_COMMENT(BlockComment.class, new PropertyKind[] { PropertyKind.BLOCK_COMMENT_STRING, }), /** * Represents {@link BreakStatement}. */ BREAK_STATEMENT(BreakStatement.class, new PropertyKind[] { PropertyKind.BRANCH_STATEMENT_TARGET, }), /** * Represents {@link CastExpression}. */ CAST_EXPRESSION(CastExpression.class, new PropertyKind[] { PropertyKind.CAST_EXPRESSION_TYPE, PropertyKind.CAST_EXPRESSION_EXPRESSION, }), /** * Represents {@link CatchClause}. */ CATCH_CLAUSE(CatchClause.class, new PropertyKind[] { PropertyKind.CATCH_CLAUSE_PARAMETER, PropertyKind.CATCH_CLAUSE_BODY, }), /** * Represents {@link ClassBody}. */ CLASS_BODY(ClassBody.class, new PropertyKind[] { PropertyKind.CLASS_BODY_BODY_DECLARATIONS, }), /** * Represents {@link ClassDeclaration}. */ CLASS_DECLARATION(ClassDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.TYPE_DECLARATION_NAME, PropertyKind.CLASS_DECLARATION_TYPE_PARAMETERS, PropertyKind.CLASS_DECLARATION_SUPER_CLASS, PropertyKind.CLASS_DECLARATION_SUPER_INTERFACE_TYPES, PropertyKind.TYPE_DECLARATION_BODY_DECLARATIONS, }), /** * Represents {@link ClassInstanceCreationExpression}. */ CLASS_INSTANCE_CREATION_EXPRESSION(ClassInstanceCreationExpression.class, new PropertyKind[] { PropertyKind.CLASS_INSTANCE_CREATION_EXPRESSION_QUALIFIER, PropertyKind.CLASS_INSTANCE_CREATION_EXPRESSION_TYPE_ARGUMENTS, PropertyKind.CLASS_INSTANCE_CREATION_EXPRESSION_TYPE, PropertyKind.CLASS_INSTANCE_CREATION_EXPRESSION_ARGUMENTS, PropertyKind.CLASS_INSTANCE_CREATION_EXPRESSION_BODY, }), /** * Represents {@link ClassLiteral}. */ CLASS_LITERAL(ClassLiteral.class, new PropertyKind[] { PropertyKind.CLASS_LITERAL_TYPE, }), /** * Represents {@link CompilationUnit}. */ COMPILATION_UNIT(CompilationUnit.class, new PropertyKind[] { PropertyKind.COMPILATION_UNIT_PACKAGE_DECLARATION, PropertyKind.COMPILATION_UNIT_IMPORT_DECLARATIONS, PropertyKind.COMPILATION_UNIT_TYPE_DECLARATIONS, PropertyKind.COMPILATION_UNIT_COMMENTS, }), /** * Represents {@link ConditionalExpression}. */ CONDITIONAL_EXPRESSION(ConditionalExpression.class, new PropertyKind[] { PropertyKind.CONDITIONAL_EXPRESSION_CONDITION, PropertyKind.CONDITIONAL_EXPRESSION_THEN_EXPRESSION, PropertyKind.CONDITIONAL_EXPRESSION_ELSE_EXPRESSION, }), /** * Represents {@link ConstructorDeclaration}. */ CONSTRUCTOR_DECLARATION(ConstructorDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_TYPE_PARAMETERS, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_NAME, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_FORMAL_PARAMETERS, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_EXCEPTION_TYPES, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_BODY, }), /** * Represents {@link ContinueStatement}. */ CONTINUE_STATEMENT(ContinueStatement.class, new PropertyKind[] { PropertyKind.BRANCH_STATEMENT_TARGET, }), /** * Represents {@link DoStatement}. */ DO_STATEMENT(DoStatement.class, new PropertyKind[] { PropertyKind.DO_STATEMENT_BODY, PropertyKind.DO_STATEMENT_CONDITION, }), /** * Represents {@link DocBlock}. */ DOC_BLOCK(DocBlock.class, new PropertyKind[] { PropertyKind.DOC_BLOCK_TAG, PropertyKind.DOC_BLOCK_ELEMENTS, }), /** * Represents {@link DocField}. */ DOC_FIELD(DocField.class, new PropertyKind[] { PropertyKind.DOC_FIELD_TYPE, PropertyKind.DOC_FIELD_NAME, }), /** * Represents {@link DocMethod}. */ DOC_METHOD(DocMethod.class, new PropertyKind[] { PropertyKind.DOC_METHOD_TYPE, PropertyKind.DOC_METHOD_NAME, PropertyKind.DOC_METHOD_FORMAL_PARAMETERS, }), /** * Represents {@link DocMethodParameter}. */ DOC_METHOD_PARAMETER(DocMethodParameter.class, new PropertyKind[] { PropertyKind.DOC_METHOD_PARAMETER_TYPE, PropertyKind.DOC_METHOD_PARAMETER_NAME, PropertyKind.DOC_METHOD_PARAMETER_VARIABLE_ARITY, }), /** * Represents {@link DocText}. */ DOC_TEXT(DocText.class, new PropertyKind[] { PropertyKind.DOC_TEXT_STRING, }), /** * Represents {@link EmptyStatement}. */ EMPTY_STATEMENT(EmptyStatement.class, new PropertyKind[] { }), /** * Represents {@link EnhancedForStatement}. */ ENHANCED_FOR_STATEMENT(EnhancedForStatement.class, new PropertyKind[] { PropertyKind.ENHANCED_FOR_STATEMENT_PARAMETER, PropertyKind.ENHANCED_FOR_STATEMENT_EXPRESSION, PropertyKind.ENHANCED_FOR_STATEMENT_BODY, }), /** * Represents {@link EnumConstantDeclaration}. */ ENUM_CONSTANT_DECLARATION(EnumConstantDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.ENUM_CONSTANT_DECLARATION_NAME, PropertyKind.ENUM_CONSTANT_DECLARATION_ARGUMENTS, PropertyKind.ENUM_CONSTANT_DECLARATION_BODY, }), /** * Represents {@link EnumDeclaration}. */ ENUM_DECLARATION(EnumDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.TYPE_DECLARATION_NAME, PropertyKind.ENUM_DECLARATION_SUPER_INTERFACE_TYPES, PropertyKind.ENUM_DECLARATION_CONSTANT_DECLARATIONS, PropertyKind.TYPE_DECLARATION_BODY_DECLARATIONS, }), /** * Represents {@link ExpressionStatement}. */ EXPRESSION_STATEMENT(ExpressionStatement.class, new PropertyKind[] { PropertyKind.EXPRESSION_STATEMENT_EXPRESSION, }), /** * Represents {@link FieldAccessExpression}. */ FIELD_ACCESS_EXPRESSION(FieldAccessExpression.class, new PropertyKind[] { PropertyKind.FIELD_ACCESS_EXPRESSION_QUALIFIER, PropertyKind.FIELD_ACCESS_EXPRESSION_NAME, }), /** * Represents {@link FieldDeclaration}. */ FIELD_DECLARATION(FieldDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.FIELD_DECLARATION_TYPE, PropertyKind.FIELD_DECLARATION_VARIABLE_DECLARATORS, }), /** * Represents {@link ForStatement}. */ FOR_STATEMENT(ForStatement.class, new PropertyKind[] { PropertyKind.FOR_STATEMENT_INITIALIZATION, PropertyKind.FOR_STATEMENT_CONDITION, PropertyKind.FOR_STATEMENT_UPDATE, PropertyKind.FOR_STATEMENT_BODY, }), /** * Represents {@link FormalParameterDeclaration}. */ FORMAL_PARAMETER_DECLARATION(FormalParameterDeclaration.class, new PropertyKind[] { PropertyKind.FORMAL_PARAMETER_DECLARATION_MODIFIERS, PropertyKind.FORMAL_PARAMETER_DECLARATION_TYPE, PropertyKind.FORMAL_PARAMETER_DECLARATION_VARIABLE_ARITY, PropertyKind.FORMAL_PARAMETER_DECLARATION_NAME, PropertyKind.FORMAL_PARAMETER_DECLARATION_EXTRA_DIMENSIONS, }), /** * Represents {@link IfStatement}. */ IF_STATEMENT(IfStatement.class, new PropertyKind[] { PropertyKind.IF_STATEMENT_CONDITION, PropertyKind.IF_STATEMENT_THEN_STATEMENT, PropertyKind.IF_STATEMENT_ELSE_STATEMENT, }), /** * Represents {@link ImportDeclaration}. */ IMPORT_DECLARATION(ImportDeclaration.class, new PropertyKind[] { PropertyKind.IMPORT_DECLARATION_IMPORT_KIND, PropertyKind.IMPORT_DECLARATION_NAME, }), /** * Represents {@link InfixExpression}. */ INFIX_EXPRESSION(InfixExpression.class, new PropertyKind[] { PropertyKind.INFIX_EXPRESSION_LEFT_OPERAND, PropertyKind.INFIX_EXPRESSION_OPERATOR, PropertyKind.INFIX_EXPRESSION_RIGHT_OPERAND, }), /** * Represents {@link InitializerDeclaration}. */ INITIALIZER_DECLARATION(InitializerDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.INITIALIZER_DECLARATION_BODY, }), /** * Represents {@link InstanceofExpression}. */ INSTANCEOF_EXPRESSION(InstanceofExpression.class, new PropertyKind[] { PropertyKind.INSTANCEOF_EXPRESSION_EXPRESSION, PropertyKind.INSTANCEOF_EXPRESSION_TYPE, }), /** * Represents {@link InterfaceDeclaration}. */ INTERFACE_DECLARATION(InterfaceDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.TYPE_DECLARATION_NAME, PropertyKind.INTERFACE_DECLARATION_TYPE_PARAMETERS, PropertyKind.INTERFACE_DECLARATION_SUPER_INTERFACE_TYPES, PropertyKind.TYPE_DECLARATION_BODY_DECLARATIONS, }), /** * Represents {@link Javadoc}. */ JAVADOC(Javadoc.class, new PropertyKind[] { PropertyKind.JAVADOC_BLOCKS, }), /** * Represents {@link LabeledStatement}. */ LABELED_STATEMENT(LabeledStatement.class, new PropertyKind[] { PropertyKind.LABELED_STATEMENT_LABEL, PropertyKind.LABELED_STATEMENT_BODY, }), /** * Represents {@link LambdaExpression}. * @since 0.9.0 */ LAMBDA_EXPRESSION(LabeledStatement.class, new PropertyKind[] { PropertyKind.LAMBDA_EXPRESSION_PARAMETERS, PropertyKind.LAMBDA_EXPRESSION_BODY, }), /** * Represents {@link LineComment}. */ LINE_COMMENT(LineComment.class, new PropertyKind[] { PropertyKind.LINE_COMMENT_STRING, }), /** * Represents {@link Literal}. */ LITERAL(Literal.class, new PropertyKind[] { PropertyKind.LITERAL_TOKEN, }), /** * Represents {@link LocalClassDeclaration}. */ LOCAL_CLASS_DECLARATION(LocalClassDeclaration.class, new PropertyKind[] { PropertyKind.LOCAL_CLASS_DECLARATION_DECLARATION, }), /** * Represents {@link LocalVariableDeclaration}. */ LOCAL_VARIABLE_DECLARATION(LocalVariableDeclaration.class, new PropertyKind[] { PropertyKind.LOCAL_VARIABLE_DECLARATION_MODIFIERS, PropertyKind.LOCAL_VARIABLE_DECLARATION_TYPE, PropertyKind.LOCAL_VARIABLE_DECLARATION_VARIABLE_DECLARATORS, }), /** * Represents {@link MarkerAnnotation}. */ MARKER_ANNOTATION(MarkerAnnotation.class, new PropertyKind[] { PropertyKind.ANNOTATION_TYPE, }), /** * Represents {@link MethodDeclaration}. */ METHOD_DECLARATION(MethodDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_BODY_DECLARATION_JAVADOC, PropertyKind.TYPE_BODY_DECLARATION_MODIFIERS, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_TYPE_PARAMETERS, PropertyKind.METHOD_DECLARATION_RETURN_TYPE, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_NAME, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_FORMAL_PARAMETERS, PropertyKind.METHOD_DECLARATION_EXTRA_DIMENSIONS, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_EXCEPTION_TYPES, PropertyKind.METHOD_OR_CONSTRUCTOR_DECLARATION_BODY, }), /** * Represents {@link MethodInvocationExpression}. */ METHOD_INVOCATION_EXPRESSION(MethodInvocationExpression.class, new PropertyKind[] { PropertyKind.METHOD_INVOCATION_EXPRESSION_QUALIFIER, PropertyKind.METHOD_INVOCATION_EXPRESSION_TYPE_ARGUMENTS, PropertyKind.METHOD_INVOCATION_EXPRESSION_NAME, PropertyKind.METHOD_INVOCATION_EXPRESSION_ARGUMENTS, }), /** * Represents {@link MethodReferenceExpression}. * @since 0.9.1 */ METHOD_REFERENCE_EXPRESSION(MethodReferenceExpression.class, new PropertyKind[] { PropertyKind.METHOD_OR_CONSTRUCTOR_REFERENCE_EXPRESSION_QUALIFIER, PropertyKind.METHOD_OR_CONSTRUCTOR_REFERENCE_EXPRESSION_TYPE_ARGUMENTS, PropertyKind.METHOD_REFERENCE_EXPRESSION_NAME, }), /** * Represents {@link ConstructorReferenceExpression}. * @since 0.9.1 */ CONSTRUCTOR_REFERENCE_EXPRESSION(ConstructorReferenceExpression.class, new PropertyKind[] { PropertyKind.METHOD_OR_CONSTRUCTOR_REFERENCE_EXPRESSION_QUALIFIER, PropertyKind.METHOD_OR_CONSTRUCTOR_REFERENCE_EXPRESSION_TYPE_ARGUMENTS, }), /** * Represents {@link Modifier}. */ MODIFIER(Modifier.class, new PropertyKind[] { PropertyKind.MODIFIER_MODIFIER_KIND, }), /** * Represents {@link NamedType}. */ NAMED_TYPE(NamedType.class, new PropertyKind[] { PropertyKind.NAMED_TYPE_NAME, }), /** * Represents {@link NormalAnnotation}. */ NORMAL_ANNOTATION(NormalAnnotation.class, new PropertyKind[] { PropertyKind.ANNOTATION_TYPE, PropertyKind.NORMAL_ANNOTATION_ELEMENTS, }), /** * Represents {@link PackageDeclaration}. */ PACKAGE_DECLARATION(PackageDeclaration.class, new PropertyKind[] { PropertyKind.PACKAGE_DECLARATION_JAVADOC, PropertyKind.PACKAGE_DECLARATION_ANNOTATIONS, PropertyKind.PACKAGE_DECLARATION_NAME, }), /** * Represents {@link ParameterizedType}. */ PARAMETERIZED_TYPE(ParameterizedType.class, new PropertyKind[] { PropertyKind.PARAMETERIZED_TYPE_TYPE, PropertyKind.PARAMETERIZED_TYPE_TYPE_ARGUMENTS, }), /** * Represents {@link ParenthesizedExpression}. */ PARENTHESIZED_EXPRESSION(ParenthesizedExpression.class, new PropertyKind[] { PropertyKind.PARENTHESIZED_EXPRESSION_EXPRESSION, }), /** * Represents {@link PostfixExpression}. */ POSTFIX_EXPRESSION(PostfixExpression.class, new PropertyKind[] { PropertyKind.POSTFIX_EXPRESSION_OPERAND, PropertyKind.POSTFIX_EXPRESSION_OPERATOR, }), /** * Represents {@link QualifiedName}. */ QUALIFIED_NAME(QualifiedName.class, new PropertyKind[] { PropertyKind.QUALIFIED_NAME_QUALIFIER, PropertyKind.QUALIFIED_NAME_SIMPLE_NAME, }), /** * Represents {@link QualifiedType}. */ QUALIFIED_TYPE(QualifiedType.class, new PropertyKind[] { PropertyKind.QUALIFIED_TYPE_QUALIFIER, PropertyKind.QUALIFIED_TYPE_SIMPLE_NAME, }), /** * Represents {@link ReturnStatement}. */ RETURN_STATEMENT(ReturnStatement.class, new PropertyKind[] { PropertyKind.RETURN_STATEMENT_EXPRESSION, }), /** * Represents {@link SimpleName}. */ SIMPLE_NAME(SimpleName.class, new PropertyKind[] { PropertyKind.SIMPLE_NAME_STRING, }), /** * Represents {@link SingleElementAnnotation}. */ SINGLE_ELEMENT_ANNOTATION(SingleElementAnnotation.class, new PropertyKind[] { PropertyKind.ANNOTATION_TYPE, PropertyKind.SINGLE_ELEMENT_ANNOTATION_EXPRESSION, }), /** * Represents {@link StatementExpressionList}. */ STATEMENT_EXPRESSION_LIST(StatementExpressionList.class, new PropertyKind[] { PropertyKind.STATEMENT_EXPRESSION_LIST_EXPRESSIONS, }), /** * Represents {@link Super}. */ SUPER(Super.class, new PropertyKind[] { PropertyKind.KEYWORD_QUALIFIER, }), /** * Represents {@link SuperConstructorInvocation}. */ SUPER_CONSTRUCTOR_INVOCATION(SuperConstructorInvocation.class, new PropertyKind[] { PropertyKind.SUPER_CONSTRUCTOR_INVOCATION_QUALIFIER, PropertyKind.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENTS, PropertyKind.CONSTRUCTOR_INVOCATION_ARGUMENTS, }), /** * Represents {@link SwitchCaseLabel}. */ SWITCH_CASE_LABEL(SwitchCaseLabel.class, new PropertyKind[] { PropertyKind.SWITCH_CASE_LABEL_EXPRESSION, }), /** * Represents {@link SwitchDefaultLabel}. */ SWITCH_DEFAULT_LABEL(SwitchDefaultLabel.class, new PropertyKind[] { }), /** * Represents {@link SwitchStatement}. */ SWITCH_STATEMENT(SwitchStatement.class, new PropertyKind[] { PropertyKind.SWITCH_STATEMENT_EXPRESSION, PropertyKind.SWITCH_STATEMENT_STATEMENTS, }), /** * Represents {@link SynchronizedStatement}. */ SYNCHRONIZED_STATEMENT(SynchronizedStatement.class, new PropertyKind[] { PropertyKind.SYNCHRONIZED_STATEMENT_EXPRESSION, PropertyKind.SYNCHRONIZED_STATEMENT_BODY, }), /** * Represents {@link This}. */ THIS(This.class, new PropertyKind[] { PropertyKind.KEYWORD_QUALIFIER, }), /** * Represents {@link ThrowStatement}. */ THROW_STATEMENT(ThrowStatement.class, new PropertyKind[] { PropertyKind.THROW_STATEMENT_EXPRESSION, }), /** * Represents {@link TryResource}. */ TRY_RESOURCE(TryResource.class, new PropertyKind[] { PropertyKind.TRY_RESOURCE_PARAMETER, PropertyKind.TRY_RESOURCE_INITIALIZER, }), /** * Represents {@link TryStatement}. */ TRY_STATEMENT(TryStatement.class, new PropertyKind[] { PropertyKind.TRY_STATEMENT_RESOURCES, PropertyKind.TRY_STATEMENT_TRY_BLOCK, PropertyKind.TRY_STATEMENT_CATCH_CLAUSES, PropertyKind.TRY_STATEMENT_FINALLY_BLOCK, }), /** * Represents {@link TypeParameterDeclaration}. */ TYPE_PARAMETER_DECLARATION(TypeParameterDeclaration.class, new PropertyKind[] { PropertyKind.TYPE_PARAMETER_DECLARATION_NAME, PropertyKind.TYPE_PARAMETER_DECLARATION_TYPE_BOUNDS, }), /** * Represents {@link UnaryExpression}. */ UNARY_EXPRESSION(UnaryExpression.class, new PropertyKind[] { PropertyKind.UNARY_EXPRESSION_OPERATOR, PropertyKind.UNARY_EXPRESSION_OPERAND, }), /** * Represents {@link UnionType}. * @since 0.9.0 */ UNION_TYPE(UnaryExpression.class, new PropertyKind[] { PropertyKind.UNION_TYPE_ALTERNATIVE_TYPES, }), /** * Represents {@link VariableDeclarator}. */ VARIABLE_DECLARATOR(VariableDeclarator.class, new PropertyKind[] { PropertyKind.VARIABLE_DECLARATOR_NAME, PropertyKind.VARIABLE_DECLARATOR_EXTRA_DIMENSIONS, PropertyKind.VARIABLE_DECLARATOR_INITIALIZER, }), /** * Represents {@link WhileStatement}. */ WHILE_STATEMENT(WhileStatement.class, new PropertyKind[] { PropertyKind.WHILE_STATEMENT_CONDITION, PropertyKind.WHILE_STATEMENT_BODY, }), /** * Represents {@link Wildcard}. */ WILDCARD(Wildcard.class, new PropertyKind[] { PropertyKind.WILDCARD_BOUND_KIND, PropertyKind.WILDCARD_TYPE_BOUND, }), ; private Class<? extends Model> interfaceType; private List<PropertyKind> properties; ModelKind(Class<? extends Model> interfaceType, PropertyKind[] properties) { assert interfaceType != null; assert properties != null; this.interfaceType = interfaceType; this.properties = Collections.unmodifiableList(Arrays.asList(properties)); } /** * Returns the interface type of this model kind. * @return the interface type of this model kind */ public Class<? extends Model> getInterfaceType() { return interfaceType; } /** * Returns property kinds in this model kind. * @return property kinds */ public List<PropertyKind> getProperties() { return properties; } }