mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-14 18:05:27 +07:00
Use isReferenceTo(keywordContainer) instead of name matching (PY-26285)
This commit is contained in:
@@ -180,11 +180,10 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static <T> List<T> findKeywordContainerUsages(@NotNull PyFunction function,
|
private static <T> List<T> findKeywordContainerUsages(@NotNull PyFunction function,
|
||||||
@NotNull BiPredicate<PsiElement, String> usagePredicate) {
|
@NotNull BiPredicate<PsiElement, PyParameter> usagePredicate) {
|
||||||
final PyParameter keywordContainer = getKeywordContainer(function.getParameterList());
|
final PyParameter keywordContainer = getKeywordContainer(function.getParameterList());
|
||||||
final String keywordContainerName = keywordContainer == null ? null : keywordContainer.getName();
|
|
||||||
|
|
||||||
if (keywordContainerName != null) {
|
if (keywordContainer != null) {
|
||||||
final List<T> result = new ArrayList<>();
|
final List<T> result = new ArrayList<>();
|
||||||
final Stack<PsiElement> stack = new Stack<>();
|
final Stack<PsiElement> stack = new Stack<>();
|
||||||
|
|
||||||
@@ -194,7 +193,7 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction {
|
|||||||
while (!stack.isEmpty()) {
|
while (!stack.isEmpty()) {
|
||||||
final PsiElement element = stack.pop();
|
final PsiElement element = stack.pop();
|
||||||
|
|
||||||
if (usagePredicate.test(element, keywordContainerName)) {
|
if (usagePredicate.test(element, keywordContainer)) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
result.add((T)element);
|
result.add((T)element);
|
||||||
}
|
}
|
||||||
@@ -212,25 +211,31 @@ public class ConvertVariadicParamIntention extends PyBaseIntentionAction {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isKeywordContainerSubscription(@Nullable PsiElement element, @NotNull String keywordContainerName) {
|
private static boolean isKeywordContainerSubscription(@Nullable PsiElement element, @NotNull PyParameter keywordContainer) {
|
||||||
return element instanceof PySubscriptionExpression &&
|
if (element instanceof PySubscriptionExpression) {
|
||||||
keywordContainerName.equals(((PySubscriptionExpression)element).getOperand().getText());
|
final PyExpression operand = ((PySubscriptionExpression)element).getOperand();
|
||||||
|
if (operand instanceof PyReferenceExpression) {
|
||||||
|
return ((PyReferenceExpression)operand).getReference().isReferenceTo(keywordContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isKeywordContainerCall(@Nullable PsiElement element, @NotNull String keywordContainerName) {
|
private static boolean isKeywordContainerCall(@Nullable PsiElement element, @NotNull PyParameter keywordContainer) {
|
||||||
return Optional
|
if (element instanceof PyCallExpression) {
|
||||||
.ofNullable(PyUtil.as(element, PyCallExpression.class))
|
final PyExpression callee = ((PyCallExpression)element).getCallee();
|
||||||
.map(PyCallExpression::getCallee)
|
if (callee instanceof PyQualifiedExpression) {
|
||||||
.map(callee -> PyUtil.as(callee, PyQualifiedExpression.class))
|
final PyQualifiedExpression qualifiedCallee = (PyQualifiedExpression)callee;
|
||||||
.filter(
|
final PyExpression qualifier = qualifiedCallee.getQualifier();
|
||||||
callee -> {
|
|
||||||
final PyExpression qualifier = callee.getQualifier();
|
if (qualifier instanceof PyReferenceExpression) {
|
||||||
return qualifier != null &&
|
return ((PyReferenceExpression)qualifier).getReference().isReferenceTo(keywordContainer) &&
|
||||||
qualifier.getText().equals(keywordContainerName) &&
|
ArrayUtil.contains(qualifiedCallee.getReferencedName(), "get", "pop", PyNames.GETITEM);
|
||||||
ArrayUtil.contains(callee.getReferencedName(), "get", "pop", PyNames.GETITEM);
|
|
||||||
}
|
}
|
||||||
)
|
}
|
||||||
.isPresent();
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void insertParameter(@NotNull PyParameterList parameterList,
|
private static void insertParameter(@NotNull PyParameterList parameterList,
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
def outer(<caret>**kwargs):
|
||||||
|
def nested():
|
||||||
|
print(kwargs['foo'])
|
||||||
|
return kwargs.get('bar')
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
def outer(foo, bar=None, **kwargs):
|
||||||
|
def nested():
|
||||||
|
print(foo)
|
||||||
|
return bar
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
def outer(<caret>**kwargs):
|
||||||
|
def nested(**kwargs):
|
||||||
|
print(kwargs['foo'])
|
||||||
|
return kwargs.get('bar')
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
def outer(bar=None, **kwargs):
|
||||||
|
def nested(**kwargs):
|
||||||
|
print(kwargs['foo'])
|
||||||
|
return bar
|
||||||
@@ -244,6 +244,16 @@ public class PyIntentionTest extends PyTestCase {
|
|||||||
doTest(PyBundle.message("INTN.convert.variadic.param"));
|
doTest(PyBundle.message("INTN.convert.variadic.param"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PY-26285
|
||||||
|
public void testConvertVariadicParamOverriddenInNested() {
|
||||||
|
doTest(PyBundle.message("INTN.convert.variadic.param"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// PY-26285
|
||||||
|
public void testConvertVariadicParamNotOverriddenInNested() {
|
||||||
|
doTest(PyBundle.message("INTN.convert.variadic.param"));
|
||||||
|
}
|
||||||
|
|
||||||
public void testConvertTripleQuotedString() { //PY-2697
|
public void testConvertTripleQuotedString() { //PY-2697
|
||||||
doTest(PyBundle.message("INTN.triple.quoted.string"));
|
doTest(PyBundle.message("INTN.triple.quoted.string"));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user