diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java index 8ae078c19833..e10966c07019 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java @@ -21,17 +21,15 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.QualifiedName; import com.intellij.util.Function; import com.intellij.util.containers.hash.HashMap; import com.jetbrains.python.PyNames; -import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; -import com.intellij.psi.util.QualifiedName; import com.jetbrains.python.psi.resolve.PyResolveContext; import com.jetbrains.python.psi.resolve.QualifiedNameResolverImpl; import com.jetbrains.python.psi.resolve.RatedResolveResult; -import com.jetbrains.python.psi.stubs.PyClassNameIndex; import com.jetbrains.python.psi.types.functionalParser.ForwardDeclaration; import com.jetbrains.python.psi.types.functionalParser.FunctionalParser; import com.jetbrains.python.psi.types.functionalParser.ParserException; @@ -41,7 +39,10 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.StringReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import static com.jetbrains.python.psi.types.PyTypeTokenTypes.IDENTIFIER; import static com.jetbrains.python.psi.types.PyTypeTokenTypes.PARAMETER; @@ -384,13 +385,6 @@ public class PyTypeParser { } } - if (unqualified) { - final ParseResult result = fromClassNameIndex(first); - if (result != null) { - return result; - } - } - return EMPTY_RESULT; } @@ -518,28 +512,6 @@ public class PyTypeParser { return null; } - - @Nullable - private ParseResult fromClassNameIndex(@NotNull Token token) { - final Collection classes = PyClassNameIndex.find(token.getText().toString(), myAnchor.getProject(), true); - if (classes.size() == 1) { - return parseResultFromClass(token, classes.iterator().next()); - } - for (PyClass cls : classes) { - final PsiFile file = cls.getContainingFile(); - if (file != null && !PyUserSkeletonsUtil.isUnderUserSkeletonsDirectory(file)) { - return parseResultFromClass(token, cls); - } - } - return null; - } - - @NotNull - private static ParseResult parseResultFromClass(@NotNull Token token, @NotNull PyClass cls) { - final PyClassTypeImpl type = new PyClassTypeImpl(cls, false); - type.assertValid("PyClassNameIndex.find().iterator()"); - return new ParseResult(type, token.getRange()); - } } private static FunctionalParser, PyElementType> op(@Nullable String text) { diff --git a/python/testData/inspections/PyTypeCheckerInspection/Generator.py b/python/testData/inspections/PyTypeCheckerInspection/Generator.py index 870b822aad6b..7523940a8593 100644 --- a/python/testData/inspections/PyTypeCheckerInspection/Generator.py +++ b/python/testData/inspections/PyTypeCheckerInspection/Generator.py @@ -9,22 +9,22 @@ def test(): return xs def f_2(xs): """ - :type xs: Sequence of int + :type xs: collections.Sequence of int """ return xs def f_3(xs): """ - :type xs: Container of int + :type xs: collections.Container of int """ return xs def f_4(xs): """ - :type xs: Iterator of int + :type xs: collections.Iterator of int """ return xs def f_5(xs): """ - :type xs: Iterable of int + :type xs: collections.Iterable of int """ return xs def f_6(xs): @@ -34,22 +34,22 @@ def test(): return xs def f_7(xs): """ - :type xs: Sequence + :type xs: collections.Sequence """ return xs def f_8(xs): """ - :type xs: Container + :type xs: collections.Container """ return xs def f_9(xs): """ - :type xs: Iterator + :type xs: collections.Iterator """ return xs def f_10(xs): """ - :type xs: Iterable + :type xs: collections.Iterable """ return xs def f_11(xs): @@ -59,22 +59,22 @@ def test(): return xs def f_12(xs): """ - :type xs: Sequence of string + :type xs: collections.Sequence of string """ return xs def f_13(xs): """ - :type xs: Container of string + :type xs: collections.Container of string """ return xs def f_14(xs): """ - :type xs: Iterator of string + :type xs: collections.Iterator of string """ return xs def f_15(xs): """ - :type xs: Iterable of string + :type xs: collections.Iterable of string """ return xs return [ diff --git a/python/testData/inspections/PyTypeCheckerInspection/GenericUserClasses.py b/python/testData/inspections/PyTypeCheckerInspection/GenericUserClasses.py index 4360bdd034d5..e652dcf92fc6 100644 --- a/python/testData/inspections/PyTypeCheckerInspection/GenericUserClasses.py +++ b/python/testData/inspections/PyTypeCheckerInspection/GenericUserClasses.py @@ -1,27 +1,24 @@ -def test_generic_user_class(): - class User1(object): - def __init__(self, x): - """ - :type x: T - :rtype: User1 of T - """ - self.x = x +class User1(object): + def __init__(self, x): + """ + :type x: T + :rtype: User1 of T + """ + self.x = x - def get(self): - """ - :rtype: T - """ - return self.x - - def put(self, value): - """ - :type value: T - """ - self.x = value - - c = User1(10) - print(c.get() + 'foo') - c.put(14) - c.put('foo') + def get(self): + """ + :rtype: T + """ + return self.x + def put(self, value): + """ + :type value: T + """ + self.x = value +c = User1(10) +print(c.get() + 'foo') +c.put(14) +c.put('foo') diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/attributesOfUnresolvedTypeFile.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/attributesOfUnresolvedTypeFile.py new file mode 100644 index 000000000000..7ac6df0ca92b --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/attributesOfUnresolvedTypeFile.py @@ -0,0 +1,6 @@ +def foo(fd): + """ + :type fd: file + """ + fd.read() + fd.flush() diff --git a/python/testData/quickdoc/NumPyOnesDoc.html b/python/testData/quickdoc/NumPyOnesDoc.html index 22c482b10807..03114985615c 100644 --- a/python/testData/quickdoc/NumPyOnesDoc.html +++ b/python/testData/quickdoc/NumPyOnesDoc.html @@ -1,2 +1,2 @@ def ones(shape, dtype=None, order='C') -Inferred type: (shape: int, dtype: object, order: str) -> ndarray
+Inferred type: (shape: int, dtype: object, order: str) -> ndarray
diff --git a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java index adc7a931dc86..a74b75806b8b 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java @@ -127,12 +127,6 @@ public class PyTypeParserTest extends PyTestCase { assertEquals(2, result.getTypes().size()); } - public void testUnqualifiedNotImportedType() { - myFixture.configureByFile("typeParser/typeParser.py"); - final PyType type = PyTypeParser.getTypeByName(myFixture.getFile(), "Iterable"); - assertClassType(type, "Iterable"); - } - public void testTypeSubparts() { myFixture.configureByFile("typeParser/typeParser.py"); final String s = "list of (MyObject, collections.Iterable of MyObject, int) or None"; @@ -283,10 +277,6 @@ public class PyTypeParserTest extends PyTestCase { doTest("Iterator[int]", "collections.Iterator[int]"); } - public void testUnqualifiedUserSkeletonsClass() { - doTest("Iterator[int]", "Iterator[int]"); - } - private void doTest(final String expectedType, final String text) { myFixture.configureByFile("typeParser/typeParser.py"); final PsiFile file = myFixture.getFile(); diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java index fe019c6abc84..159a7218ff6f 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java @@ -106,4 +106,9 @@ public class Py3UnresolvedReferencesInspectionTest extends PyTestCase { public void testEnumMemberAttributes() { doMultiFileTest("a.py"); } + + // PY-12864 + public void testAttributesOfUnresolvedTypeFile() { + doTest(); + } }