Search in sources :

Example 16 with Annotation

use of dyvilx.tools.compiler.ast.attribute.annotation.Annotation in project Dyvil by Dyvil.

the class ClassDeclarationParser method parse.

@Override
public void parse(IParserManager pm, IToken token) {
    int type = token.type();
    switch(this.mode) {
        case NAME:
            if (!Tokens.isIdentifier(type)) {
                pm.report(token, "class.identifier");
                return;
            }
            final Name name = token.nameValue();
            if (name.qualified.indexOf('$') >= 0) {
                pm.report(Markers.syntaxError(token, "class.identifier.invalid", name, name.qualified));
            }
            this.theClass = this.consumer.createClass(token.raw(), name, this.classAttributes);
            this.mode = GENERICS;
            return;
        case GENERICS:
            if (type == BaseSymbols.SEMICOLON && token.isInferred() && TypeParser.isGenericStart(token.next())) {
                // allow an implicit semicolon / line break between name and generic argument list
                return;
            }
            if (TypeParser.isGenericStart(token, type)) {
                pm.splitJump(token, 1);
                pm.pushParser(new TypeParameterListParser(this.theClass));
                this.mode = GENERICS_END;
                return;
            }
        // Fallthrough
        case PARAMETERS:
            final Modifier modifier = ModifierParser.parseModifier(token, pm);
            if (modifier != null) {
                this.theClass.getConstructorAttributes().add(modifier);
                return;
            }
            if (type == DyvilSymbols.AT) {
                final Annotation annotation = new CodeAnnotation(token.raw());
                this.theClass.getConstructorAttributes().add(annotation);
                pm.pushParser(new AnnotationParser(annotation));
                return;
            }
            if (type == BaseSymbols.OPEN_PARENTHESIS) {
                pm.pushParser(new ParameterListParser(this.theClass).withFlags(ParameterListParser.ALLOW_PROPERTIES));
                this.mode = PARAMETERS_END;
                return;
            }
        // Fallthrough
        case EXTENDS:
            if (type == DyvilKeywords.EXTENDS) {
                if (this.theClass.isInterface()) {
                    pm.pushParser(new TypeListParser(this));
                    this.mode = BODY;
                    return;
                }
                pm.pushParser(new TypeParser(this));
                this.mode = EXTENDS_PARAMETERS;
                return;
            }
        // Fallthrough
        case IMPLEMENTS:
            if (type == DyvilKeywords.IMPLEMENTS) {
                pm.pushParser(new TypeListParser(this));
                this.mode = BODY;
                if (this.theClass.isInterface()) {
                    pm.report(token, "class.interface.implements");
                    return;
                }
                return;
            }
        // Fallthrough
        case BODY:
            if (type == BaseSymbols.OPEN_CURLY_BRACKET) {
                ClassBody body = new ClassBody(this.theClass);
                this.theClass.setBody(body);
                pm.pushParser(new ClassBodyParser(body), true);
                this.mode = BODY_END;
                return;
            }
            if (BaseSymbols.isTerminator(type)) {
                if (token.isInferred()) {
                    switch(token.next().type()) {
                        case DyvilKeywords.EXTENDS:
                            this.mode = EXTENDS;
                            return;
                        case DyvilKeywords.IMPLEMENTS:
                            this.mode = IMPLEMENTS;
                            return;
                        case BaseSymbols.OPEN_SQUARE_BRACKET:
                            this.mode = GENERICS;
                            return;
                        case BaseSymbols.OPEN_PARENTHESIS:
                            this.mode = PARAMETERS;
                            return;
                    }
                }
                pm.popParser(true);
                this.consumer.addClass(this.theClass);
                return;
            }
            this.mode = BODY_END;
            pm.report(token, "class.body.separator");
            return;
        case GENERICS_END:
            this.mode = PARAMETERS;
            if (TypeParser.isGenericEnd(token, type)) {
                pm.splitJump(token, 1);
                return;
            }
            pm.reparse();
            pm.report(token, "generic.close_angle");
            return;
        case PARAMETERS_END:
            this.mode = EXTENDS;
            if (type != BaseSymbols.CLOSE_PARENTHESIS) {
                pm.reparse();
                pm.report(token, "class.parameters.close_paren");
            }
            return;
        case BODY_END:
            pm.popParser();
            this.consumer.addClass(this.theClass);
            if (type != BaseSymbols.CLOSE_CURLY_BRACKET) {
                pm.reparse();
                pm.report(token, "class.body.close_brace");
            }
            return;
        case EXTENDS_PARAMETERS_END:
            this.mode = IMPLEMENTS;
            if (type != BaseSymbols.CLOSE_PARENTHESIS) {
                pm.reparse();
                pm.report(token, "class.extends.close_paren");
            }
            return;
        case EXTENDS_PARAMETERS:
            if (type == BaseSymbols.OPEN_PARENTHESIS) {
                ArgumentListParser.parseArguments(pm, token.next(), this.theClass::setSuperConstructorArguments);
                this.mode = EXTENDS_PARAMETERS_END;
                return;
            }
            this.mode = IMPLEMENTS;
            pm.reparse();
    }
}
Also used : CodeAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.CodeAnnotation) AnnotationParser(dyvilx.tools.compiler.parser.annotation.AnnotationParser) TypeParser(dyvilx.tools.compiler.parser.type.TypeParser) ParameterListParser(dyvilx.tools.compiler.parser.method.ParameterListParser) TypeParameterListParser(dyvilx.tools.compiler.parser.type.TypeParameterListParser) TypeListParser(dyvilx.tools.compiler.parser.type.TypeListParser) Modifier(dyvilx.tools.compiler.ast.attribute.modifiers.Modifier) TypeParameterListParser(dyvilx.tools.compiler.parser.type.TypeParameterListParser) Annotation(dyvilx.tools.compiler.ast.attribute.annotation.Annotation) CodeAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.CodeAnnotation) Name(dyvil.lang.Name) ClassBody(dyvilx.tools.compiler.ast.classes.ClassBody)

