From aea5cea3d5b39d1848697462510a8db06385c793 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 13 Sep 2011 16:42:29 +0200 Subject: [PATCH] parse byte[].xxx as a qualified reference expression --- .../lang/java/parser/ExpressionParser.java | 12 ++++-- .../PrimitiveArrayClassObjectAccessError.java | 5 +++ .../PrimitiveArrayClassObjectAccessError.txt | 43 +++++++++++++++++++ .../PrimitiveClassObjectAccessError.java | 5 +++ .../PrimitiveClassObjectAccessError.txt | 40 +++++++++++++++++ .../java/parser/ExpressionParsingTest.java | 2 + 6 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.java create mode 100644 java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.txt create mode 100644 java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.java create mode 100644 java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java index c2e82c0415e3..f567981f3ae5 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java @@ -757,13 +757,17 @@ public class ExpressionParser { expr.rollbackTo(); return null; } + PsiBuilder.Marker afterType = builder.mark(); builder.advanceLexer(); - if (builder.getTokenType() != JavaTokenType.CLASS_KEYWORD) { - expr.rollbackTo(); - return null; + if (builder.getTokenType() == JavaTokenType.CLASS_KEYWORD) { + afterType.drop(); + builder.advanceLexer(); + } + else { + afterType.rollbackTo(); + builder.error(".class expected"); } - builder.advanceLexer(); expr.done(JavaElementType.CLASS_OBJECT_ACCESS_EXPRESSION); return expr; diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.java b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.java new file mode 100644 index 000000000000..1a46cf0944ab --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.java @@ -0,0 +1,5 @@ +class C { + { + int[].cla; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.txt b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.txt new file mode 100644 index 000000000000..5ce0dc69b389 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveArrayClassObjectAccessError.txt @@ -0,0 +1,43 @@ +PsiJavaFile:PrimitiveArrayClassObjectAccessError.java + PsiImportList + + PsiClass:C + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiClassInitializer + PsiModifierList: + + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiReferenceExpression:int[].cla + PsiClassObjectAccessExpression:int[] + PsiTypeElement:int[] + PsiTypeElement:int + PsiKeyword:int('int') + PsiJavaToken:LBRACKET('[') + PsiJavaToken:RBRACKET(']') + PsiErrorElement:.class expected + + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:cla('cla') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.java b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.java new file mode 100644 index 000000000000..196d5874e72d --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.java @@ -0,0 +1,5 @@ +class C { + { + int.cla; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.txt b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.txt new file mode 100644 index 000000000000..2c86be2f39c9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/PrimitiveClassObjectAccessError.txt @@ -0,0 +1,40 @@ +PsiJavaFile:PrimitiveClassObjectAccessError.java + PsiImportList + + PsiClass:C + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiClassInitializer + PsiModifierList: + + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiExpressionStatement + PsiReferenceExpression:int.cla + PsiClassObjectAccessExpression:int + PsiTypeElement:int + PsiKeyword:int('int') + PsiErrorElement:.class expected + + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:cla('cla') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/ExpressionParsingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/ExpressionParsingTest.java index 2b046616b0f9..bbb053005b5f 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/ExpressionParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/ExpressionParsingTest.java @@ -117,4 +117,6 @@ public class ExpressionParsingTest extends JavaParsingTestCase { public void testSuperMethodCallTypeParameterList() { doTest(true); } public void testPrimitiveClassObjectAccess() { doTest(true); } + public void testPrimitiveClassObjectAccessError() { doTest(true); } + public void testPrimitiveArrayClassObjectAccessError() { doTest(true); } } \ No newline at end of file