PY-42520 Impl filter repeated named args

GitOrigin-RevId: f68f51219b49792f109f94352e83f5671d53f3dd
This commit is contained in:
andrey.matveev
2020-05-29 14:27:52 +07:00
committed by intellij-monorepo-bot
parent 49f52250f1
commit c4bf5bc2fc
2 changed files with 23 additions and 27 deletions

View File

@@ -1829,6 +1829,18 @@ public abstract class PythonCommonCompletionTest extends PythonCommonTestCase {
assertSdkRootsNotParsed(file);
}
// PY-42520
public void testNoRepeatingNamedArgs() {
runWithLanguageLevel(
LanguageLevel.getLatest(),
() -> {
List<String> suggested = doTestByText("print(end='.', <caret>");
assertContainsElements(suggested, "sep=", "file=");
assertDoesntContain(suggested, "end=");
}
);
}
private void doTestHasattrContributor(String[] inList, String[] notInList) {
doTestHasattrContributor("hasattrCompletion/" + getTestName(true) + ".py", inList, notInList);
}

View File

@@ -1,45 +1,24 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.psi.impl.references;
import static com.jetbrains.python.psi.PyUtil.as;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.PyCallExpression;
import com.jetbrains.python.psi.PyCallable;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyElementVisitor;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.PyNamedParameter;
import com.jetbrains.python.psi.PyParameter;
import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.PyStarArgument;
import com.jetbrains.python.psi.PyStringLiteralExpression;
import com.jetbrains.python.psi.PySubscriptionExpression;
import com.jetbrains.python.psi.PyTypedElement;
import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyKeywordArgumentProvider;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.QualifiedResolveResult;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
import com.jetbrains.python.psi.types.PyCallableParameter;
import com.jetbrains.python.psi.types.PyCallableType;
import com.jetbrains.python.psi.types.PyClassType;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.PyTypeUtil;
import com.jetbrains.python.psi.types.TypeEvalContext;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import com.jetbrains.python.psi.types.*;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static com.jetbrains.python.psi.PyUtil.as;
public class KeywordArgumentCompletionUtil {
public static void collectFunctionArgNames(PyElement element,
List<? super LookupElement> ret,
@@ -56,9 +35,14 @@ public class KeywordArgumentCompletionUtil {
calleeType = context.getType(implicit);
}
}
Set<String> namedArgsAlready = StreamEx.of(callExpr.getArgumentList().getArguments())
.select(PyKeywordArgument.class)
.map(PyKeywordArgument::getKeyword)
.toSet();
final List<LookupElement> extra = PyTypeUtil.toStream(calleeType)
.select(PyCallableType.class)
.flatMap(type -> collectParameterNamesFromType(type, callExpr, context).stream())
.filter(it -> !namedArgsAlready.contains(it))
.map(name -> PyUtil.createNamedParameterLookup(name, element.getContainingFile(), addEquals))
.toList();