From e38b24c694a07dfa5475d6979f77812b0936029f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 19 Sep 2017 20:01:44 +0300 Subject: [PATCH] LVTI: ensure standalone context for vars --- .../graphInference/PsiPolyExpressionUtil.java | 13 ++++++++++++- .../advLVTI/StandaloneInVarContext.java | 11 +++++++++++ .../daemon/LightAdvLVTIHighlightingTest.java | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/StandaloneInVarContext.java diff --git a/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java b/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java index 5cde308c8382..186327da3f09 100644 --- a/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.impl.source.resolve.graphInference; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.PsiUtil; @@ -138,10 +139,20 @@ public class PsiPolyExpressionUtil { return PsiUtil.isCondition(expr, context) || context instanceof PsiReturnStatement || context instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)context).getOperationTokenType() == JavaTokenType.EQ || - context instanceof PsiVariable || + context instanceof PsiVariable && !isVarContext((PsiVariable)context) || context instanceof PsiLambdaExpression; } + private static boolean isVarContext(PsiVariable variable) { + if (PsiUtil.getLanguageLevel(variable).isAtLeast(LanguageLevel.JDK_X)) { + PsiTypeElement typeElement = variable.getTypeElement(); + if (typeElement != null && typeElement.isInferredType()) { + return true; + } + } + return false; + } + public static boolean isExpressionOfPrimitiveType(@Nullable PsiExpression arg) { if (arg != null && !isPolyExpression(arg)) { final PsiType type = arg.getType(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/StandaloneInVarContext.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/StandaloneInVarContext.java new file mode 100644 index 000000000000..b913ccaa45e4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/StandaloneInVarContext.java @@ -0,0 +1,11 @@ + +import java.util.ArrayList; + +class Main { + + { + var v = true ? new ArrayList() + : new ArrayList(); + } + +} \ 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 f96df72ae926..f91aec55f6b7 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 @@ -37,6 +37,7 @@ public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { public void testSimpleAvailability() { doTest(); } public void testVarClassNameConflicts() { doTest(); } + public void testStandaloneInVarContext() { doTest(); } @Override protected Sdk getProjectJDK() {