Example 17 with Annotation

use of dyvilx.tools.compiler.ast.attribute.annotation.Annotation in project Dyvil by Dyvil.

the class AnnotationReader method visitAnnotation.

@Override
public AnnotationVisitor visitAnnotation(String key, String desc) {
    Annotation annotation = new ExternalAnnotation(ClassFormat.extendedToType(desc));
    AnnotationExpr value = new AnnotationExpr(annotation);
    this.arguments.add(Name.fromRaw(key), value);
    return new AnnotationReader(value, annotation);
}
Also used : ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation) AnnotationExpr(dyvilx.tools.compiler.ast.expression.AnnotationExpr) Annotation(dyvilx.tools.compiler.ast.attribute.annotation.Annotation) ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation)

Example 18 with Annotation

use of dyvilx.tools.compiler.ast.attribute.annotation.Annotation in project Dyvil by Dyvil.

the class AnnotationValueReader method visitAnnotation.

@Override
public AnnotationVisitor visitAnnotation(String key, String desc) {
    Annotation annotation = new ExternalAnnotation(ClassFormat.extendedToType(desc));
    AnnotationExpr value = new AnnotationExpr(annotation);
    this.consumer.setValue(value);
    return new AnnotationReader(value, annotation);
}
Also used : ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation) AnnotationExpr(dyvilx.tools.compiler.ast.expression.AnnotationExpr) Annotation(dyvilx.tools.compiler.ast.attribute.annotation.Annotation) ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation)

Example 19 with Annotation

use of dyvilx.tools.compiler.ast.attribute.annotation.Annotation in project Dyvil by Dyvil.

the class ValueAnnotationVisitor method visitAnnotation.

@Override
public AnnotationVisitor visitAnnotation(String name, String desc) {
    Annotation annotation = new ExternalAnnotation(ClassFormat.extendedToType(desc));
    AnnotationExpr value = new AnnotationExpr(annotation);
    this.consumer.setValue(value);
    return new AnnotationReader(value, annotation);
}
Also used : ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation) AnnotationExpr(dyvilx.tools.compiler.ast.expression.AnnotationExpr) Annotation(dyvilx.tools.compiler.ast.attribute.annotation.Annotation) ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation)

Example 20 with Annotation

use of dyvilx.tools.compiler.ast.attribute.annotation.Annotation in project Dyvil by Dyvil.

the class Deprecation method checkAnnotations.

public static void checkAnnotations(IMember member, SourcePosition position, MarkerList markers) {
    if (member.hasModifier(Modifiers.DEPRECATED)) {
        checkDeprecation(member, position, markers);
    }
    Annotation annotation = member.getAnnotation(EXPERIMENTAL_CLASS);
    if (annotation != null) {
        checkExperimental(member, position, markers, annotation);
    }
    annotation = member.getAnnotation(USAGE_INFO_CLASS);
    if (annotation != null) {
        checkUsageInfo(member, position, markers, annotation);
    }
}
Also used : Annotation(dyvilx.tools.compiler.ast.attribute.annotation.Annotation) ExternalAnnotation(dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation)

Aggregations

Annotation (dyvilx.tools.compiler.ast.attribute.annotation.Annotation)25 IType (dyvilx.tools.compiler.ast.type.IType)10 ExternalAnnotation (dyvilx.tools.compiler.ast.attribute.annotation.ExternalAnnotation)9 CodeAnnotation (dyvilx.tools.compiler.ast.attribute.annotation.CodeAnnotation)6 AnnotationParser (dyvilx.tools.compiler.parser.annotation.AnnotationParser)6 Name (dyvil.lang.Name)4 IValue (dyvilx.tools.compiler.ast.expression.IValue)4 ArgumentList (dyvilx.tools.compiler.ast.parameter.ArgumentList)4 AnnotationExpr (dyvilx.tools.compiler.ast.expression.AnnotationExpr)3 IToken (dyvilx.tools.parsing.token.IToken)3 Modifier (dyvilx.tools.compiler.ast.attribute.modifiers.Modifier)2 IParameter (dyvilx.tools.compiler.ast.parameter.IParameter)2 ArrayType (dyvilx.tools.compiler.ast.type.compound.ArrayType)2 ElementType (java.lang.annotation.ElementType)2 Reason (dyvil.annotation.Deprecated.Reason)1 Modifiers (dyvil.reflect.Modifiers)1 MarkerLevel (dyvil.util.MarkerLevel)1 AttributeList (dyvilx.tools.compiler.ast.attribute.AttributeList)1 ClassBody (dyvilx.tools.compiler.ast.classes.ClassBody)1 IClass (dyvilx.tools.compiler.ast.classes.IClass)1