Search in sources :

Example 1 with SubLookupElement

use of com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement in project intellij-community by JetBrains.

the class MethodsChainLookupRangingHelper method processMethod.

@Nullable
private static MethodProcResult processMethod(@NotNull final PsiMethod method, @Nullable final PsiClass qualifierClass, final boolean isHeadMethod, final int weight, final ChainCompletionContext context, final CachedRelevantStaticMethodSearcher staticMethodSearcher, final NullableNotNullManager nullableNotNullManager) {
    int unreachableParametersCount = 0;
    int notMatchedStringVars = 0;
    int matchedParametersInContext = 0;
    boolean hasCallingVariableInContext = false;
    boolean introduceNewVariable = false;
    final PsiParameterList parameterList = method.getParameterList();
    final TIntObjectHashMap<SubLookupElement> parametersMap = new TIntObjectHashMap<>(parameterList.getParametersCount());
    final PsiParameter[] parameters = parameterList.getParameters();
    for (int i = 0; i < parameters.length; i++) {
        final PsiParameter parameter = parameters[i];
        final String typeQName = parameter.getType().getCanonicalText();
        if (JAVA_LANG_STRING.equals(typeQName)) {
            final PsiVariable relevantStringVar = context.findRelevantStringInContext(parameter.getName());
            if (relevantStringVar == null) {
                notMatchedStringVars++;
            } else {
                parametersMap.put(i, new VariableSubLookupElement(relevantStringVar));
            }
        } else if (!ChainCompletionStringUtil.isPrimitiveOrArrayOfPrimitives(typeQName)) {
            final Collection<PsiVariable> contextVariables = context.getVariables(typeQName);
            final PsiVariable contextVariable = ContainerUtil.getFirstItem(contextVariables, null);
            if (contextVariable != null) {
                if (contextVariables.size() == 1)
                    parametersMap.put(i, new VariableSubLookupElement(contextVariable));
                matchedParametersInContext++;
                continue;
            }
            final Collection<ContextRelevantVariableGetter> relevantVariablesGetters = context.getRelevantVariablesGetters(typeQName);
            final ContextRelevantVariableGetter contextVariableGetter = ContainerUtil.getFirstItem(relevantVariablesGetters, null);
            if (contextVariableGetter != null) {
                if (relevantVariablesGetters.size() == 1)
                    parametersMap.put(i, contextVariableGetter.createSubLookupElement());
                matchedParametersInContext++;
                continue;
            }
            final Collection<PsiMethod> containingClassMethods = context.getContainingClassMethods(typeQName);
            final PsiMethod contextRelevantGetter = ContainerUtil.getFirstItem(containingClassMethods, null);
            if (contextRelevantGetter != null) {
                if (containingClassMethods.size() == 1)
                    parametersMap.put(i, new GetterLookupSubLookupElement(method.getName()));
                matchedParametersInContext++;
                continue;
            }
            final ContextRelevantStaticMethod contextRelevantStaticMethod = ContainerUtil.getFirstItem(staticMethodSearcher.getRelevantStaticMethods(typeQName, weight), null);
            if (contextRelevantStaticMethod != null) {
                //
                // In most cases it is not really relevant
                //
                //parametersMap.put(i, contextRelevantStaticMethod.createLookupElement());
                matchedParametersInContext++;
                continue;
            }
            if (!nullableNotNullManager.isNullable(parameter, true)) {
                unreachableParametersCount++;
            }
        }
    }
    final LookupElement lookupElement;
    if (isHeadMethod) {
        if (method.hasModifierProperty(PsiModifier.STATIC)) {
            hasCallingVariableInContext = true;
            lookupElement = createLookupElement(method, parametersMap);
        } else if (method.isConstructor()) {
            return null;
        } else {
            @SuppressWarnings("ConstantConditions") final String classQName = qualifierClass.getQualifiedName();
            if (classQName == null)
                return null;
            final Object e = ContainerUtil.getFirstItem(context.getContextRefElements(classQName), null);
            if (e != null) {
                final LookupElement firstChainElement;
                if (e instanceof PsiVariable) {
                    firstChainElement = new VariableLookupItem((PsiVariable) e);
                } else if (e instanceof PsiMethod) {
                    firstChainElement = createLookupElement((PsiMethod) e, null);
                } else if (e instanceof LookupElement) {
                    firstChainElement = (LookupElement) e;
                } else {
                    throw new AssertionError();
                }
                hasCallingVariableInContext = true;
                lookupElement = new JavaChainLookupElement(firstChainElement, createLookupElement(method, parametersMap));
            } else {
                lookupElement = createLookupElement(method, parametersMap);
                if (!context.getContainingClassQNames().contains(classQName)) {
                    introduceNewVariable = true;
                }
            }
        }
    } else {
        lookupElement = createLookupElement(method, parametersMap);
    }
    return new MethodProcResult(lookupElement, unreachableParametersCount, notMatchedStringVars, hasCallingVariableInContext, introduceNewVariable, matchedParametersInContext);
}
Also used : VariableSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.VariableSubLookupElement) ContextRelevantVariableGetter(com.intellij.compiler.classFilesIndex.chainsSearch.context.ContextRelevantVariableGetter) SubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement) GetterLookupSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.GetterLookupSubLookupElement) VariableSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.VariableSubLookupElement) JavaChainLookupElement(com.intellij.codeInsight.completion.JavaChainLookupElement) SubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement) LookupElement(com.intellij.codeInsight.lookup.LookupElement) ChainCompletionLookupElementUtil.createLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.ChainCompletionLookupElementUtil.createLookupElement) WeightableChainLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.WeightableChainLookupElement) ChainCompletionNewVariableLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.ChainCompletionNewVariableLookupElement) GetterLookupSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.GetterLookupSubLookupElement) VariableSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.VariableSubLookupElement) JavaChainLookupElement(com.intellij.codeInsight.completion.JavaChainLookupElement) VariableLookupItem(com.intellij.codeInsight.lookup.VariableLookupItem) GetterLookupSubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.GetterLookupSubLookupElement) TIntObjectHashMap(gnu.trove.TIntObjectHashMap) Collection(java.util.Collection) ContextRelevantStaticMethod(com.intellij.compiler.classFilesIndex.chainsSearch.context.ContextRelevantStaticMethod) Nullable(org.jetbrains.annotations.Nullable)

