IDEA-127077 (incorrect parsing of type annotations)

This commit is contained in:
Roman Shevchenko
2014-07-21 11:33:46 +02:00
parent 653ccf4661
commit e35d9d846c
6 changed files with 292 additions and 59 deletions
@@ -1,2 +1,8 @@
@Ann(<error descr="Cannot find method 'value'">0</error>) class D {
<error>@EJB</error>
Runnable myMissingEjbRef;
public <T> @SafeVarargs
static void m();
}
@@ -69,5 +69,96 @@ PsiJavaFile:Errors.java
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n\n ')
PsiModifierList:
<empty list>
PsiErrorElement:Identifier or type expected
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:error
PsiIdentifier:error('error')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiModifierList:@EJB
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:EJB
PsiIdentifier:EJB('EJB')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiErrorElement:Identifier or type expected
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiErrorElement:Type parameter expected
<empty list>
PsiErrorElement:'>' expected.
<empty list>
PsiErrorElement:Unexpected token
PsiJavaToken:DIV('/')
PsiModifierList:
<empty list>
PsiTypeElement:error
PsiJavaCodeReferenceElement:error
PsiIdentifier:error('error')
PsiReferenceParameterList
<empty list>
PsiErrorElement:Identifier expected
<empty list>
PsiErrorElement:Unexpected token
PsiJavaToken:GT('>')
PsiWhiteSpace('\n ')
PsiField:myMissingEjbRef
PsiModifierList:
<empty list>
PsiTypeElement:Runnable
PsiJavaCodeReferenceElement:Runnable
PsiIdentifier:Runnable('Runnable')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:myMissingEjbRef('myMissingEjbRef')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n\n ')
PsiModifierList:public
PsiKeyword:public('public')
PsiWhiteSpace(' ')
PsiErrorElement:Identifier or type expected
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiMethod:m
PsiModifierList:@SafeVarargs
static
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:SafeVarargs
PsiIdentifier:SafeVarargs('SafeVarargs')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace('\n ')
PsiKeyword:static('static')
PsiTypeParameterList
<empty list>
PsiWhiteSpace(' ')
PsiTypeElement:void
PsiKeyword:void('void')
PsiWhiteSpace(' ')
PsiIdentifier:m('m')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -47,9 +47,10 @@ class SpecSamples {
try (@A Reader r = new @B FileReader("/dev/zero"); @A Writer w = new @B FileWriter("/dev/null")) { }
}
//interface TestClass {
// <T> @Nullable List<T> test();
//}
interface TestClass {
<T> @Nullable List<T> test();
<T> @Positive int test(T t);
}
//
// 2. An annotation on a wildcard type argument appears before the wildcard ...
@@ -76,7 +77,7 @@ class SpecSamples {
//
@Immutable SpecSamples() { }
//<T> @Immutable SpecSamples(T t) { }
<T> @Immutable SpecSamples(T t) { }
//
// todo [r.sh] 5. It is permitted to explicitly declare the method receiver as the first formal parameter ...
@@ -1045,11 +1045,103 @@ PsiJavaFile:TypeAnnotations.java
PsiWhiteSpace('\n ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n\n ')
PsiComment(END_OF_LINE_COMMENT)('//interface TestClass {')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('// <T> @Nullable List<T> test();')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('//}')
PsiClass:TestClass
PsiModifierList:
<empty list>
PsiKeyword:interface('interface')
PsiWhiteSpace(' ')
PsiIdentifier:TestClass('TestClass')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiMethod:test
PsiModifierList:
<empty list>
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiTypeElement:@Nullable List<T>
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Nullable
PsiIdentifier:Nullable('Nullable')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaCodeReferenceElement:List<T>
PsiIdentifier:List('List')
PsiReferenceParameterList
PsiJavaToken:LT('<')
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiIdentifier:test('test')
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiMethod:test
PsiModifierList:
<empty list>
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiTypeElement:@Positive int
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Positive
PsiIdentifier:Positive('Positive')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:test('test')
PsiParameterList:(T t)
PsiJavaToken:LPARENTH('(')
PsiParameter:t
PsiModifierList:
<empty list>
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:t('t')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n\n ')
PsiComment(END_OF_LINE_COMMENT)('//')
PsiWhiteSpace('\n ')
@@ -1492,7 +1584,47 @@ PsiJavaFile:TypeAnnotations.java
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n ')
PsiComment(END_OF_LINE_COMMENT)('//<T> @Immutable SpecSamples(T t) { }')
PsiMethod:SpecSamples
PsiModifierList:
<empty list>
PsiTypeParameterList
PsiJavaToken:LT('<')
PsiTypeParameter:T
PsiIdentifier:T('T')
PsiElement(EXTENDS_BOUND_LIST)
<empty list>
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:Immutable
PsiIdentifier:Immutable('Immutable')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:SpecSamples('SpecSamples')
PsiParameterList:(T t)
PsiJavaToken:LPARENTH('(')
PsiParameter:t
PsiModifierList:
<empty list>
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:t('t')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n\n ')
PsiComment(END_OF_LINE_COMMENT)('//')
PsiWhiteSpace('\n ')