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();
}
}
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);
}
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);
}
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);
}
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);
}
}
Aggregations