From 09f4a50b16925ed2c3d670a8a569fb617b117b6f Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 27 Mar 2013 17:20:10 +0100 Subject: [PATCH] prevent diamonds in reference parameter list other than <> -> invalid PsiDiamondType in substitutors (cherry picked from commit 4f7cc7a) --- .../lang/java/parser/ReferenceParser.java | 3 ++- .../advHighlighting7/IncompleteDiamonds.java | 25 +++++++++++++++++++ .../psi/parser-partial/expressions/New17.txt | 23 +++++++++++++++++ .../daemon/LightAdvHighlightingJdk7Test.java | 6 ++++- .../parser/partial/ExpressionParserTest.java | 1 + 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IncompleteDiamonds.java create mode 100644 java/java-tests/testData/psi/parser-partial/expressions/New17.txt diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index fe3b1ea39d3d..42a41d51c6fb 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -270,7 +270,7 @@ public class ReferenceParser { return false; } - final int flags = set(set(EAT_LAST_DOT, WILDCARD, wildcard), DIAMONDS, diamonds); + int flags = set(set(EAT_LAST_DOT, WILDCARD, wildcard), DIAMONDS, diamonds); boolean isOk = true; while (true) { if (parseTypeInfo(builder, flags, true) == null) { @@ -290,6 +290,7 @@ public class ReferenceParser { isOk = false; break; } + flags = set(flags, DIAMONDS, false); } list.done(JavaElementType.REFERENCE_PARAMETER_LIST); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IncompleteDiamonds.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IncompleteDiamonds.java new file mode 100644 index 000000000000..978638864b50 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IncompleteDiamonds.java @@ -0,0 +1,25 @@ +class Test { + + public static void main(String[] args) { + Box stringBox = new Box("123"); + + stringBox.transform(new Fn >() {}); + + } + + static class Box { + T value; + + Box(T value) { + this.value = value; + } + + public Box transform(Fn fn) { + return new Box(fn.apply(value)); + } + } + + interface Fn { + B apply(A value); + } +} diff --git a/java/java-tests/testData/psi/parser-partial/expressions/New17.txt b/java/java-tests/testData/psi/parser-partial/expressions/New17.txt new file mode 100644 index 000000000000..db5b908b24d0 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/New17.txt @@ -0,0 +1,23 @@ +PsiJavaFile:New17.java + PsiNewExpression:new Map() + PsiKeyword:new('new') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:Map + PsiIdentifier:Map('Map') + PsiReferenceParameterList + PsiJavaToken:LT('<') + PsiTypeElement:String + PsiJavaCodeReferenceElement:String + PsiIdentifier:String('String') + PsiReferenceParameterList + + PsiJavaToken:COMMA(',') + PsiErrorElement:Identifier expected + + PsiWhiteSpace(' ') + PsiJavaToken:GT('>') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index c817e81829de..ca7d1d5cc0d4 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -102,7 +102,11 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase { public void testHighlightInaccessibleFromClassModifierList() { doTest(false, false); } public void testInnerInTypeArguments() { doTest(false, false); } - public void testDynamicallyAddIgnoredAnnotations() { + public void testIncompleteDiamonds() throws Exception { + doTest(false, false); + } + + public void testDynamicallyAddIgnoredAnnotations() throws Exception { ExtensionPoint point = Extensions.getRootArea().getExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL); EntryPoint extension = new EntryPoint() { @NotNull @Override public String getDisplayName() { return "duh"; } 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 95d908bc8138..df470d8a490d 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 @@ -76,6 +76,7 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testNew14() { doParserTest("Q.new A()"); } public void testNew15() { doParserTest("new C.B()"); } public void testNew16() { doParserTest("new C<>()"); } + public void testNew17() { doParserTest("new Map()"); } public void testExprList0() { doParserTest("f(1,2)"); } public void testExprList1() { doParserTest("f("); }