diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java index 72a4c6a04637..42a5fafe3309 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,7 @@ public class ExpressionParser { private static final TokenSet ARGS_LIST_CONTINUE = TokenSet.create( JavaTokenType.IDENTIFIER, TokenType.BAD_CHARACTER, JavaTokenType.COMMA, JavaTokenType.INTEGER_LITERAL, JavaTokenType.STRING_LITERAL); private static final TokenSet THIS_OR_SUPER = TokenSet.create(JavaTokenType.THIS_KEYWORD, JavaTokenType.SUPER_KEYWORD); + private static final TokenSet ID_OR_SUPER = TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.SUPER_KEYWORD); private static final TokenSet TYPE_START = TokenSet.orSet( ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT)); @@ -396,7 +397,7 @@ public class ExpressionParser { final PsiBuilder.Marker refExpr = expr.precede(); myParser.getReferenceParser().parseReferenceParameterList(builder, false, false); - if (!expectOrError(builder, JavaTokenType.IDENTIFIER, "expected.identifier")) { + if (!expectOrError(builder, ID_OR_SUPER, "expected.identifier")) { refExpr.done(JavaElementType.REFERENCE_EXPRESSION); startMarker.drop(); return refExpr; diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java index 652b6ecd5791..b55d028d78e9 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -246,10 +246,17 @@ public class JavaParserUtil { } } - public static boolean expectOrError(final PsiBuilder builder, final IElementType expectedType, - @PropertyKey(resourceBundle = JavaErrorMessages.BUNDLE) String errorMessageKey) { - if (!PsiBuilderUtil.expect(builder, expectedType)) { - error(builder, JavaErrorMessages.message(errorMessageKey)); + public static boolean expectOrError(PsiBuilder builder, TokenSet expected, @PropertyKey(resourceBundle = JavaErrorMessages.BUNDLE) String key) { + if (!PsiBuilderUtil.expect(builder, expected)) { + error(builder, JavaErrorMessages.message(key)); + return false; + } + return true; + } + + public static boolean expectOrError(PsiBuilder builder, IElementType expected, @PropertyKey(resourceBundle = JavaErrorMessages.BUNDLE) String key) { + if (!PsiBuilderUtil.expect(builder, expected)) { + error(builder, JavaErrorMessages.message(key)); return false; } return true; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA98421.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA98421.java new file mode 100644 index 000000000000..28ac86b92c9a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA98421.java @@ -0,0 +1,11 @@ +class Outer { + class Inner { + public Inner(T t) { } + } + + class Other extends Outer.Inner { + public Other() { + new Outer().super("Hi"); + } + } +} diff --git a/java/java-tests/testData/psi/parser-partial/expressions/QualifiedSuperMethodCall2.txt b/java/java-tests/testData/psi/parser-partial/expressions/QualifiedSuperMethodCall2.txt new file mode 100644 index 000000000000..853ac3e0cb17 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/QualifiedSuperMethodCall2.txt @@ -0,0 +1,31 @@ +PsiJavaFile:QualifiedSuperMethodCall2.java + PsiMethodCallExpression:(new O()).super() + PsiReferenceExpression:(new O()).super + PsiParenthesizedExpression:(new O()) + PsiJavaToken:LPARENTH('(') + PsiNewExpression:new O() + PsiKeyword:new('new') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:O + PsiIdentifier:O('O') + PsiReferenceParameterList + + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiJavaToken:GT('>') + PsiKeyword:super('super') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index ed473eccc60d..8ffa83701b72 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -192,6 +192,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testOverrideWithMoreSpecificReturn() { doTest7Incompatibility(false); } public void testIDEA97888() { doTest7Incompatibility(false); } public void testMethodCallParamsOnRawType() { doTest5(false); } + public void testIDEA98421() { doTest5(false); } public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java index 4a30c6dcbf67..6bd40b3dfb04 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,6 +109,7 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testQualifiedSuperMethodCall0() { doParserTest("new D().super(0)"); } public void testQualifiedSuperMethodCall1() { doParserTest("d.super(0)"); } + public void testQualifiedSuperMethodCall2() { doParserTest("(new O()).super()"); } public void testSuperMethodCallTypeParameterList() { doParserTest("super()"); } public void testPrimitiveClassObjectAccess() { doParserTest("int.class"); } public void testPrimitiveFieldAccess() { doParserTest("int.x"); }