diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 0b1dcb4b6504..7810e3132937 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -4,6 +4,7 @@ package com.intellij.lang.java.parser; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.PsiBuilder; import com.intellij.openapi.util.Pair; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.JavaTokenType; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -587,7 +588,9 @@ public class DeclarationParser { @Nullable public PsiBuilder.Marker parseLambdaParameter(PsiBuilder builder, boolean typed) { - return parseListElement(builder, typed, ReferenceParser.ELLIPSIS, false); + int flags = ReferenceParser.ELLIPSIS; + if (getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_X)) flags |= ReferenceParser.VAR_TYPE; + return parseListElement(builder, typed, flags, false); } @Nullable diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java index bc0ebdf7e68f..ae255007e6eb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java @@ -1,11 +1,12 @@ +import java.util.function.Function; class Main { private static void localVariableDeclaration() { var a = 1; var b = 2, c = 3.0; var d[] = new int[4]; - var d1 = new int[] {4}; - var d2 = new int[4]; + var d1 = new int[] {4}; + var d2 = new int[4]; var e; var f = { 6 }; var g = (g = 7); @@ -30,9 +31,11 @@ class Main { var m = Main::localVariableDeclaration; var g = null; var runnable = true ? () -> {} : () -> {}; + + Function f1 = (var var) -> var; } - private void forEachType(String[] strs, Iterable it, Iterable raw) { + private void forEachType(String[] strs, Iterable it, Iterable raw) { for (var str : strs) { String s = str; } @@ -56,6 +59,5 @@ class Main { private void tryWithResources(AutoCloseable c) throws Exception { try (var v = null) { } try (var v = c; var v1 = c) { } - } -} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java new file mode 100644 index 000000000000..f2bcf7951f20 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java @@ -0,0 +1,7 @@ +import java.util.function.Function; + +class C { + void m() { + Function f = (var var) -> var; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression24.txt b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression24.txt new file mode 100644 index 000000000000..e1fbe6cdd051 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression24.txt @@ -0,0 +1,14 @@ +PsiJavaFile:LambdaExpression24.java + PsiLambdaExpression + PsiParameterList:var + PsiParameter:var + PsiModifierList: + + PsiIdentifier:var('var') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiReferenceExpression:var + PsiReferenceParameterList + + PsiIdentifier:var('var') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression25.txt b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression25.txt new file mode 100644 index 000000000000..6ff11d2294ae --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression25.txt @@ -0,0 +1,16 @@ +PsiJavaFile:LambdaExpression25.java + PsiLambdaExpression + PsiParameterList:(var) + PsiJavaToken:LPARENTH('(') + PsiParameter:var + PsiModifierList: + + PsiIdentifier:var('var') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiReferenceExpression:var + PsiReferenceParameterList + + PsiIdentifier:var('var') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression26.txt b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression26.txt new file mode 100644 index 000000000000..03b77d51c3ca --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression26.txt @@ -0,0 +1,19 @@ +PsiJavaFile:LambdaExpression26.java + PsiLambdaExpression + PsiParameterList:(var var) + PsiJavaToken:LPARENTH('(') + PsiParameter:var + PsiModifierList: + + PsiTypeElement:var + PsiKeyword:var('var') + PsiWhiteSpace(' ') + PsiIdentifier:var('var') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiReferenceExpression:var + PsiReferenceParameterList + + PsiIdentifier:var('var') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java index ec43b93d3f0d..76dcc4fd6c7f 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java @@ -3,11 +3,14 @@ package com.intellij.java.codeInsight.daemon; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; import com.intellij.codeInspection.AnonymousCanBeLambdaInspection; +import com.intellij.idea.Bombed; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.pom.java.LanguageLevel; import com.intellij.testFramework.IdeaTestUtil; +import java.util.Calendar; + public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { private static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/advLVTI"; @@ -23,16 +26,24 @@ public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { } public void testSimpleAvailability() { doTest(); } + public void testDisabledInspections() { enableInspectionTool(new AnonymousCanBeLambdaInspection()); doTest(BASE_PATH + "/" + getTestName(false) + ".java", true, false); } + public void testVarClassNameConflicts() { doTest(); } public void testStandaloneInVarContext() { doTest(); } public void testUpwardProjection() { doTest(); } + @Bombed(user = "anna", day = 12, month = Calendar.MARCH) + public void testVarInLambdaParameters() { + setLanguageLevel(LanguageLevel.JDK_X); + doTest(); + } + @Override protected Sdk getProjectJDK() { return IdeaTestUtil.getMockJdk9(); } -} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/parser/partial/ExpressionParserTest.java b/java/java-tests/testSrc/com/intellij/java/parser/partial/ExpressionParserTest.java index c58997590aec..6ed647fe71c4 100644 --- a/java/java-tests/testSrc/com/intellij/java/parser/partial/ExpressionParserTest.java +++ b/java/java-tests/testSrc/com/intellij/java/parser/partial/ExpressionParserTest.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.java.parser.partial; import com.intellij.java.parser.JavaParsingTestCase; @@ -153,6 +139,9 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testLambdaExpression21() { doParserTest("(T @A() [] x) -> { }"); } public void testLambdaExpression22() { doParserTest("(T x @A() []) -> { }"); } public void testLambdaExpression23() { doParserTest("(T... t) -> t.length"); } + public void testLambdaExpression24() { doParserTest("var -> var"); } + public void testLambdaExpression25() { doParserTest("(var) -> var"); } + public void testLambdaExpression26() { doParserTest("(var var) -> var"); } public void testAmbiguousLambdaExpression() { doParserTest("f( (x) < y , z > (w) -> v )"); } private void doParserTest(String text) {