From fce1b98e7c09657ade8700684d4b3f635bc86c61 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Mon, 13 May 2013 17:02:34 +0400 Subject: [PATCH] Added 'origin' parameter to TypeEvalContext.userInitiated() --- .../python/psi/types/TypeEvalContext.java | 4 +-- .../PyDictKeyNamesCompletionContributor.java | 2 +- .../override/PyOverrideImplementUtil.java | 3 +- .../documentation/DocStringTypeReference.java | 2 +- .../documentation/PyDocumentationBuilder.java | 8 ++--- .../PythonDocumentationProvider.java | 8 ++--- .../findUsages/PyUsageTypeProvider.java | 2 +- .../quickfix/AddMethodQuickFix.java | 2 +- .../impl/references/PyImportReference.java | 2 +- .../impl/references/PyQualifiedReference.java | 2 +- .../python/psi/types/PyClassTypeImpl.java | 2 +- .../refactoring/PyReplaceExpressionUtil.java | 2 +- .../introduce/IntroduceHandler.java | 2 +- .../jetbrains/python/PyTypeParserTest.java | 4 +-- .../com/jetbrains/python/PyTypeTest.java | 30 +++++++++---------- 15 files changed, 38 insertions(+), 37 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java b/python/psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java index 773651e5e590..3e77defefca4 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java @@ -58,8 +58,8 @@ public class TypeEvalContext { * * Should be used for code completion, go to definition, find usages, refactorings, documentation. */ - public static TypeEvalContext userInitiated() { - return new TypeEvalContext(true, true, null); + public static TypeEvalContext userInitiated(@Nullable PsiFile origin) { + return new TypeEvalContext(true, true, origin); } /** diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyDictKeyNamesCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyDictKeyNamesCompletionContributor.java index 5bf6b125049a..232b2ce0b895 100644 --- a/python/src/com/jetbrains/python/codeInsight/completion/PyDictKeyNamesCompletionContributor.java +++ b/python/src/com/jetbrains/python/codeInsight/completion/PyDictKeyNamesCompletionContributor.java @@ -114,7 +114,7 @@ public class PyDictKeyNamesCompletionContributor extends CompletionContributor { if (callee == null) return; final String name = callee.getText(); if ("dict".equals(name)) { - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(callee.getContainingFile()); final PyType type = context.getType(dictConstructor); if (type != null && type.isBuiltin(context)) { final PyArgumentList list = dictConstructor.getArgumentList(); diff --git a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java index a244b69a795b..9b9c9f438fa2 100644 --- a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java +++ b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java @@ -196,7 +196,8 @@ public class PyOverrideImplementUtil { statementBody.append(PyNames.PASS); } else { - if (!PyNames.INIT.equals(baseFunction.getName()) && baseFunction.getReturnType(TypeEvalContext.userInitiated(), null) != PyNoneType.INSTANCE) { + final TypeEvalContext context = TypeEvalContext.userInitiated(baseFunction.getContainingFile()); + if (!PyNames.INIT.equals(baseFunction.getName()) && baseFunction.getReturnType(context, null) != PyNoneType.INSTANCE) { statementBody.append("return "); } if (baseClass.isNewStyleClass()) { diff --git a/python/src/com/jetbrains/python/documentation/DocStringTypeReference.java b/python/src/com/jetbrains/python/documentation/DocStringTypeReference.java index 8966ed176271..9b8dace47630 100644 --- a/python/src/com/jetbrains/python/documentation/DocStringTypeReference.java +++ b/python/src/com/jetbrains/python/documentation/DocStringTypeReference.java @@ -113,7 +113,7 @@ public class DocStringTypeReference extends PsiPolyVariantReferenceBase body) { - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(fun.getContainingFile()); PyTypeModelBuilder builder = new PyTypeModelBuilder(context); builder.build(fun).toBodyWithLinks(body, fun); } @@ -481,7 +481,7 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i @Nullable private static PyClass inferClassOfParameter(PsiElement context) { if (context instanceof PyNamedParameter) { - final PyType type = TypeEvalContext.userInitiated().getType((PyNamedParameter)context); + final PyType type = TypeEvalContext.userInitiated(context.getContainingFile()).getType((PyNamedParameter)context); if (type instanceof PyClassType) { return ((PyClassType)type).getPyClass(); } diff --git a/python/src/com/jetbrains/python/findUsages/PyUsageTypeProvider.java b/python/src/com/jetbrains/python/findUsages/PyUsageTypeProvider.java index 97480fed2e40..8397651d66da 100644 --- a/python/src/com/jetbrains/python/findUsages/PyUsageTypeProvider.java +++ b/python/src/com/jetbrains/python/findUsages/PyUsageTypeProvider.java @@ -39,7 +39,7 @@ public class PyUsageTypeProvider implements UsageTypeProviderEx { if (element instanceof PyQualifiedExpression) { final PyExpression qualifier = ((PyQualifiedExpression)element).getQualifier(); if (qualifier != null) { - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(element.getContainingFile()); final PyType type = context.getType(qualifier); if (type == null || type instanceof PyTypeReference) { final PyCallExpression call = PsiTreeUtil.getParentOfType(element, PyCallExpression.class); diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java index 26ffaeed5030..a7690b0c10b4 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java @@ -75,7 +75,7 @@ public class AddMethodQuickFix implements LocalQuickFix { boolean made_instance = false; if (call_by_class) { if (args.length > 0) { - PyType first_arg_type = TypeEvalContext.userInitiated().getType(args[0]); + PyType first_arg_type = TypeEvalContext.userInitiated(cls.getContainingFile()).getType(args[0]); if (first_arg_type instanceof PyClassType && ((PyClassType)first_arg_type).getPyClass().isSubclass(cls)) { // class, first arg ok: instance method builder.parameter("self"); // NOTE: might use a name other than 'self', according to code style. diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java index 2629dc62a926..4d4e14c779e1 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java @@ -81,7 +81,7 @@ public class PyImportReference extends PyReferenceImpl { } PyExpression qualifier = myElement.getQualifier(); - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(myElement.getContainingFile()); if (qualifier != null) { // qualifier's type must be module, it should know how to complete PyType type = context.getType(qualifier); diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java index b3ce5a3b3cd4..f1d900f49319 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -247,7 +247,7 @@ public class PyQualifiedReference extends PyReferenceImpl { } final PyQualifiedExpression element = CompletionUtil.getOriginalOrSelf(myElement); - PyType qualifierType = TypeEvalContext.userInitiated().getType(qualifier); + PyType qualifierType = TypeEvalContext.userInitiated(myElement.getContainingFile()).getType(qualifier); ProcessingContext ctx = new ProcessingContext(); final Set namesAlready = new HashSet(); ctx.put(PyType.CTX_NAMES, namesAlready); diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index a78f9e7c2d51..0d6e61c479d5 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -348,7 +348,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { boolean suppressParentheses = context.get(CTX_SUPPRESS_PARENTHESES) != null; addOwnClassMembers(location, namesAlready, suppressParentheses, ret); - final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(); + final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(location != null ? location.getContainingFile() : null); addInheritedMembers(prefix, location, namesAlready, context, ret, typeEvalContext); // from providers diff --git a/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java b/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java index 1013ac3a6038..166b18b82749 100644 --- a/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java +++ b/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java @@ -110,7 +110,7 @@ public class PyReplaceExpressionUtil implements PyElementTypes { return replaceSubstringWithDictFormatting(oldExpression, quotes, prefix, suffix, formatValue, newText); } else { - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(oldExpression.getContainingFile()); final PyType valueType = context.getType(formatValue); final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(oldExpression); final PyType tupleType = builtinCache.getTupleType(); diff --git a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java index 65c831ee94fe..0e8d0914f06a 100644 --- a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java +++ b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java @@ -188,7 +188,7 @@ abstract public class IntroduceHandler implements RefactoringActionHandler { if (text != null) { candidates.addAll(NameSuggesterUtil.generateNames(text)); } - final TypeEvalContext context = TypeEvalContext.userInitiated(); + final TypeEvalContext context = TypeEvalContext.userInitiated(expression.getContainingFile()); PyType type = context.getType(expression); if (type != null && type != PyNoneType.INSTANCE) { String typeName = type.getName(); diff --git a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java index 35997f16b957..67cce7cc7325 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java @@ -33,7 +33,7 @@ public class PyTypeParserTest extends PyTestCase { myFixture.configureByFile("typeParser/typeParser.py"); final PyCollectionType type = (PyCollectionType) PyTypeParser.getTypeByName(myFixture.getFile(), "list of MyObject"); assertClassType(type, "list"); - assertClassType(type.getElementType(TypeEvalContext.userInitiated()), "MyObject"); + assertClassType(type.getElementType(TypeEvalContext.userInitiated(null)), "MyObject"); } public void testDictType() { @@ -41,7 +41,7 @@ public class PyTypeParserTest extends PyTestCase { final PyCollectionType type = (PyCollectionType) PyTypeParser.getTypeByName(myFixture.getFile(), "dict from str to MyObject"); assertNotNull(type); assertClassType(type, "dict"); - final PyType elementType = type.getElementType(TypeEvalContext.userInitiated()); + final PyType elementType = type.getElementType(TypeEvalContext.userInitiated(null)); assertInstanceOf(elementType, PyTupleType.class); final PyTupleType tupleType = (PyTupleType)elementType; assertEquals(2, tupleType.getElementCount()); diff --git a/python/testSrc/com/jetbrains/python/PyTypeTest.java b/python/testSrc/com/jetbrains/python/PyTypeTest.java index f8cc1f9398d4..dfa9789ba325 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeTest.java @@ -220,7 +220,7 @@ public class PyTypeTest extends PyTestCase { " return x\n" + "expr = f(1, 2)\n"; PyExpression expr = parseExpr(text); - PyType t = TypeEvalContext.userInitiated().getType(expr); + PyType t = TypeEvalContext.userInitiated(null).getType(expr); assertTrue(PyTypeChecker.isUnknown(t)); doTest("int", text); } @@ -234,7 +234,7 @@ public class PyTypeTest extends PyTestCase { " return foo(x)\n" + "expr = xyzzy(a, b)"; PyExpression expr = parseExpr(text); - PyType t = TypeEvalContext.userInitiated().getType(expr); + PyType t = TypeEvalContext.userInitiated(null).getType(expr); assertInstanceOf(t, PyTypeReference.class); } @@ -296,7 +296,7 @@ public class PyTypeTest extends PyTestCase { public void testSOEOnRecursiveCall() { PyExpression expr = parseExpr("def foo(x): return foo(x)\n" + "expr = foo(1)"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertFalse(actual.isBuiltin(context)); } @@ -310,7 +310,7 @@ public class PyTypeTest extends PyTestCase { " return x\n" + "\n" + "expr = f(1)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertNotNull(actual); assertEquals("int", actual.getName()); @@ -325,7 +325,7 @@ public class PyTypeTest extends PyTestCase { " return x\n" + "\n" + "expr = f(1)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertNotNull(actual); assertEquals("int", actual.getName()); @@ -335,7 +335,7 @@ public class PyTypeTest extends PyTestCase { public void testYieldType() { PyExpression expr = parseExpr("def f():\n" + " expr = yield 2\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertNull(actual); } @@ -344,7 +344,7 @@ public class PyTypeTest extends PyTestCase { public void testYieldParensType() { PyExpression expr = parseExpr("def f():\n" + " expr = (yield 2)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertNull(actual); } @@ -389,7 +389,7 @@ public class PyTypeTest extends PyTestCase { "\n" + "x = f()\n" + "expr = x.start\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); assertNull(actual); } @@ -401,7 +401,7 @@ public class PyTypeTest extends PyTestCase { "\n" + "x = C()\n" + "expr = type(x)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType type = context.getType(expr); assertInstanceOf(type, PyClassType.class); assertTrue("Got instance type instead of class type", ((PyClassType)type).isDefinition()); @@ -413,7 +413,7 @@ public class PyTypeTest extends PyTestCase { " pass\n" + "\n" + "expr = type(C)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType type = context.getType(expr); assertInstanceOf(type, PyClassType.class); assertEquals(type.getName(), "type"); @@ -423,7 +423,7 @@ public class PyTypeTest extends PyTestCase { public void testReturnTypeOfTypeForUnknown() { PyExpression expr = parseExpr("def f(x):\n" + " expr = type(x)\n"); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType type = context.getType(expr); assertNull(type); } @@ -453,7 +453,7 @@ public class PyTypeTest extends PyTestCase { // PY-7020 public void testListComprehensionType() { final PyExpression expr = parseExpr("expr = [str(x) for x in range(10)]\n"); - final TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + final TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); final PyType type = context.getType(expr); assertNotNull(type); assertInstanceOf(type, PyCollectionType.class); @@ -467,7 +467,7 @@ public class PyTypeTest extends PyTestCase { // PY-7021 public void testGeneratorComprehensionType() { final PyExpression expr = parseExpr("expr = (str(x) for x in range(10))\n"); - final TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + final TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); final PyType type = context.getType(expr); assertNotNull(type); assertInstanceOf(type, PyCollectionType.class); @@ -558,7 +558,7 @@ public class PyTypeTest extends PyTestCase { public void testDefaultParameterIgnoreNone() { final PyExpression expr = parseExpr("def f(x=None):\n" + " expr = x\n"); - final TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + final TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); final PyType type = context.getType(expr); assertNull(type); } @@ -576,7 +576,7 @@ public class PyTypeTest extends PyTestCase { private void doTest(final String expectedType, final String text) { PyExpression expr = parseExpr(text); - TypeEvalContext context = TypeEvalContext.userInitiated().withTracing(); + TypeEvalContext context = TypeEvalContext.userInitiated(null).withTracing(); PyType actual = context.getType(expr); PyType expected = PyTypeParser.getTypeByName(expr, expectedType); if (expected != null) {