mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Make creating resolve context with explicit type eval context shorter
GitOrigin-RevId: 7dce0f1869ca114d729f8368273291940eda21ef
This commit is contained in:
committed by
intellij-monorepo-bot
parent
ee5a2bf513
commit
7b8b5bb12f
@@ -1344,7 +1344,7 @@ public abstract class PyCommonResolveTest extends PyCommonResolveTestCase {
|
||||
|
||||
final PsiFile file = myFixture.getFile();
|
||||
final TypeEvalContext context = TypeEvalContext.codeAnalysis(myFixture.getProject(), file);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
// It's like an attempt to find type annotation for attribute on the class level.
|
||||
final PyClassTypeImpl classType = new PyClassTypeImpl(target.getContainingClass(), true);
|
||||
@@ -1530,7 +1530,7 @@ public abstract class PyCommonResolveTest extends PyCommonResolveTestCase {
|
||||
myFixture.addFileToProject("a.py", "b = {} # type: dict"); // specify type of `b` so `__getitem__` could be resolved
|
||||
|
||||
final TypeEvalContext context = TypeEvalContext.codeInsightFallback(myFixture.getProject());
|
||||
assertEmpty(file.findTopLevelAttribute("t").multiResolveAssignedValue(PyResolveContext.defaultContext().withTypeEvalContext(context)));
|
||||
assertEmpty(file.findTopLevelAttribute("t").multiResolveAssignedValue(PyResolveContext.defaultContext(context)));
|
||||
}
|
||||
|
||||
// PY-36062
|
||||
|
||||
@@ -45,6 +45,11 @@ public final class PyResolveContext {
|
||||
return ourDefaultContext;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static PyResolveContext defaultContext(@NotNull TypeEvalContext context) {
|
||||
return ourDefaultContext.withTypeEvalContext(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow searching for dynamic usages based on duck typing and guesses during resolve.
|
||||
*
|
||||
@@ -55,11 +60,26 @@ public final class PyResolveContext {
|
||||
return ourImplicitsContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow searching for dynamic usages based on duck typing and guesses during resolve.
|
||||
*
|
||||
* Note that this resolve context is slower than the default one. Use it only for one-off user actions.
|
||||
*/
|
||||
@NotNull
|
||||
public static PyResolveContext implicitContext(@NotNull TypeEvalContext context) {
|
||||
return ourImplicitsContext.withTypeEvalContext(context);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static PyResolveContext noProperties() {
|
||||
return ourNoPropertiesContext;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static PyResolveContext noProperties(@NotNull TypeEvalContext context) {
|
||||
return ourNoPropertiesContext.withTypeEvalContext(context);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PyResolveContext withTypeEvalContext(@NotNull TypeEvalContext context) {
|
||||
return new PyResolveContext(myAllowImplicits, myAllowProperties, myAllowRemote, context);
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class NumpyModuleMembersProvider extends PyModuleMembersProvider {
|
||||
@NotNull
|
||||
protected Collection<PyCustomMember> getMembersByQName(@NotNull PyFile module, @NotNull String qName, @NotNull TypeEvalContext context) {
|
||||
if ("numpy".equals(qName)) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final PsiElement clazz = new PyPsiPath.ToClassQName(DTYPE).resolve(module, resolveContext);
|
||||
if (clazz != null) {
|
||||
final List<PyCustomMember> members = new ArrayList<>();
|
||||
|
||||
+2
-2
@@ -62,7 +62,7 @@ open class PySoftFileReferenceContributor : PsiReferenceContributor() {
|
||||
val argList = expr.parent as? PyArgumentList ?: return false
|
||||
val callExpr = argList.parent as? PyCallExpression ?: return false
|
||||
val typeEvalContext = TypeEvalContext.codeInsightFallback(expr.project)
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
|
||||
return callExpr.multiResolveCallee(resolveContext)
|
||||
.asSequence()
|
||||
@@ -102,7 +102,7 @@ open class PySoftFileReferenceContributor : PsiReferenceContributor() {
|
||||
) as? PyTypedElement ?: return false
|
||||
val osPathLikeType = typeEvalContext.getType(osPathLike) ?: return false
|
||||
|
||||
return callExpr.multiResolveCallee(PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext))
|
||||
return callExpr.multiResolveCallee(PyResolveContext.defaultContext(typeEvalContext))
|
||||
.asSequence()
|
||||
.mapNotNull {
|
||||
val mapping = PyCallExpressionHelper.mapArguments(callExpr, it, typeEvalContext)
|
||||
|
||||
+2
-3
@@ -49,9 +49,8 @@ public class PyTargetElementEvaluator implements TargetElementEvaluator {
|
||||
}
|
||||
|
||||
final PsiElement element = ref.getElement();
|
||||
final var resolveContext = PyResolveContext
|
||||
.defaultContext()
|
||||
.withTypeEvalContext(TypeEvalContext.codeAnalysis(element.getProject(), element.getContainingFile()));
|
||||
final var resolveContext =
|
||||
PyResolveContext.defaultContext(TypeEvalContext.codeAnalysis(element.getProject(), element.getContainingFile()));
|
||||
|
||||
PsiElement result = PyResolveUtil.resolveDeclaration(ref, resolveContext);
|
||||
Set<PsiElement> visited = new HashSet<>();
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ class PyMultipleArgumentsCompletionContributor: CompletionContributor() {
|
||||
|
||||
val call = PsiTreeUtil.getParentOfType(position, PyCallExpression::class.java) ?: return
|
||||
val typeEvalContext = parameters.getTypeEvalContext()
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
val callableTypes = call.multiResolveCallee(resolveContext)
|
||||
if (callableTypes.isEmpty()) return
|
||||
|
||||
|
||||
+3
-3
@@ -72,7 +72,7 @@ public class PyAnnotateVariableTypeIntention extends PyBaseIntentionAction {
|
||||
|
||||
final ProjectFileIndex index = ProjectFileIndex.getInstance(project);
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.codeAnalysis(project, file);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(typeEvalContext);
|
||||
// TODO filter out targets defined in stubs
|
||||
return StreamEx.of(resolveReferenceAugAssignmentsAware(elementAtCaret, resolveContext, new HashSet<>()))
|
||||
.select(PyTargetExpression.class)
|
||||
@@ -156,7 +156,7 @@ public class PyAnnotateVariableTypeIntention extends PyBaseIntentionAction {
|
||||
assert target.getContainingClass() != null;
|
||||
assert target.getName() != null;
|
||||
final PyClassTypeImpl classType = new PyClassTypeImpl(target.getContainingClass(), true);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<? extends RatedResolveResult> classAttrs =
|
||||
classType.resolveMember(target.getName(), target, AccessDirection.READ, resolveContext, true);
|
||||
if (classAttrs == null) {
|
||||
@@ -174,7 +174,7 @@ public class PyAnnotateVariableTypeIntention extends PyBaseIntentionAction {
|
||||
if (target.isQualified() && target.getContainingClass() != null && scopeOwner instanceof PyFunction) {
|
||||
|
||||
if (context.maySwitchToAST(target)) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
//noinspection ConstantConditions
|
||||
return StreamEx.of(PyUtil.multiResolveTopPriority(target.getQualifier(), resolveContext))
|
||||
.select(PyParameter.class)
|
||||
|
||||
+1
-1
@@ -165,6 +165,6 @@ public abstract class TypeIntention extends PyBaseIntentionAction {
|
||||
|
||||
private static PyResolveContext getResolveContext(@NotNull PsiElement origin) {
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.codeAnalysis(origin.getProject(), origin.getContainingFile());
|
||||
return PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext);
|
||||
return PyResolveContext.defaultContext(typeEvalContext);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ public final class PyParameterInfoUtils {
|
||||
final PyCallExpression call = argumentList.getCallExpression();
|
||||
if (call != null) {
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(argumentList.getProject(), argumentList.getContainingFile());
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withRemote().withTypeEvalContext(typeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(typeEvalContext).withRemote();
|
||||
|
||||
return call.multiResolveCallee(resolveContext)
|
||||
.stream()
|
||||
|
||||
+2
-2
@@ -69,7 +69,7 @@ class PyDataclassTypeProvider : PyTypeProviderBase() {
|
||||
val call = PyCallExpressionNavigator.getPyCallExpressionByCallee(referenceExpression) ?: return null
|
||||
val callee = call.callee as? PyReferenceExpression ?: return null
|
||||
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
val resolvedCallee = PyUtil.multiResolveTopPriority(callee.getReference(resolveContext)).singleOrNull()
|
||||
|
||||
return if (resolvedCallee is PyCallable) getDataclassesReplaceType(resolvedCallee, call, context) else null
|
||||
@@ -104,7 +104,7 @@ class PyDataclassTypeProvider : PyTypeProviderBase() {
|
||||
private fun getDataclassTypeForClass(cls: PyClass, context: TypeEvalContext): PyCallableType? {
|
||||
val clsType = (context.getType(cls) as? PyClassLikeType) ?: return null
|
||||
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
val elementGenerator = PyElementGenerator.getInstance(cls.project)
|
||||
val ellipsis = elementGenerator.createEllipsis()
|
||||
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ class PyOverridingClassDunderMembersProvider : PyClassMembersProviderBase(), PyO
|
||||
direction: AccessDirection,
|
||||
context: TypeEvalContext): List<PsiElement> {
|
||||
val objectType = PyBuiltinCache.getInstance(type.pyClass).objectType ?: return emptyList()
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
val results = objectType.resolveMember(name, location, direction, resolveContext) ?: return emptyList()
|
||||
return results.mapNotNull { it.element }
|
||||
}
|
||||
|
||||
@@ -4,11 +4,17 @@ package com.jetbrains.python.codeInsight.typing
|
||||
import com.jetbrains.python.PyNames
|
||||
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider.PROTOCOL
|
||||
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider.PROTOCOL_EXT
|
||||
import com.jetbrains.python.psi.*
|
||||
import com.jetbrains.python.psi.AccessDirection
|
||||
import com.jetbrains.python.psi.PyClass
|
||||
import com.jetbrains.python.psi.PyPossibleClassMember
|
||||
import com.jetbrains.python.psi.PyTypedElement
|
||||
import com.jetbrains.python.psi.impl.PyCallExpressionHelper.resolveImplicitlyInvokedMethods
|
||||
import com.jetbrains.python.psi.resolve.PyResolveContext
|
||||
import com.jetbrains.python.psi.resolve.RatedResolveResult
|
||||
import com.jetbrains.python.psi.types.*
|
||||
import com.jetbrains.python.psi.types.PyClassLikeType
|
||||
import com.jetbrains.python.psi.types.PyClassType
|
||||
import com.jetbrains.python.psi.types.PyType
|
||||
import com.jetbrains.python.psi.types.TypeEvalContext
|
||||
|
||||
|
||||
fun isProtocol(classLikeType: PyClassLikeType, context: TypeEvalContext): Boolean = containsProtocol(classLikeType.getSuperClassTypes(context))
|
||||
@@ -25,7 +31,7 @@ fun matchingProtocolDefinitions(expected: PyType?, actual: PyType?, context: Typ
|
||||
typealias ProtocolAndSubclassElements = Pair<PyTypedElement, List<RatedResolveResult>?>
|
||||
|
||||
fun inspectProtocolSubclass(protocol: PyClassType, subclass: PyClassType, context: TypeEvalContext): List<ProtocolAndSubclassElements> {
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
val result = mutableListOf<Pair<PyTypedElement, List<RatedResolveResult>?>>()
|
||||
|
||||
protocol.toInstance().visitMembers(
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ class PyTypingInspectionExtension : PyInspectionExtension() {
|
||||
// here is the check that current element is like `typing.List[int]`
|
||||
// but be careful: builtin collections inherit `typing.Generic` in typeshed
|
||||
if (operand is PyReferenceExpression) {
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
val resolveResults = operand.getReference(resolveContext).multiResolve(false)
|
||||
|
||||
if (resolveResults
|
||||
|
||||
+2
-2
@@ -481,7 +481,7 @@ public class PyTypingTypeProvider extends PyTypeProviderBase {
|
||||
|
||||
if (target.isQualified()) {
|
||||
if (pyClass != null && scopeOwner instanceof PyFunction) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
boolean isInstanceAttribute;
|
||||
if (context.maySwitchToAST(target)) {
|
||||
@@ -1379,7 +1379,7 @@ public class PyTypingTypeProvider extends PyTypeProviderBase {
|
||||
if (expression instanceof PyReferenceExpression) {
|
||||
final List<PsiElement> results;
|
||||
if (context.maySwitchToAST(expression)) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
results = PyUtil.multiResolveTopPriority(expression, resolveContext);
|
||||
}
|
||||
else {
|
||||
|
||||
+1
-1
@@ -421,7 +421,7 @@ public class PyDocumentationBuilder {
|
||||
|
||||
@Nullable
|
||||
private PsiElement resolveWithoutImplicits(@NotNull PyReferenceExpression element) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myContext);
|
||||
final QualifiedResolveResult resolveResult = element.followAssignmentsChain(resolveContext);
|
||||
return resolveResult.isImplicit() ? null : resolveResult.getElement();
|
||||
}
|
||||
|
||||
+1
-1
@@ -422,7 +422,7 @@ public class PythonDocumentationProvider implements DocumentationProvider {
|
||||
if (expression instanceof PyReferenceExpression) {
|
||||
final PyReferenceExpression referenceExpression = (PyReferenceExpression)expression;
|
||||
if (!referenceExpression.isQualified()) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
for (ResolveResult result : referenceExpression.getReference(resolveContext).multiResolve(false)) {
|
||||
final PsiElement element = result.getElement();
|
||||
|
||||
+1
-1
@@ -148,7 +148,7 @@ public class PyAugmentAssignmentInspection extends PyInspection {
|
||||
return SEQUENCE_METHODS.stream().anyMatch(attributeNames::contains);
|
||||
}
|
||||
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
return !SEQUENCE_METHODS
|
||||
.stream()
|
||||
|
||||
+1
-1
@@ -182,7 +182,7 @@ class PyDataclassInspection : PyInspection() {
|
||||
override fun visitPyCallExpression(node: PyCallExpression) {
|
||||
super.visitPyCallExpression(node)
|
||||
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(myTypeEvalContext)
|
||||
val callableType = node.multiResolveCallee(resolveContext).singleOrNull()
|
||||
val callee = callableType?.callable
|
||||
val calleeQName = callee?.qualifiedName
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ public class PyGlobalUndefinedInspection extends PyInspection {
|
||||
final PyTargetExpression[] globals = node.getGlobals();
|
||||
|
||||
for (PyTargetExpression global : globals) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
final List<PsiElement> elements = PyUtil.multiResolveTopPriority(global.getReference(resolveContext));
|
||||
final boolean noTopLevelDeclaration = elements.stream().noneMatch(PyUtil::isTopLevel);
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ public abstract class PyInspectionVisitor extends PyElementVisitor {
|
||||
}
|
||||
|
||||
protected PyResolveContext getResolveContext() {
|
||||
return PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
return PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
+3
-3
@@ -76,7 +76,7 @@ public class PyProtectedMemberInspection extends PyInspection {
|
||||
final PsiDirectory currentFileDirectory = importSource.getContainingFile().getContainingDirectory();
|
||||
|
||||
if (currentFileDirectory != null && PyUtil.isPackage(currentFileDirectory, true, importSource)) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
return StreamEx
|
||||
.of(importSource.getReference(resolveContext).multiResolve(false))
|
||||
@@ -209,7 +209,7 @@ public class PyProtectedMemberInspection extends PyInspection {
|
||||
|
||||
@Nullable
|
||||
private Set<String> collectDunderAlls(@NotNull PyReferenceExpression source) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
final List<List<String>> resolvedDunderAlls = StreamEx
|
||||
.of(source.getReference(resolveContext).multiResolve(false))
|
||||
@@ -228,7 +228,7 @@ public class PyProtectedMemberInspection extends PyInspection {
|
||||
}
|
||||
|
||||
private boolean resolvesToFileSystemItem(@NotNull PyReferenceExpression referenceExpression) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
return ContainerUtil.exists(referenceExpression.getReference(resolveContext).multiResolve(false),
|
||||
result -> result.getElement() instanceof PsiFileSystemItem);
|
||||
|
||||
@@ -111,7 +111,7 @@ class PyProtocolInspection : PyInspection() {
|
||||
}
|
||||
|
||||
private fun checkNewTypeWithProtocols(node: PyCallExpression) {
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(myTypeEvalContext)
|
||||
|
||||
node
|
||||
.multiResolveCalleeFunction(resolveContext)
|
||||
|
||||
+3
-3
@@ -86,7 +86,7 @@ public class PyStringFormatInspection extends PyInspection {
|
||||
PyLiteralExpression.class, PySubscriptionExpression.class, PyBinaryExpression.class, PyConditionalExpression.class
|
||||
};
|
||||
final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(problemTarget);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
|
||||
final String s = myFormatSpec.get("1");
|
||||
if (PsiTreeUtil.instanceOf(rightExpression, SIMPLE_RHS_EXPRESSIONS)) {
|
||||
@@ -247,8 +247,8 @@ public class PyStringFormatInspection extends PyInspection {
|
||||
if (addSubscriptions) {
|
||||
additionalExpressions = addSubscriptions(rightExpression.getContainingFile(),
|
||||
rightExpression.getText());
|
||||
pyElement = ((PyReferenceExpression)rightExpression).followAssignmentsChain(
|
||||
PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext)).getElement();
|
||||
final var resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
pyElement = ((PyReferenceExpression)rightExpression).followAssignmentsChain(resolveContext).getElement();
|
||||
}
|
||||
else {
|
||||
additionalExpressions = new HashMap<>();
|
||||
|
||||
+1
-1
@@ -205,7 +205,7 @@ class PyTypeHintsInspection : PyInspection() {
|
||||
}
|
||||
|
||||
private fun checkTypeVarArguments(call: PyCallExpression, target: PyExpression?) {
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(myTypeEvalContext)
|
||||
var covariant = false
|
||||
var contravariant = false
|
||||
var bound: PyExpression? = null
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ public class PyRemoveParameterQuickFix implements LocalQuickFix {
|
||||
|
||||
final PyFunction function = PsiTreeUtil.getParentOfType(psi, PyFunction.class);
|
||||
if (function != null) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(ctx);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(ctx);
|
||||
|
||||
StreamEx
|
||||
.of(PyPsiIndexUtil.findUsages(function, false))
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ public class PyReplaceTupleWithListQuickFix implements LocalQuickFix {
|
||||
if (subscriptionExpression.getOperand() instanceof PyReferenceExpression) {
|
||||
PyReferenceExpression referenceExpression = (PyReferenceExpression)subscriptionExpression.getOperand();
|
||||
final TypeEvalContext context = TypeEvalContext.userInitiated(project, element.getContainingFile());
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
element = referenceExpression.followAssignmentsChain(resolveContext).getElement();
|
||||
if (element instanceof PyParenthesizedExpression) {
|
||||
final PyExpression expression = ((PyParenthesizedExpression)element).getContainedExpression();
|
||||
|
||||
+2
-2
@@ -127,7 +127,7 @@ public abstract class PyUnresolvedReferencesVisitor extends PyInspectionVisitor
|
||||
processInjection(host);
|
||||
}
|
||||
if (node instanceof PyReferenceOwner) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
processReference(node, ((PyReferenceOwner)node).getReference(resolveContext));
|
||||
}
|
||||
else {
|
||||
@@ -150,7 +150,7 @@ public abstract class PyUnresolvedReferencesVisitor extends PyInspectionVisitor
|
||||
public void visitPyElement(@NotNull PyElement element) {
|
||||
super.visitPyElement(element);
|
||||
if (element instanceof PyReferenceOwner) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
final PsiPolyVariantReference reference = ((PyReferenceOwner)element).getReference(resolveContext);
|
||||
markTargetImportsAsUsed(reference);
|
||||
}
|
||||
|
||||
+1
-1
@@ -460,7 +460,7 @@ public final class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor {
|
||||
}
|
||||
final PyCallExpression expr = (PyCallExpression)source;
|
||||
if (expr.isCalleeText("range", "xrange")) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myTypeEvalContext);
|
||||
final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(forStatement);
|
||||
|
||||
return ContainerUtil.exists(expr.multiResolveCalleeFunction(resolveContext), builtinCache::isBuiltin);
|
||||
|
||||
@@ -157,8 +157,7 @@ public final class PyKnownDecoratorUtil {
|
||||
resolved = PyResolveUtil.resolveQualifiedNameInScope(qualifiedName, (ScopeOwner)containingFile, context);
|
||||
}
|
||||
else {
|
||||
resolved = PyUtil.multiResolveTopPriority(Objects.requireNonNull(decorator.getCallee()),
|
||||
PyResolveContext.defaultContext().withTypeEvalContext(context));
|
||||
resolved = PyUtil.multiResolveTopPriority(Objects.requireNonNull(decorator.getCallee()), PyResolveContext.defaultContext(context));
|
||||
}
|
||||
return StreamEx.of(resolved)
|
||||
.select(PyQualifiedNameOwner.class)
|
||||
|
||||
@@ -1513,7 +1513,7 @@ public final class PyUtil {
|
||||
@NotNull String memberName,
|
||||
@Nullable PyExpression location,
|
||||
@NotNull TypeEvalContext context) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<? extends RatedResolveResult> resolveResults = type.resolveMember(memberName, location, AccessDirection.READ,
|
||||
resolveContext);
|
||||
|
||||
|
||||
@@ -148,8 +148,8 @@ public class PyBaseElementImpl<T extends StubElement> extends StubBasedPsiElemen
|
||||
List<PsiReference> referencesList = new ArrayList<>();
|
||||
final PsiFile file = element.getContainingFile();
|
||||
final PyResolveContext resolveContext = file != null ?
|
||||
PyResolveContext.implicitContext().withTypeEvalContext(TypeEvalContext.codeAnalysis(file.getProject(), file)) :
|
||||
PyResolveContext.implicitContext();
|
||||
PyResolveContext.implicitContext(TypeEvalContext.codeAnalysis(file.getProject(), file)) :
|
||||
PyResolveContext.implicitContext();
|
||||
while (element != null) {
|
||||
addReferences(offset, element, referencesList, resolveContext);
|
||||
offset = element.getStartOffsetInParent() + offset;
|
||||
|
||||
+1
-1
@@ -138,7 +138,7 @@ public class PyBinaryExpressionImpl extends PyElementImpl implements PyBinaryExp
|
||||
if (PyNames.CONTAINS.equals(getReferencedName())) return PyBuiltinCache.getInstance(this).getBoolType();
|
||||
|
||||
final List<PyCallExpression.PyArgumentsMapping> results =
|
||||
PyCallExpressionHelper.mapArguments(this, PyResolveContext.defaultContext().withTypeEvalContext(context));
|
||||
PyCallExpressionHelper.mapArguments(this, PyResolveContext.defaultContext(context));
|
||||
if (!results.isEmpty()) {
|
||||
final List<PyType> types = new ArrayList<>();
|
||||
final List<PyType> matchedTypes = new ArrayList<>();
|
||||
|
||||
+3
-3
@@ -574,7 +574,7 @@ public final class PyCallExpressionHelper {
|
||||
}
|
||||
}
|
||||
}
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
return getCallType(multiResolveCallee(call, resolveContext), call, context);
|
||||
}
|
||||
|
||||
@@ -585,7 +585,7 @@ public final class PyCallExpressionHelper {
|
||||
static @Nullable PyType getCallType(@NotNull PySubscriptionExpression subscription,
|
||||
@NotNull TypeEvalContext context,
|
||||
@SuppressWarnings("unused") @NotNull TypeEvalContext.Key key) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
return getCallType(multiResolveCallee(subscription, resolveContext), subscription, context);
|
||||
}
|
||||
|
||||
@@ -817,7 +817,7 @@ public final class PyCallExpressionHelper {
|
||||
final List<PyCallableParameter> parameters = callableType.getParameters(context);
|
||||
if (parameters == null) return PyCallExpression.PyArgumentsMapping.empty(callSite);
|
||||
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<PyExpression> arguments = callSite.getArguments(callable);
|
||||
final List<PyCallableParameter> explicitParameters = filterExplicitParameters(parameters, callable, callSite, resolveContext);
|
||||
final List<PyCallableParameter> implicitParameters = parameters.subList(0, parameters.size() - explicitParameters.size());
|
||||
|
||||
@@ -1383,7 +1383,7 @@ public class PyClassImpl extends PyBaseElementImpl<PyClassStub> implements PyCla
|
||||
final PyReferenceExpression referenceExpr = as(expression, PyReferenceExpression.class);
|
||||
final PsiElement resolved;
|
||||
if (referenceExpr != null) {
|
||||
resolved = referenceExpr.followAssignmentsChain(PyResolveContext.defaultContext().withTypeEvalContext(context)).getElement();
|
||||
resolved = referenceExpr.followAssignmentsChain(PyResolveContext.defaultContext(context)).getElement();
|
||||
}
|
||||
else {
|
||||
final PsiReference ref = expression.getReference();
|
||||
|
||||
+2
-2
@@ -48,8 +48,8 @@ public final class PyGotoDeclarationHandler extends GotoDeclarationHandlerBase {
|
||||
if (sourceElement == null) {
|
||||
return null;
|
||||
}
|
||||
final PyResolveContext context = PyResolveContext.defaultContext()
|
||||
.withTypeEvalContext(TypeEvalContext.userInitiated(sourceElement.getProject(), sourceElement.getContainingFile()));
|
||||
final PyResolveContext context =
|
||||
PyResolveContext.defaultContext(TypeEvalContext.userInitiated(sourceElement.getProject(), sourceElement.getContainingFile()));
|
||||
|
||||
PyReferenceOwner referenceOwner = null;
|
||||
final PsiElement parent = sourceElement.getParent();
|
||||
|
||||
@@ -270,7 +270,7 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
|
||||
// Guess the type from file-local calls
|
||||
if (context.allowCallContext(this)) {
|
||||
final List<PyType> types = new ArrayList<>();
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final PyCallableParameter parameter = PyCallableParameterImpl.psi(this);
|
||||
|
||||
processLocalCalls(
|
||||
@@ -457,7 +457,7 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
return callExpression.multiMapArguments(resolveContext)
|
||||
.stream()
|
||||
.flatMap(mapping -> mapping.getMappedParameters().entrySet().stream())
|
||||
|
||||
+1
-1
@@ -83,7 +83,7 @@ public class PyPrefixExpressionImpl extends PyElementImpl implements PyPrefixExp
|
||||
}
|
||||
|
||||
return StreamEx
|
||||
.of(PyCallExpressionHelper.mapArguments(this, PyResolveContext.defaultContext().withTypeEvalContext(context)))
|
||||
.of(PyCallExpressionHelper.mapArguments(this, PyResolveContext.defaultContext(context)))
|
||||
.map(PyCallExpression.PyArgumentsMapping::getCallableType)
|
||||
.nonNull()
|
||||
.map(callableType -> callableType.getCallType(context, this))
|
||||
|
||||
+4
-4
@@ -54,7 +54,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
|
||||
//noinspection InstanceofIncompatibleInterface
|
||||
assert !(this instanceof StubBasedPsiElement);
|
||||
final TypeEvalContext context = TypeEvalContext.codeAnalysis(getProject(), getContainingFile());
|
||||
return getReference(PyResolveContext.defaultContext().withTypeEvalContext(context));
|
||||
return getReference(PyResolveContext.defaultContext(context));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -247,7 +247,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
|
||||
private PyType getCallableType(@NotNull TypeEvalContext context, @NotNull TypeEvalContext.Key key) {
|
||||
PyCallExpression callExpression = PyCallExpressionNavigator.getPyCallExpressionByCallee(this);
|
||||
if (callExpression != null) {
|
||||
return getCalleeType(callExpression, PyResolveContext.defaultContext().withTypeEvalContext(context));
|
||||
return getCalleeType(callExpression, PyResolveContext.defaultContext(context));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -257,7 +257,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
|
||||
if (!isQualified()) return null;
|
||||
final PyClassLikeType targetType = as(typeFromTargets, PyClassLikeType.class);
|
||||
if (targetType == null || targetType.isDefinition()) return null;
|
||||
final PyResolveContext resolveContext = PyResolveContext.noProperties().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.noProperties(context);
|
||||
final List<? extends RatedResolveResult> members = targetType.resolveMember(PyNames.GET, this, AccessDirection.READ,
|
||||
resolveContext);
|
||||
if (members == null || members.isEmpty()) return null;
|
||||
@@ -293,7 +293,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
|
||||
|
||||
@Nullable
|
||||
private PyType getTypeFromTargets(@NotNull TypeEvalContext context) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<PyType> members = new ArrayList<>();
|
||||
|
||||
final PsiFile realFile = FileContextUtil.getContextFile(this);
|
||||
|
||||
+3
-3
@@ -133,7 +133,7 @@ public class PyTargetExpressionImpl extends PyBaseElementImpl<PyTargetExpression
|
||||
return type;
|
||||
}
|
||||
if (!context.maySwitchToAST(this)) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
final List<PyType> types = StreamEx
|
||||
.of(multiResolveAssignedValue(resolveContext))
|
||||
@@ -191,7 +191,7 @@ public class PyTargetExpressionImpl extends PyBaseElementImpl<PyTargetExpression
|
||||
return assignedValue == null ? null : context.getType(assignedValue);
|
||||
}
|
||||
if (parent instanceof PyGlobalStatement || parent instanceof PyNonlocalStatement) {
|
||||
PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
List<PyType> collect = StreamEx.of(getReference(resolveContext).multiResolve(false))
|
||||
.map(ResolveResult::getElement)
|
||||
.select(PyTypedElement.class)
|
||||
@@ -431,7 +431,7 @@ public class PyTargetExpressionImpl extends PyBaseElementImpl<PyTargetExpression
|
||||
|
||||
@Nullable
|
||||
private static PyFunction findMethodByName(@NotNull PyType type, @NotNull String name, @NotNull TypeEvalContext context) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ, resolveContext);
|
||||
if (results != null && !results.isEmpty()) {
|
||||
final RatedResolveResult result = results.get(0);
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ public class KeywordArgumentCompletionUtil {
|
||||
}
|
||||
|
||||
private static PsiElement getElementByChain(@NotNull PyReferenceExpression callee, @NotNull TypeEvalContext context) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext(context);
|
||||
final QualifiedResolveResult result = callee.followAssignmentsChain(resolveContext);
|
||||
return result.getElement();
|
||||
}
|
||||
|
||||
@@ -229,7 +229,7 @@ public final class PyResolveUtil {
|
||||
final String firstName = qualifiedName.getFirstComponent();
|
||||
if (firstName == null || !(scopeOwner instanceof PyTypedElement)) return Collections.emptyList();
|
||||
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
final List<? extends RatedResolveResult> unqualifiedResults;
|
||||
if (scopeOwner instanceof PyiFile) {
|
||||
|
||||
+1
-2
@@ -50,8 +50,7 @@ public class PythonBuiltinReferenceResolveProvider implements PyReferenceResolve
|
||||
result.addAll(
|
||||
Optional
|
||||
.ofNullable(builtinCache.getObjectType())
|
||||
.map(type -> type.resolveMember(referencedName, element, AccessDirection.of(element),
|
||||
PyResolveContext.defaultContext().withTypeEvalContext(context)))
|
||||
.map(type -> type.resolveMember(referencedName, element, AccessDirection.of(element), PyResolveContext.defaultContext(context)))
|
||||
.orElse(Collections.emptyList())
|
||||
);
|
||||
}
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ public class PythonOverridingBuiltinReferenceResolveProvider implements PyOverri
|
||||
if (processor.getElements().isEmpty()) {
|
||||
final PyType objectType = PyBuiltinCache.getInstance(element).getObjectType();
|
||||
if (objectType != null) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<? extends RatedResolveResult> results =
|
||||
objectType.resolveMember(PyNames.__CLASS__, element, AccessDirection.of(element), resolveContext);
|
||||
if (results != null) {
|
||||
|
||||
@@ -350,7 +350,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
|
||||
@Nullable
|
||||
@Override
|
||||
public List<PyCallableParameter> getParameters(@NotNull TypeEvalContext context) {
|
||||
final var resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final var resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
return StreamEx
|
||||
.of(PyUtil.filterTopPriorityElements(PyCallExpressionHelper.resolveImplicitlyInvokedMethods(this, null, resolveContext)))
|
||||
|
||||
@@ -12,7 +12,6 @@ import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil
|
||||
import com.jetbrains.python.psi.*
|
||||
import com.jetbrains.python.psi.impl.PyBuiltinCache
|
||||
import com.jetbrains.python.psi.resolve.PyResolveContext
|
||||
import java.util.*
|
||||
|
||||
object PyCollectionTypeUtil {
|
||||
|
||||
@@ -204,7 +203,7 @@ object PyCollectionTypeUtil {
|
||||
val funcName = qualifiedExpression.referencedName
|
||||
if (modificationMethods.containsKey(funcName)) {
|
||||
val referenceOwner = qualifiedExpression.qualifier as? PyReferenceOwner ?: return null
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
if (referenceOwner.getReference(resolveContext).isReferenceTo(element)) {
|
||||
isModificationExist = true
|
||||
val function = modificationMethods[funcName]
|
||||
@@ -243,7 +242,7 @@ object PyCollectionTypeUtil {
|
||||
}
|
||||
}
|
||||
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
val referenceOwner = node.operand as? PyReferenceOwner ?: return null
|
||||
val reference = referenceOwner.getReference(resolveContext)
|
||||
isModificationExist = if (reference.isReferenceTo(element)) true else return null
|
||||
|
||||
@@ -109,7 +109,7 @@ public class PyFunctionTypeImpl implements PyFunctionType {
|
||||
qualifier = location.getQualifier();
|
||||
}
|
||||
else {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
qualifier = ContainerUtil.getLastItem(location.followAssignmentsChain(resolveContext).getQualifiers());
|
||||
}
|
||||
if (qualifier != null) {
|
||||
|
||||
@@ -89,7 +89,7 @@ class PyLiteralType private constructor(cls: PyClass, val expression: PyExpressi
|
||||
|
||||
if (expression is PyReferenceExpression && expression.isQualified) {
|
||||
PyUtil
|
||||
.multiResolveTopPriority(expression, PyResolveContext.defaultContext().withTypeEvalContext(context))
|
||||
.multiResolveTopPriority(expression, PyResolveContext.defaultContext(context))
|
||||
.asSequence()
|
||||
.filterIsInstance<PyTargetExpression>()
|
||||
.mapNotNull { ScopeUtil.getScopeOwner(it) as? PyClass }
|
||||
|
||||
@@ -419,7 +419,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
|
||||
|
||||
final Set<String> namesAlready = context.get(CTX_NAMES);
|
||||
final PointInImport point = ResolveImportUtil.getPointInImport(location);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(typeEvalContext);
|
||||
|
||||
for (PyModuleMembersProvider provider : PyModuleMembersProvider.EP_NAME.getExtensionList()) {
|
||||
for (PyCustomMember member : provider.getMembers(myModule, point, typeEvalContext)) {
|
||||
|
||||
@@ -443,7 +443,7 @@ public final class PyTypeChecker {
|
||||
}
|
||||
}
|
||||
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
return !ContainerUtil.exists(expected.getAttributeNames(), attribute -> ContainerUtil
|
||||
.isEmpty(actual.resolveMember(attribute, null, AccessDirection.READ, resolveContext)));
|
||||
}
|
||||
@@ -1011,7 +1011,7 @@ public final class PyTypeChecker {
|
||||
|
||||
@Nullable
|
||||
private static PsiElement resolveTypeMember(@NotNull PyType type, @NotNull String name, @NotNull TypeEvalContext context) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ, resolveContext);
|
||||
return !ContainerUtil.isEmpty(results) ? results.get(0).getElement() : null;
|
||||
}
|
||||
|
||||
@@ -358,7 +358,7 @@ public class PyTypeParser {
|
||||
PyType type = resolveQualifierType(tokens, pyFile, myContext, types, fullRanges, imports);
|
||||
|
||||
if (type != null) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(myContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(myContext);
|
||||
final PyExpression expression = myAnchor instanceof PyExpression ? (PyExpression)myAnchor : null;
|
||||
|
||||
for (Token<PyElementType> token : tokens) {
|
||||
|
||||
@@ -203,7 +203,7 @@ public final class PyiUtil {
|
||||
@NotNull TypeEvalContext context) {
|
||||
if (similarOwnerType == null) return null;
|
||||
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
final List<? extends RatedResolveResult> results =
|
||||
similarOwnerType instanceof PyClassLikeType
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ object PyReceiverMlCompletionFeatures {
|
||||
}
|
||||
|
||||
private fun getReceivers(position: PsiElement, call: PyCallExpression, typeEvalContext: TypeEvalContext): List<PsiElement> {
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
val mapArguments = call.multiMapArguments(resolveContext)
|
||||
if (mapArguments.isEmpty()) return emptyList()
|
||||
return mapArguments.mapNotNull { entry -> entry.mappedParameters[position.parent]?.parameter }
|
||||
|
||||
@@ -72,7 +72,7 @@ public class PythonRegexpInjector implements MultiHostInjector {
|
||||
if (callee instanceof PyReferenceExpression && canBeRegexpCall(callee)) {
|
||||
final PyReferenceExpression referenceExpression = (PyReferenceExpression)callee;
|
||||
final TypeEvalContext context = TypeEvalContext.codeAnalysis(call.getProject(), call.getContainingFile());
|
||||
return referenceExpression.getReference(PyResolveContext.defaultContext().withTypeEvalContext(context)).resolve();
|
||||
return referenceExpression.getReference(PyResolveContext.defaultContext(context)).resolve();
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
+2
-3
@@ -141,9 +141,8 @@ public class PySmartStepIntoVariantVisitor extends PyRecursiveElementVisitor {
|
||||
int callOrder = getCallOrder();
|
||||
mySeenVariants.put(myVariantsFromPython.get(myVariantIndex).first, ++callOrder);
|
||||
|
||||
PsiElement resolved = expression.getReference(
|
||||
PyResolveContext.defaultContext().withTypeEvalContext(TypeEvalContext.userInitiated(
|
||||
expression.getProject(), expression.getContainingFile()))).resolve();
|
||||
var context = TypeEvalContext.userInitiated(expression.getProject(), expression.getContainingFile());
|
||||
PsiElement resolved = expression.getReference(PyResolveContext.defaultContext(context)).resolve();
|
||||
|
||||
if (resolved == null || isBuiltIn(resolved) || isAlreadySeen()) return;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class PyThirdPartyInspectionExtension : PyInspectionExtension() {
|
||||
if (cls.isSubclass(interfaceQName, context)) return true
|
||||
|
||||
// Checking for subclassing above does not help while zope.interface.Interface is defined as target with call expression assigned
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context)
|
||||
val resolveContext = PyResolveContext.defaultContext(context)
|
||||
for (expression in cls.superClassExpressions) {
|
||||
if (resolvesTo(expression, interfaceQName, resolveContext)) return true
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ public final class PyPackageUtil {
|
||||
|
||||
if (elementToAnalyze instanceof PyReferenceExpression) {
|
||||
final TypeEvalContext context = TypeEvalContext.deepCodeInsight(elementToAnalyze.getProject());
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
return StreamEx
|
||||
.of(((PyReferenceExpression)elementToAnalyze).multiFollowAssignmentsChain(resolveContext))
|
||||
|
||||
@@ -110,11 +110,9 @@ public class PythonPatterns extends PlatformPatterns {
|
||||
final PyCallExpression call = (PyCallExpression)((PyExpression)expression).getParent().getParent();
|
||||
|
||||
// TODO is it better or worse to allow implicits here?
|
||||
final PyResolveContext context = PyResolveContext
|
||||
.defaultContext()
|
||||
.withTypeEvalContext(TypeEvalContext.codeAnalysis(call.getProject(), call.getContainingFile()));
|
||||
final var context = TypeEvalContext.codeAnalysis(call.getProject(), call.getContainingFile());
|
||||
|
||||
return call.multiResolveCalleeFunction(context);
|
||||
return call.multiResolveCalleeFunction(PyResolveContext.defaultContext(context));
|
||||
}
|
||||
|
||||
private static boolean isCallArgument(@Nullable Object expression, @Nullable String functionName, int index) {
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ public class PyChangeSignatureHandler implements ChangeSignatureHandler {
|
||||
|
||||
final PyCallExpression callExpression = PsiTreeUtil.getParentOfType(element, PyCallExpression.class);
|
||||
if (callExpression != null) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext(context);
|
||||
final PyCallable resolved = ContainerUtil.getFirstItem(callExpression.multiResolveCalleeFunction(resolveContext));
|
||||
|
||||
return resolved instanceof PyFunction && PyiUtil.isOverload(resolved, context)
|
||||
|
||||
@@ -131,7 +131,7 @@ class PyInlineFunctionProcessor(project: Project,
|
||||
}
|
||||
|
||||
val typeEvalContext = TypeEvalContext.userInitiated(myProject, null)
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext)
|
||||
val resolveContext = PyResolveContext.defaultContext(typeEvalContext)
|
||||
|
||||
val selfUsed = myFunction.parameterList.parameters.firstOrNull()?.let { firstParam ->
|
||||
if (!firstParam.isSelf) return@let false
|
||||
|
||||
@@ -233,7 +233,7 @@ abstract public class IntroduceHandler implements RefactoringActionHandler {
|
||||
.map(PyArgumentList::getCallExpression)
|
||||
.ifPresent(
|
||||
call -> StreamEx
|
||||
.of(call.multiMapArguments(PyResolveContext.defaultContext().withTypeEvalContext(context)))
|
||||
.of(call.multiMapArguments(PyResolveContext.defaultContext(context)))
|
||||
.map(mapping -> mapping.getMappedParameters().get(expression))
|
||||
.nonNull()
|
||||
.map(PyCallableParameter::getName)
|
||||
|
||||
@@ -258,7 +258,7 @@ public class PyMoveFileHandler extends MoveFileHandler {
|
||||
if (getOriginalLocation(usageFile) != null) {
|
||||
// Leave relative imports as they are after #updateRelativeImportsInModule
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(usageFile.getProject(), usageFile);
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext().withTypeEvalContext(typeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.implicitContext(typeEvalContext);
|
||||
if (ContainerUtil.getFirstItem(PyUtil.multiResolveTopPriority(usageElement, resolveContext)) == movedElement) {
|
||||
continue;
|
||||
}
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ public abstract class PyBaseMakeFunctionTopLevelProcessor extends BaseRefactorin
|
||||
myFunction = targetFunction;
|
||||
myDestinationPath = destinationPath;
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(myProject, targetFunction.getContainingFile());
|
||||
myResolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext);
|
||||
myResolveContext = PyResolveContext.defaultContext(typeEvalContext);
|
||||
myGenerator = PyElementGenerator.getInstance(myProject);
|
||||
mySourceFile = myFunction.getContainingFile();
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ class PyTensorFlowTest : PyEnvTestCase() {
|
||||
return ApplicationManager.getApplication().runReadAction(
|
||||
Computable {
|
||||
val reference = myFixture.file.findElementAt(myFixture.caretOffset - 1)!!.parent as PyReferenceExpression
|
||||
val resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(TypeEvalContext.codeAnalysis(project, file))
|
||||
val resolveContext = PyResolveContext.defaultContext(TypeEvalContext.codeAnalysis(project, file))
|
||||
PyUtil.turnDirIntoInit(reference.followAssignmentsChain(resolveContext).element)!!
|
||||
}
|
||||
)
|
||||
|
||||
@@ -581,7 +581,7 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase {
|
||||
final PsiFile context = myFixture.configureByText("a.py", "");
|
||||
|
||||
final TypeEvalContext typeEvalContext = TypeEvalContext.codeAnalysis(myFixture.getProject(), context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(typeEvalContext);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(typeEvalContext);
|
||||
|
||||
final PsiElement resolved = customMember.resolve(context, resolveContext);
|
||||
assertInstanceOf(resolved, PyTypedElement.class);
|
||||
|
||||
@@ -7,7 +7,6 @@ import com.intellij.psi.PsiReference;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.jetbrains.python.fixtures.PyTestCase;
|
||||
import com.jetbrains.python.psi.PyCallExpression;
|
||||
import com.jetbrains.python.psi.PyCallable;
|
||||
import com.jetbrains.python.psi.PyFunction;
|
||||
import com.jetbrains.python.psi.resolve.PyResolveContext;
|
||||
import com.jetbrains.python.psi.types.PyCallableType;
|
||||
@@ -24,7 +23,7 @@ public class PyResolveCalleeTest extends PyTestCase {
|
||||
final PyCallExpression call = PsiTreeUtil.getParentOfType(ref.getElement(), PyCallExpression.class);
|
||||
|
||||
final TypeEvalContext context = TypeEvalContext.codeAnalysis(myFixture.getProject(), myFixture.getFile());
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
|
||||
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
|
||||
|
||||
final List<PyCallableType> callees = call.multiResolveCallee(resolveContext);
|
||||
assertEquals(1, callees.size());
|
||||
|
||||
Reference in New Issue
Block a user