From de59edc36796479d279d18414765c63d034ed40e Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 29 Jul 2010 20:29:27 +0400 Subject: [PATCH] New Java parser (work in progress) --- .../lang/java/parser/ReferenceParser.java | 2 +- .../declarations/AnnoDeclaration.txt | 22 ++ .../declarations/AnnoDefault.txt | 35 ++ .../parser-partial/declarations/AnnoInner.txt | 44 +++ .../declarations/AnnoNested.txt | 47 +++ .../declarations/AnnoOtherMembers.txt | 64 ++++ .../declarations/AnnoSimple.txt | 21 ++ .../declarations/EnumSmartTypeCompletion.txt | 143 ++++++++ .../declarations/ParameterAnnotation.txt | 45 +++ .../declarations/ParameterizedMethod.txt | 40 +++ .../parser-partial/declarations/TypeAnno.txt | 327 ++++++++++++++++++ .../psi/parser-partial/references/Type6.txt | 28 ++ .../parser/partial/DeclarationParserTest.java | 20 ++ .../parser/partial/ReferenceParserTest.java | 1 + 14 files changed, 838 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoDeclaration.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoDefault.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoInner.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoNested.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoOtherMembers.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/AnnoSimple.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/EnumSmartTypeCompletion.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/ParameterAnnotation.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/ParameterizedMethod.txt create mode 100644 java/java-tests/testData/psi/parser-partial/declarations/TypeAnno.txt create mode 100644 java/java-tests/testData/psi/parser-partial/references/Type6.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index da8be88afb9e..4f06c802e8e2 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -98,10 +98,10 @@ public class ReferenceParser { } while (true) { + type.done(JavaElementType.TYPE); if (annotationsSupported) { DeclarationParser.parseAnnotations(builder); } - type.done(JavaElementType.TYPE); if (!expect(builder, JavaTokenType.LBRACKET)) { break; diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoDeclaration.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoDeclaration.txt new file mode 100644 index 000000000000..487633305819 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoDeclaration.txt @@ -0,0 +1,22 @@ +PsiJavaFile:AnnoDeclaration.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiClass:Annotation + PsiModifierList:public + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiJavaToken:AT('@') + PsiKeyword:interface('interface') + PsiWhiteSpace(' ') + PsiIdentifier:Annotation('Annotation') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoDefault.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoDefault.txt new file mode 100644 index 000000000000..5d8e43524fb3 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoDefault.txt @@ -0,0 +1,35 @@ +PsiJavaFile:AnnoDefault.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiAnnotationMethod:foo + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:Class + PsiJavaCodeReferenceElement:Class + PsiIdentifier:Class('Class') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:foo('foo') + PsiWhiteSpace(' ') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiKeyword:default('default') + PsiWhiteSpace(' ') + PsiClassObjectAccessExpression:String.class + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiJavaToken:DOT('.') + PsiKeyword:class('class') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoInner.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoInner.txt new file mode 100644 index 000000000000..65cd85840fb2 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoInner.txt @@ -0,0 +1,44 @@ +PsiJavaFile:AnnoInner.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiClass:Inner + PsiModifierList: + + PsiJavaToken:AT('@') + PsiKeyword:interface('interface') + PsiWhiteSpace(' ') + PsiIdentifier:Inner('Inner') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiAnnotationMethod:bar + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:double + PsiKeyword:double('double') + PsiWhiteSpace(' ') + PsiIdentifier:bar('bar') + PsiWhiteSpace(' ') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiKeyword:default('default') + PsiWhiteSpace(' ') + PsiLiteralExpression:0.0 + PsiJavaToken:DOUBLE_LITERAL('0.0') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoNested.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoNested.txt new file mode 100644 index 000000000000..d0aaba008536 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoNested.txt @@ -0,0 +1,47 @@ +PsiJavaFile:AnnoNested.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiClass:Inner + PsiModifierList: + + PsiJavaToken:AT('@') + PsiKeyword:interface('interface') + PsiWhiteSpace(' ') + PsiIdentifier:Inner('Inner') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiAnnotationMethod:bar + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:bar('bar') + PsiWhiteSpace(' ') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiKeyword:default('default') + PsiWhiteSpace(' ') + PsiLiteralExpression:"" + PsiJavaToken:STRING_LITERAL('""') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoOtherMembers.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoOtherMembers.txt new file mode 100644 index 000000000000..69eab6bedf17 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoOtherMembers.txt @@ -0,0 +1,64 @@ +PsiJavaFile:AnnoOtherMembers.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiField:field + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:field('field') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiAnnotationMethod:m + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:m('m') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiClass:C + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiClass:I + PsiModifierList: + + PsiKeyword:interface('interface') + PsiWhiteSpace(' ') + PsiIdentifier:I('I') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoSimple.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoSimple.txt new file mode 100644 index 000000000000..fbbe1ce06bbd --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/AnnoSimple.txt @@ -0,0 +1,21 @@ +PsiJavaFile:AnnoSimple.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiAnnotationMethod:foo + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:foo('foo') + PsiWhiteSpace(' ') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/EnumSmartTypeCompletion.txt b/java/java-tests/testData/psi/parser-partial/declarations/EnumSmartTypeCompletion.txt new file mode 100644 index 000000000000..102f64d2d490 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/EnumSmartTypeCompletion.txt @@ -0,0 +1,143 @@ +PsiJavaFile:EnumSmartTypeCompletion.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiClass:TimeTravel + PsiModifierList:@Preliminary(A.B +#) public + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Preliminary + PsiIdentifier:Preliminary('Preliminary') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiNameValuePair + PsiReferenceExpression:A.B + PsiReferenceExpression:A + PsiReferenceParameterList + + PsiIdentifier:A('A') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:B('B') + PsiErrorElement:',' or ')' expected + + PsiWhiteSpace('\n') + PsiElement(BAD_CHARACTER)('#') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:TimeTravel('TimeTravel') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiClass:TimeTravel + PsiModifierList:@Preliminary(a=A.B +#) public + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Preliminary + PsiIdentifier:Preliminary('Preliminary') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiNameValuePair + PsiIdentifier:a('a') + PsiJavaToken:EQ('=') + PsiReferenceExpression:A.B + PsiReferenceExpression:A + PsiReferenceParameterList + + PsiIdentifier:A('A') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:B('B') + PsiErrorElement:',' or ')' expected + + PsiWhiteSpace('\n') + PsiElement(BAD_CHARACTER)('#') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:TimeTravel('TimeTravel') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiClass:TimeTravel + PsiModifierList:@Preliminary(a=A.B +#, b=c) public + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Preliminary + PsiIdentifier:Preliminary('Preliminary') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiNameValuePair + PsiIdentifier:a('a') + PsiJavaToken:EQ('=') + PsiReferenceExpression:A.B + PsiReferenceExpression:A + PsiReferenceParameterList + + PsiIdentifier:A('A') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:B('B') + PsiErrorElement:',' or ')' expected + + PsiWhiteSpace('\n') + PsiElement(BAD_CHARACTER)('#') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiNameValuePair + PsiIdentifier:b('b') + PsiJavaToken:EQ('=') + PsiReferenceExpression:c + PsiReferenceParameterList + + PsiIdentifier:c('c') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:TimeTravel('TimeTravel') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/ParameterAnnotation.txt b/java/java-tests/testData/psi/parser-partial/declarations/ParameterAnnotation.txt new file mode 100644 index 000000000000..c283ca4c8ebb --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/ParameterAnnotation.txt @@ -0,0 +1,45 @@ +PsiJavaFile:ParameterAnnotation.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:foo + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:foo('foo') + PsiWhiteSpace(' ') + PsiParameterList:(@Annotation(value=77) int param) + PsiJavaToken:LPARENTH('(') + PsiParameter:param + PsiModifierList:@Annotation(value=77) + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Annotation + PsiIdentifier:Annotation('Annotation') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiNameValuePair + PsiIdentifier:value('value') + PsiJavaToken:EQ('=') + PsiLiteralExpression:77 + PsiJavaToken:INTEGER_LITERAL('77') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:param('param') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/ParameterizedMethod.txt b/java/java-tests/testData/psi/parser-partial/declarations/ParameterizedMethod.txt new file mode 100644 index 000000000000..0128264c46b5 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/ParameterizedMethod.txt @@ -0,0 +1,40 @@ +PsiJavaFile:ParameterizedMethod.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiMethod:bar + PsiModifierList:@Nullable + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Nullable + PsiIdentifier:Nullable('Nullable') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiIdentifier:T('T') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:bar('bar') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/declarations/TypeAnno.txt b/java/java-tests/testData/psi/parser-partial/declarations/TypeAnno.txt new file mode 100644 index 000000000000..72944a003f34 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/declarations/TypeAnno.txt @@ -0,0 +1,327 @@ +PsiJavaFile:TypeAnno.java + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiClass:C + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:T + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:D + PsiIdentifier:D('D') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:T('T') + PsiWhiteSpace(' ') + PsiElement(EXTENDS_BOUND_LIST) + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:@F Object + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiReferenceList + PsiKeyword:extends('extends') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:@F Object + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:method + PsiModifierList:@F + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:int @F[] + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiJavaToken:LBRACKET('[') + PsiJavaToken:RBRACKET(']') + PsiWhiteSpace(' ') + PsiIdentifier:method('method') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiElement(METHOD_RECEIVER) + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiReferenceList + PsiKeyword:throws('throws') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:@F Exception + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:Exception('Exception') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiAssignmentExpression:a = this instanceof @F C + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiInstanceofExpression:this instanceof @F C + PsiThisExpression:this + PsiReferenceParameterList + + PsiKeyword:this('this') + PsiWhiteSpace(' ') + PsiKeyword:instanceof('instanceof') + PsiWhiteSpace(' ') + PsiTypeElement:@F C + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:C + PsiIdentifier:C('C') + PsiReferenceParameterList + + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiLocalVariable:c + PsiModifierList: + + PsiTypeElement:C<@F @G C> + PsiJavaCodeReferenceElement:C<@F @G C> + PsiIdentifier:C('C') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:@F @G C + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:G + PsiIdentifier:G('G') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:C + PsiIdentifier:C('C') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiIdentifier:c('c') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiNewExpression:new @Q C<@F C>() + PsiKeyword:new('new') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:@Q C<@F C> + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Q + PsiIdentifier:Q('Q') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:@F C + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:C + PsiIdentifier:C('C') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiAssignmentExpression:c = (@F Object)c + PsiReferenceExpression:c + PsiReferenceParameterList + + PsiIdentifier:c('c') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiTypeCastExpression:(@F Object)c + PsiJavaToken:LPARENTH('(') + PsiTypeElement:@F Object + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:Object + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiJavaToken:RPARENTH(')') + PsiReferenceExpression:c + PsiReferenceParameterList + + PsiIdentifier:c('c') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiLocalVariable:c + PsiModifierList: + + PsiTypeElement:Class + PsiJavaCodeReferenceElement:Class + PsiIdentifier:Class('Class') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:c('c') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiClassObjectAccessExpression:@TA String.class + PsiTypeElement:@TA String + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:TA + PsiIdentifier:TA('TA') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiJavaToken:DOT('.') + PsiKeyword:class('class') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiPostfixExpression:@F C.field++ + PsiReferenceExpression:@F C.field + PsiReferenceExpression:@F C + PsiReferenceParameterList + + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:F + PsiIdentifier:F('F') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:field('field') + PsiJavaToken:PLUSPLUS('++') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/references/Type6.txt b/java/java-tests/testData/psi/parser-partial/references/Type6.txt new file mode 100644 index 000000000000..3ced650bf7f8 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/references/Type6.txt @@ -0,0 +1,28 @@ +PsiJavaFile:Type6.java + PsiTypeElement:@English String @NonEmpty [] + PsiTypeElement:@English String + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:English + PsiIdentifier:English('English') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:NonEmpty + PsiIdentifier:NonEmpty('NonEmpty') + PsiReferenceParameterList + + PsiAnnotationParameterList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACKET('[') + PsiJavaToken:RBRACKET(']') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java index 977c9d6ea852..a88fe03fbc66 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java @@ -36,6 +36,18 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testPines() { doParserTest("{ class A> extends List> { } }", false, false); } public void testIncompleteAnnotation() { doParserTest("{ public class Foo { public void testSomething(); @Null } }", false, false); } public void testClassInit() { doParserTest("{ { /*comment*/ } }", false, false); } + public void testAnnoDeclaration() { doParserTest("{ public @interface Annotation {} }", false, false); } + public void testEnumSmartTypeCompletion() { doParserTest("{ @Preliminary(A.B\n#) public class TimeTravel {}\n" + + " @Preliminary(a=A.B\n#) public class TimeTravel {}\n" + + " @Preliminary(a=A.B\n#, b=c) public class TimeTravel {} }", false, false); } + public void testTypeAnno() { doParserTest("{ class C<@D T extends @F Object> extends @F Object {\n" + + " @F int @F[] method() @F throws @F Exception {\n" + + " a = this instanceof @F C;\n" + + " C<@F @G C> c = new @Q C<@F C>();\n" + + " c = (@F Object)c;\n" + + " Class c = @TA String.class;\n" + + " @F C.field++;\n" + + " }\n} }", false, false); } public void testEnumBody0() { doParserTest("{ ; }", false, true); } public void testEnumBody1() { doParserTest("{ RED, GREEN, BLUE; }", false, true); } @@ -47,6 +59,12 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testEnumWithInitializedConstants() { doParserTest("{ A(10) { },\n B { void method() {} } }", false, true); } public void testEnumWithoutConstants() { doParserTest("{ private A }", false, true); } + public void testAnnoSimple() { doParserTest("{ int foo (); }", true, false); } + public void testAnnoDefault() { doParserTest("{ Class foo () default String.class; }", true, false); } + public void testAnnoNested() { doParserTest("{ @interface Inner { String bar () default \"\"; } }", true, false); } + public void testAnnoInner() { doParserTest("{ @interface Inner { double bar () default 0.0; } }", false, false); } + public void testAnnoOtherMembers() { doParserTest("{ int field;\n void m() {}\n class C {}\n interface I {} }", true, false); } + public void testFieldSimple() { doParserTest("{ int field = 0; }", false, false); } public void testFieldMulti() { doParserTest("{ int field1 = 0, field2; }", false, false); } public void testUnclosedBracket() { doParserTest("{ int field[ }", false, false); } @@ -73,6 +91,8 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testCompletionHack0() { doParserTest("{ \n String s = \"\"; }", false, false); } public void testCompletionHack1() { doParserTest("{ x(Collection x); }", false, false); } + public void testParameterAnnotation() { doParserTest("{ void foo (@Annotation(value=77) int param) {} }", false, false); } + public void testParameterizedMethod() { doParserTest("{ @Nullable T bar() {} }", false, false); } private void doParserTest(final String text, final boolean isAnnotation, final boolean isEnum) { doParserTest(text, new Parser() { diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java index 77e1e8cb3f1e..75d1ec4e6bc7 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java @@ -35,6 +35,7 @@ public class ReferenceParserTest extends JavaParsingTestCase { public void testType3() { doTypeParserTest("int[][", false); } public void testType4() { doTypeParserTest("Map>", false); } public void testType5() { doTypeParserTest("Object[]...", false); } + public void testType6() { doTypeParserTest("@English String @NonEmpty []", false); } public void testTypeParams0() { doTypeParamsParserTest(""); } public void testTypeParams1() { doTypeParamsParserTest(""); }