atom/language-java

Class body of annotation class is not correctly parsed

Opened this issue · 3 comments

Description

In the class body of an annotation class, parameters are not parsed as a method/field/parameter declaration as it should be. This results in scope errors like mistaking wildcard generic parameter as ternary conditional operator.

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
public @interface EventListener {
    Class<?>[] events() default {};
    int order() default Integer.MAX_VALUE;
    boolean async() default false;
    String condition() default "";
}

class A {
    Class<?>[] events() {
        
    }
    int order() {
        
    }
    boolean async() {
        
    }
    String condition() {
        
    }
}

image

image

Expected behavior: [What you expect to happen]

Both events should be parsed as some kind of declaration. But it is actually parsed as "method-call" in annotation, along with other errors like "?".

Versions

d48e713

It does work correctly. We just don't support the following syntax:

public @interface EventListener {
  ...
}

I don't think it is correct to mark interface as @interface in Java.
Is this new feature in JDK to have interface to be prefixed with @?

This syntax is used to create a custom annotation class.

Here is a quick tutorial: https://www.javatpoint.com/custom-annotation

For the official Java language specification, please take look at this: https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.1

I see. It looks like we support these annotation declarations, but the code does not explicitly handle this case that you mentioned. I will try reworking that in the next couple of days.