From 5f5513c9660e13fb2980c726dd40569e2eb1de6c Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 11 Jan 2018 20:10:37 +0100 Subject: [PATCH] LVTI: SOE for var with conditional initializer EA-114618 - SOE: CachedValueBase.getValueWithLock --- .../src/com/intellij/psi/impl/source/JavaVarTypeUtil.java | 3 ++- .../src/com/intellij/psi/impl/source/PsiTypeElementImpl.java | 3 ++- .../daemonCodeAnalyzer/advLVTI/SimpleAvailability.java | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java index d8223d5df207..ad2f73b06103 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java @@ -28,7 +28,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; public class JavaVarTypeUtil { - + public static final RecursionGuard ourVarGuard = RecursionManager.createGuard("var.guard"); + public static PsiType getUpwardProjection(@NotNull PsiType t) { return t.accept(new UpwardProjectionTypeVisitor()); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java index 4222380c92a6..fc44c7b0cfc9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java @@ -170,7 +170,8 @@ public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeEl if (e instanceof PsiExpression) { if (!(e instanceof PsiArrayInitializerExpression) && !isSelfReferenced((PsiExpression)e, parent)) { - PsiType type = ((PsiExpression)e).getType(); + PsiExpression expression = (PsiExpression)e; + PsiType type = JavaVarTypeUtil.ourVarGuard.doPreventingRecursion(expression, true, () -> expression.getType()); return type == null ? null : JavaVarTypeUtil.getUpwardProjection(type); } return null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java index b63fda070600..a8a8ea897420 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java @@ -29,6 +29,7 @@ class Main { var f = () -> "hello"; var m = Main::localVariableDeclaration; var g = null; + var runnable = true ? () -> {} : () -> {}; } private void forEachType(String[] strs, Iterable it, Iterable raw) {