From 835ad7e38053058f7a061881da6ea49ec9d1fbba Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 12 Jan 2018 19:22:26 +0100 Subject: [PATCH] java parameter info: revert unsafe fix for IDEA-184821, add a test (IDEA-CR-28480) --- .../api/impls/MethodParameterInfoHandler.java | 12 +++++---- .../TypeInvalidationByCompletion.java | 7 +++++ .../TypeInvalidationByCompletion_after.java | 8 ++++++ .../java/codeInsight/ParameterInfoTest.java | 26 +++++++++++++++++++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion.java create mode 100644 java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java index ff20153af195..7cf8ca0c86b0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java @@ -247,13 +247,15 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc for (int i = 0; i < candidates.length; i++) { CandidateInfo candidate = (CandidateInfo)candidates[i]; PsiMethod method = (PsiMethod)candidate.getElement(); - if (!method.isValid() || !candidate.getSubstitutor().isValid()) { - // this may sometimes happen e,g, when editing method call in field initializer candidates in the same file get invalidated + if (!method.isValid()) continue; + PsiSubstitutor substitutor = getCandidateInfoSubstitutor(o, candidate, method == realResolve); + assert substitutor != null; + + if (!method.isValid() || !substitutor.isValid()) { + // this may sometimes happen e,g, when editing method call in field initializer candidates in the same file get invalidated context.setUIComponentEnabled(i, false); continue; } - PsiSubstitutor substitutor = getCandidateInfoSubstitutor(o, candidate, method == realResolve); - assert substitutor != null; PsiParameter[] parms = method.getParameterList().getParameters(); boolean enabled = true; @@ -726,7 +728,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc if (p instanceof CandidateInfo) { CandidateInfo info = (CandidateInfo)p; PsiMethod method = (PsiMethod)info.getElement(); - if (!method.isValid() || !info.getSubstitutor().isValid()) { + if (!method.isValid()) { context.setUIComponentEnabled(false); return; } diff --git a/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion.java b/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion.java new file mode 100644 index 000000000000..97624d75dbfc --- /dev/null +++ b/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion.java @@ -0,0 +1,7 @@ +import java.util.ArrayList; + +class A{ + void foo(){ + new ArrayList().stream().collect(toSe) + } +} diff --git a/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion_after.java b/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion_after.java new file mode 100644 index 000000000000..d00506cdf655 --- /dev/null +++ b/java/java-tests/testData/codeInsight/parameterInfo/TypeInvalidationByCompletion_after.java @@ -0,0 +1,8 @@ +import java.util.ArrayList; +import java.util.stream.Collectors; + +class A{ + void foo(){ + new ArrayList().stream().collect(Collectors.toSet()) + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/ParameterInfoTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/ParameterInfoTest.java index e06510487d71..c5e0bbc4ead6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/ParameterInfoTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/ParameterInfoTest.java @@ -9,6 +9,7 @@ import com.intellij.codeInsight.hint.api.impls.MethodParameterInfoHandler; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.ide.highlighter.JavaFileType; +import com.intellij.idea.Bombed; import com.intellij.lang.parameterInfo.CreateParameterInfoContext; import com.intellij.lang.parameterInfo.ParameterInfoUIContextEx; import com.intellij.openapi.actionSystem.IdeActions; @@ -26,6 +27,8 @@ import com.intellij.testFramework.utils.parameterInfo.MockUpdateParameterInfoCon import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import java.util.Calendar; + public class ParameterInfoTest extends LightCodeInsightFixtureTestCase { @Override protected String getBasePath() { @@ -339,4 +342,27 @@ public class ParameterInfoTest extends LightCodeInsightFixtureTestCase { assertEquals(itemsToShow[lineIndex], updateParameterInfo(handler, list, itemsToShow).getHighlightedParameter()); } + @Bombed(month = Calendar.JANUARY, day = 22, user = "anna") + public void testTypeInvalidationByCompletion() { + myFixture.configureByFile(getTestName(false) + ".java"); + + MethodParameterInfoHandler handler = new MethodParameterInfoHandler(); + CreateParameterInfoContext context = new MockCreateParameterInfoContext(getEditor(), getFile()); + PsiExpressionList argList = handler.findElementForParameterInfo(context); + assertNotNull(argList); + Object[] items = context.getItemsToShow(); + assertSize(2, items); + updateParameterInfo(handler, argList, items); + + myFixture.completeBasic(); + myFixture.type('\n'); + + assertTrue(argList.isValid()); + // items now contain references to invalid PSI + updateParameterInfo(handler, argList, items); + assertSize(2, context.getItemsToShow()); + + myFixture.checkResultByFile(getTestName(false) + "_after.java"); + } + } \ No newline at end of file