Example 2 with SubLookupElement

use of com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement in project intellij-community by JetBrains.

the class ChainCompletionLookupElementUtil method fillMethodParameters.

public static String fillMethodParameters(final PsiMethod method, @Nullable final TIntObjectHashMap<SubLookupElement> replaceElements) {
    final TIntObjectHashMap<SubLookupElement> notNullReplaceElements = replaceElements == null ? new TIntObjectHashMap<>(0) : replaceElements;
    final PsiParameter[] parameters = method.getParameterList().getParameters();
    final StringBuilder sb = new StringBuilder();
    for (int i = 0; i < parameters.length; i++) {
        if (i != 0) {
            sb.append(", ");
        }
        final PsiParameter parameter = parameters[i];
        final SubLookupElement replaceElement = notNullReplaceElements.get(i);
        if (replaceElement != null) {
            sb.append(replaceElement.getInsertString());
        } else {
            sb.append(parameter.getName());
        }
    }
    return sb.toString();
}
Also used : PsiParameter(com.intellij.psi.PsiParameter) SubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement)

Example 3 with SubLookupElement

use of com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement in project intellij-community by JetBrains.

the class ChainCompletionMethodCallLookupElement method handleInsert.

@Override
public void handleInsert(final InsertionContext context) {
    super.handleInsert(context);
    if (!myMergedOverloads || isUniqueMethod(myMethod)) {
        context.commitDocument();
        context.getDocument().insertString(context.getTailOffset() - 1, ChainCompletionLookupElementUtil.fillMethodParameters(myMethod, myReplaceElements));
        final PsiFile file = context.getFile();
        assert file instanceof PsiJavaFile;
        final PsiJavaFile javaFile = (PsiJavaFile) file;
        if (myReplaceElements != null) {
            myReplaceElements.forEachValue(new TObjectProcedure<SubLookupElement>() {

                @Override
                public boolean execute(final SubLookupElement subLookupElement) {
                    subLookupElement.doImport(javaFile);
                    return true;
                }
            });
        }
        context.commitDocument();
        context.getEditor().getCaretModel().moveToOffset(context.getTailOffset());
        context.commitDocument();
    }
}
Also used : PsiFile(com.intellij.psi.PsiFile) PsiJavaFile(com.intellij.psi.PsiJavaFile) SubLookupElement(com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement)

Aggregations

SubLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.SubLookupElement)3 JavaChainLookupElement (com.intellij.codeInsight.completion.JavaChainLookupElement)1 LookupElement (com.intellij.codeInsight.lookup.LookupElement)1 VariableLookupItem (com.intellij.codeInsight.lookup.VariableLookupItem)1 ChainCompletionLookupElementUtil.createLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.ChainCompletionLookupElementUtil.createLookupElement)1 ChainCompletionNewVariableLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.ChainCompletionNewVariableLookupElement)1 WeightableChainLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.WeightableChainLookupElement)1 GetterLookupSubLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.GetterLookupSubLookupElement)1 VariableSubLookupElement (com.intellij.compiler.classFilesIndex.chainsSearch.completion.lookup.sub.VariableSubLookupElement)1 ContextRelevantStaticMethod (com.intellij.compiler.classFilesIndex.chainsSearch.context.ContextRelevantStaticMethod)1 ContextRelevantVariableGetter (com.intellij.compiler.classFilesIndex.chainsSearch.context.ContextRelevantVariableGetter)1 PsiFile (com.intellij.psi.PsiFile)1 PsiJavaFile (com.intellij.psi.PsiJavaFile)1 PsiParameter (com.intellij.psi.PsiParameter)1 TIntObjectHashMap (gnu.trove.TIntObjectHashMap)1 Collection (java.util.Collection)1 Nullable (org.jetbrains.annotations.Nullable)1