Make creating resolve context with explicit type eval context shorter

GitOrigin-RevId: 7dce0f1869ca114d729f8368273291940eda21ef
This commit is contained in:
Semyon Proshev
2021-06-13 14:50:11 +00:00
committed by intellij-monorepo-bot
parent ee5a2bf513
commit 7b8b5bb12f
65 changed files with 118 additions and 100 deletions
@@ -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);
@@ -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<>();
@@ -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)
@@ -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<>();
@@ -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
@@ -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)
@@ -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);
}
}
@@ -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()
@@ -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()
@@ -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(
@@ -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
@@ -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 {
@@ -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();
}
@@ -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();
@@ -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()
@@ -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
@@ -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);
@@ -61,7 +61,7 @@ public abstract class PyInspectionVisitor extends PyElementVisitor {
}
protected PyResolveContext getResolveContext() {
return PyResolveContext.defaultContext().withTypeEvalContext(myTypeEvalContext);
return PyResolveContext.defaultContext(myTypeEvalContext);
}
@Nullable
@@ -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)
@@ -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<>();
@@ -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
@@ -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))
@@ -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();
@@ -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);
}
@@ -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;
@@ -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<>();
@@ -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();
@@ -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())
@@ -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))
@@ -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);
@@ -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);
@@ -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) {
@@ -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())
);
}
@@ -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
@@ -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;
@@ -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) {
@@ -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;
}
@@ -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());