parameter popup: don't show hidden methods (IDEA-144944)

This commit is contained in:
Anna Kozlova
2015-10-06 19:40:10 +02:00
parent ee740cefd9
commit 77ab5f3571
3 changed files with 50 additions and 1 deletions

View File

@@ -29,6 +29,11 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.CompletionParameterTypeInferencePolicy;
import com.intellij.psi.infos.CandidateInfo;
import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.scope.MethodProcessorSetupFailedException;
import com.intellij.psi.scope.PsiConflictResolver;
import com.intellij.psi.scope.processor.MethodCandidatesProcessor;
import com.intellij.psi.scope.processor.MethodResolverProcessor;
import com.intellij.psi.scope.util.PsiScopesUtil;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiUtilBase;
@@ -308,12 +313,14 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc
return null;
}
private static CandidateInfo[] getMethods(PsiExpressionList argList) {
final PsiCall call = getCall(argList);
PsiResolveHelper helper = JavaPsiFacade.getInstance(argList.getProject()).getResolveHelper();
if (call instanceof PsiCallExpression) {
CandidateInfo[] candidates = helper.getReferencedMethodCandidates((PsiCallExpression)call, true);
CandidateInfo[] candidates = getCandidates((PsiCallExpression)call);
ArrayList<CandidateInfo> result = new ArrayList<CandidateInfo>();
if (!(argList.getParent() instanceof PsiAnonymousClass)) {
@@ -360,6 +367,24 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc
}
}
private static CandidateInfo[] getCandidates(PsiCallExpression call) {
final MethodCandidatesProcessor processor = new MethodResolverProcessor(call, call.getContainingFile(), new PsiConflictResolver[0]) {
@Override
protected boolean acceptVarargs() {
return false;
}
};
try {
PsiScopesUtil.setupAndRunProcessor(processor, call, true);
}
catch (MethodProcessorSetupFailedException e) {
return CandidateInfo.EMPTY_ARRAY;
}
final List<CandidateInfo> results = processor.getResults();
return results.toArray(new CandidateInfo[results.size()]);
}
public static String updateMethodPresentation(@NotNull PsiMethod method, @Nullable PsiSubstitutor substitutor, @NotNull ParameterInfoUIContext context) {
CodeInsightSettings settings = CodeInsightSettings.getInstance();

View File

@@ -0,0 +1,11 @@
class A {
static void foo(int x){}
class Inner {
void foo(){}
void test() {
foo(<caret>1);
}
}
}

View File

@@ -109,6 +109,19 @@ public class ParameterInfoTest extends LightCodeInsightTestCase {
assertTrue(updateParameterInfoContext.isUIComponentEnabled(0) || updateParameterInfoContext.isUIComponentEnabled(1));
}
public void testStopAtAccessibleStaticCorrectCandidate() throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");
final MethodParameterInfoHandler handler = new MethodParameterInfoHandler();
final CreateParameterInfoContext context = new MockCreateParameterInfoContext(myEditor, myFile);
final PsiExpressionList list = handler.findElementForParameterInfo(context);
assertNotNull(list);
final Object[] itemsToShow = context.getItemsToShow();
assertNotNull(itemsToShow);
assertEquals(1, itemsToShow.length);
assertEquals(0, ((MethodCandidateInfo)itemsToShow[0]).getElement().getParameterList().getParametersCount());
}
public void testAfterGenericsInsideCall() throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");