Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ParseException when processing nested Annotations #110

Open
DPUkyle opened this issue May 24, 2017 · 1 comment
Open

ParseException when processing nested Annotations #110

DPUkyle opened this issue May 24, 2017 · 1 comment
Assignees

Comments

@DPUkyle
Copy link
Member

DPUkyle commented May 24, 2017

In Lab, create three files:

  1. Java type MuhAnnotation
package scratch;

@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Inherited
public @interface MuhAnnotation {
  public MuhSubAnnotation[] muhSubs() default {@MuhSubAnnotation("")};
}
  1. Java type MuhSubAnnotation
package scratch;

@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface MuhSubAnnotation {
  java.lang.String value();
}
  1. Gosu type MuhClass
package scratch

@MuhAnnotation
class MuhClass {}

Parsing MuhClass will complain that Error: (3, 1) No default constructor in scratch.MuhAnnotation.

I think this is a red herring. But the real error is that MuhAnnotation has ParseExceptions as it doesn't expect the nested type MuhSubAnnotation.

Using a similar example and using the command-line compiler, I can reproduce this ST:

Exception in thread "main" gw.lang.parser.exceptions.ParseResultsException: Errors: 

Unexpected token: '}' [line:1 col:38] in
line 1: {@scratch.MuhSubAnnotation(:value="")}
Line Number: 1  Column: 38

Expecting '}' to close statement block. [line:1 col:38] in
line 1: {@scratch.MuhSubAnnotation(:value="")}
Line Number: 1  Column: 38


	at gw.internal.gosu.parser.ParserBase.verifyParsedElement(ParserBase.java:292)
	at gw.internal.gosu.parser.ParserBase.verifyParsedElement(ParserBase.java:263)
	at gw.internal.gosu.parser.GosuParser.parseProgram(GosuParser.java:811)
	at gw.internal.gosu.parser.GosuParser.parseProgram(GosuParser.java:732)
	at gw.internal.gosu.parser.GosuParser.parseProgram(GosuParser.java:727)
	at gw.internal.gosu.parser.GosuParser.parseProgram(GosuParser.java:722)
	at gw.internal.gosu.parser.GosuParser.parseExpOrProgram(GosuParser.java:1083)
	at gw.internal.gosu.parser.java.classinfo.CompileTimeExpressionParser.parse(CompileTimeExpressionParser.java:66)
	at gw.internal.gosu.parser.AnnotationConstructorGenerator.makeDefaultValueExpression(AnnotationConstructorGenerator.java:201)
	at gw.internal.gosu.parser.AnnotationConstructorGenerator.makeLegacyAllArgsAnnotationConstructor(AnnotationConstructorGenerator.java:181)
	at gw.internal.gosu.parser.AnnotationConstructorGenerator.addLegacyConstructors(AnnotationConstructorGenerator.java:60)
	at gw.internal.gosu.parser.AnnotationConstructorGenerator.generateAnnotationConstructors(AnnotationConstructorGenerator.java:44)
	at gw.internal.gosu.parser.JavaTypeInfo$3.init(JavaTypeInfo.java:237)
	at gw.internal.gosu.parser.JavaTypeInfo$3.init(JavaTypeInfo.java:231)
	at gw.util.concurrent.LockingLazyVar.get(LockingLazyVar.java:53)
	at gw.internal.gosu.parser.JavaTypeInfo.getDeclaredConstructors(JavaTypeInfo.java:418)
	at gw.lang.reflect.FeatureManager.maybeInitConstructors(FeatureManager.java:434) - (scratch.MuhAnnotation)
	at gw.lang.reflect.FeatureManager.getConstructors(FeatureManager.java:250)
	at gw.internal.gosu.parser.JavaTypeInfo.getConstructors(JavaTypeInfo.java:377)
	at gw.internal.gosu.parser.JavaTypeInfo.getConstructors(JavaTypeInfo.java:371)
	at gw.internal.gosu.parser.JavaTypeInfo.getConstructor(JavaTypeInfo.java:396)
	at gw.internal.gosu.parser.GosuParser.parseNewExpressionOrAnnotation(GosuParser.java:4557)
	at gw.internal.gosu.parser.GosuParser._parseNewExpressionOrAnnotation(GosuParser.java:4304)
	at gw.internal.gosu.parser.GosuParser.parseNewExpressionOrAnnotation(GosuParser.java:4251)
	at gw.internal.gosu.parser.ParserBase.parseAnnotation(ParserBase.java:1869)
	at gw.internal.gosu.parser.ParserBase.parseModifiers(ParserBase.java:1674)
	at gw.internal.gosu.parser.GosuClassParser.parseModifiersForClass(GosuClassParser.java:2032)
	at gw.internal.gosu.parser.GosuClassParser.parseClassType(GosuClassParser.java:1901)
	at gw.internal.gosu.parser.GosuClassParser.parseHeader(GosuClassParser.java:1706)
	at gw.internal.gosu.parser.GosuClassParser.parseDefinitions(GosuClassParser.java:415)
	at gw.internal.gosu.parser.GosuClass.compileDefinitionsIfNeeded(GosuClass.java:1551)
	at gw.internal.gosu.parser.GosuClass.compileDefinitionsIfNeeded(GosuClass.java:1494)
	at gw.internal.gosu.parser.GosuClass.isValid(GosuClass.java:925)
	at gw.internal.gosu.parser.GosuClass_Proxy.isValid(gw.internal.gosu.parser.GosuClass_Proxy:2)
	at gw.lang.gosuc.simple.GosuCompiler.compile(GosuCompiler.java:267)
	at gw.lang.gosuc.simple.GosuCompiler.compileGosuSources(GosuCompiler.java:194)
	at gw.lang.gosuc.simple.GosuCompiler.compile(GosuCompiler.java:112)
	at gw.lang.gosuc.cli.CommandLineCompiler.execute(CommandLineCompiler.java:81)
	at gw.lang.gosuc.cli.CommandLineCompiler.invoke(CommandLineCompiler.java:42)
	at gw.lang.gosuc.cli.CommandLineCompiler.main(CommandLineCompiler.java:32)

You can find this example at https://github.com/gosu-lang/example-gradle-hybrid/tree/anno. Clone the repo, checkout branch anno then run ./gradlew clean compileGosu

@DPUkyle
Copy link
Member Author

DPUkyle commented May 24, 2017

AnnotationConstructorGenerator.makeDefaultValueExpression seems suspicious here.

DPUkyle added a commit to gosu-lang/example-gradle-hybrid that referenced this issue May 24, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants