java parameter info: revert unsafe fix for IDEA-184821, add a test (IDEA-CR-28480)

This commit is contained in:
peter
2018-01-12 19:24:07 +01:00
parent f47bde348b
commit 835ad7e380
4 changed files with 48 additions and 5 deletions
@@ -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;
}
@@ -0,0 +1,7 @@
import java.util.ArrayList;
class A{
void foo(){
new ArrayList<String>().stream().collect(toSe<caret>)
}
}
@@ -0,0 +1,8 @@
import java.util.ArrayList;
import java.util.stream.Collectors;
class A{
void foo(){
new ArrayList<String>().stream().collect(Collectors.toSet())<caret>
}
}
@@ -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");
}
}