PY-83529 Make type name reasonable (PyModuleType, PyImportedModuleType)

(cherry picked from commit a5f8641bcae3cd01eb7ff174e289cbf3ca5e3b2b)

GitOrigin-RevId: 41050e03a015e79c74ff54a390090e5e5f70d783
This commit is contained in:
Petr
2025-11-12 17:28:36 +00:00
committed by intellij-monorepo-bot
parent 3a58a09cbe
commit c1c6c8c945
33 changed files with 53 additions and 48 deletions
@@ -102,7 +102,7 @@ public class PyImportedModuleType implements PyType {
@Override
public String getName() {
return "imported module " + myImportedModule.getImportedPrefix().toString();
return myImportedModule.getImportedPrefix().toString();
}
@Override
@@ -13,6 +13,7 @@ import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.LazyInitializer;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ProcessingContext;
import com.intellij.util.Processor;
@@ -41,12 +42,14 @@ import static com.jetbrains.python.psi.PyUtil.inSameFile;
public class PyModuleType implements PyType { // Modules don't descend from object
private final @NotNull PyFile myModule;
private final @NotNull LazyInitializer.LazyValue<@Nullable QualifiedName> myQualifiedName;
private static final ImmutableSet<String> MODULE_MEMBERS = ImmutableSet.of(
"__name__", "__file__", "__path__", "__doc__", "__dict__", "__package__");
public PyModuleType(@NotNull PyFile source) {
myModule = source;
myQualifiedName = LazyInitializer.create(() -> QualifiedNameFinder.findShortestImportableQName(myModule));
}
@@ -565,7 +568,8 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
@Override
public String getName() {
return myModule.getName();
QualifiedName qualifiedName = myQualifiedName.get();
return qualifiedName != null ? qualifiedName.toString() : "";
}
@Override
@@ -14,6 +14,6 @@ class Options1(Protocol[T1, T2, T3]):
def foo(self, x: T1, y: T2) -> T3: ...
t1: Options1[int, str, bool] = mod
t2: Options1[int, float, bool] = <warning descr="Expected type 'Options1[int, float, bool]', got 'mod.py' instead">mod</warning>
t3: Options1[str, float, bool] = <warning descr="Expected type 'Options1[str, float, bool]', got 'mod.py' instead">mod</warning>
t4: Options1[int, str, str] = <warning descr="Expected type 'Options1[int, str, str]', got 'mod.py' instead">mod</warning>
t2: Options1[int, float, bool] = <warning descr="Expected type 'Options1[int, float, bool]', got 'mod' instead">mod</warning>
t3: Options1[str, float, bool] = <warning descr="Expected type 'Options1[str, float, bool]', got 'mod' instead">mod</warning>
t4: Options1[int, str, str] = <warning descr="Expected type 'Options1[int, str, str]', got 'mod' instead">mod</warning>
@@ -13,4 +13,4 @@ class Options2(Protocol):
op1: Options1 = _protocols_modules1
op1: Options2 = <warning descr="Expected type 'Options2', got '_protocols_modules1.py' instead">_protocols_modules1</warning>
op1: Options2 = <warning descr="Expected type 'Options2', got '_protocols_modules1' instead">_protocols_modules1</warning>
@@ -21,5 +21,5 @@ class Reporter3(Protocol):
rp1: Reporter1 = _protocols_modules2 # OK
rp2: Reporter2 = <warning descr="Expected type 'Reporter2', got '_protocols_modules2.py' instead">_protocols_modules2</warning>
rp3: Reporter3 = <warning descr="Expected type 'Reporter3', got '_protocols_modules2.py' instead">_protocols_modules2</warning>
rp2: Reporter2 = <warning descr="Expected type 'Reporter2', got '_protocols_modules2' instead">_protocols_modules2</warning>
rp3: Reporter3 = <warning descr="Expected type 'Reporter3', got '_protocols_modules2' instead">_protocols_modules2</warning>
@@ -1,5 +1,5 @@
import numpy
numpy.foo()
numpy.<warning descr="Cannot find reference 'bar' in '__init__.py'">bar</warning>()
numpy.<warning descr="Cannot find reference 'baz' in '__init__.py'">baz</warning>()
numpy.<warning descr="Cannot find reference 'bar' in 'numpy'">bar</warning>()
numpy.<warning descr="Cannot find reference 'baz' in 'numpy'">baz</warning>()
@@ -1,3 +1,3 @@
from importSource import <error descr="Cannot find reference 'len' in '__init__.py'">len</error>
from importSource import <error descr="Cannot find reference 'len' in 'importSource'">len</error>
len()
@@ -1,11 +1,11 @@
import <error descr="No module named 'un1'">un1</error>
import os.<error descr="No module named 'un2'">un2</error>
from os import <error descr="Cannot find reference 'un3' in 'os.py'">un3</error>
from os import <error descr="Cannot find reference 'un3' in 'os'">un3</error>
from <error descr="Unresolved reference 'un4'">un4</error>.un5 import <error descr="Unresolved reference 'un6'">un6</error>
from os.<error descr="Cannot find reference 'un7' in 'os.py'">un7</error> import <error descr="Unresolved reference 'un8'">un8</error>
from os.<error descr="Cannot find reference 'un7' in 'os'">un7</error> import <error descr="Unresolved reference 'un8'">un8</error>
un1
os.<warning descr="Cannot find reference 'un2' in 'imported module os'">un2</warning>
os.<warning descr="Cannot find reference 'un2' in 'os'">un2</warning>
un3
un6
un8
@@ -1,4 +1,4 @@
import p1.m1 #pass
print(p1.m1) #pass
print(p1.<warning descr="Cannot find reference 'm2' in 'imported module p1'">m2</warning>) #fail
print(p1.<warning descr="Cannot find reference 'm2' in 'p1'">m2</warning>) #fail
@@ -1,4 +1,4 @@
from library import foo,<error descr="Cannot find reference 'bar' in 'library.py'">bar</error>
from library import foo,<error descr="Cannot find reference 'bar' in 'library'">bar</error>
print(foo)
@@ -1,4 +1,4 @@
import c
print(c.A().foo())
print(c.<warning descr="Cannot find reference 'b' in 'c.py'">b</warning>.A().foo())
print(c.<warning descr="Cannot find reference 'b' in 'c'">b</warning>.A().foo())
@@ -1,6 +1,6 @@
from complete import a
from complete import b
from complete import <error descr="Cannot find reference 'e' in 'complete.pyi'">e</error>
from complete import <error descr="Cannot find reference 'e' in 'complete'">e</error>
from incomplete import c
from incomplete import d
@@ -1 +1 @@
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module.py'">eggs</error>
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module'">eggs</error>
@@ -1,2 +1,2 @@
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module.py'">eggs</error>
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module.py'">eggs</error>
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module'">eggs</error>
from my_module import <error descr="Cannot find reference 'eggs' in 'my_module'">eggs</error>
@@ -1,4 +1,4 @@
from my_package.my_module import <error descr="Cannot find reference 'eggs' in 'my_module.py'">eggs</error>
from my_package.my_module import <error descr="Cannot find reference 'eggs' in 'my_module.py'">eggs</error>
from my_package.my_module import <error descr="Cannot find reference 'eggs' in 'my_package.my_module'">eggs</error>
from my_package.my_module import <error descr="Cannot find reference 'eggs' in 'my_package.my_module'">eggs</error>
eggs()
@@ -1 +1 @@
from nspkg1 import <error descr="Cannot find reference 'not_found' in 'imported module nspkg1'">not_found</error>
from nspkg1 import <error descr="Cannot find reference 'not_found' in 'nspkg1'">not_found</error>
@@ -1,6 +1,6 @@
from lib1 import m1
from lib1.m1 import x
from lib1.m1 import <error descr="Cannot find reference 'something' in 'm1.py'">something</error>
from lib1.m1 import <error descr="Cannot find reference 'something' in 'lib1.m1'">something</error>
print(m1, x, something)
@@ -1,5 +1,5 @@
import nspkg1.m2
print(nspkg1.m2)
print(nspkg1.<warning descr="Cannot find reference 'm3' in 'imported module nspkg1'">m3</warning>)
print(nspkg1.<warning descr="Cannot find reference 'nssubpkg1' in 'imported module nspkg1'">nssubpkg1</warning>)
print(nspkg1.<warning descr="Cannot find reference 'm3' in 'nspkg1'">m3</warning>)
print(nspkg1.<warning descr="Cannot find reference 'nssubpkg1' in 'nspkg1'">nssubpkg1</warning>)
@@ -1,4 +1,4 @@
import c
print(c.A().foo())
print(c.<warning descr="Cannot find reference 'b' in 'c.py'">b</warning>.A().foo())
print(c.<warning descr="Cannot find reference 'b' in 'c'">b</warning>.A().foo())
@@ -1,3 +1,3 @@
import mod
clzz = mod.<caret><warning descr="Cannot find reference 'Clzz' in 'mod.py'">Clzz</warning>()
clzz = mod.<caret><warning descr="Cannot find reference 'Clzz' in 'mod'">Clzz</warning>()
@@ -1,3 +1,3 @@
import pkg
clzz = pkg.<caret><warning descr="Cannot find reference 'Clzz' in '__init__.py'">Clzz</warning>()
clzz = pkg.<caret><warning descr="Cannot find reference 'Clzz' in 'pkg'">Clzz</warning>()
@@ -1,4 +1,4 @@
from mod import <error descr="Cannot find reference 'Clzz' in 'mod.py'"><caret>Clzz</error>
from mod import <error descr="Cannot find reference 'Clzz' in 'mod'"><caret>Clzz</error>
clzz = Clzz()
@@ -1,3 +1,3 @@
from mypack import <error descr="Cannot find reference 'Clzz' in '__init__.py'"><caret>Clzz</error>
from mypack import <error descr="Cannot find reference 'Clzz' in 'mypack'"><caret>Clzz</error>
clzz = Clzz()
@@ -1,4 +1,4 @@
from mod import <error descr="Cannot find reference 'foo' in 'mod.py'"><caret>foo</error>
from mod import <error descr="Cannot find reference 'foo' in 'mod'"><caret>foo</error>
foo()
@@ -1,3 +1,3 @@
import mod
mod.<caret><warning descr="Cannot find reference 'func' in 'mod.py'"><caret>func</warning>()
mod.<caret><warning descr="Cannot find reference 'func' in 'mod'"><caret>func</warning>()
@@ -1,3 +1,3 @@
from mypack import <error descr="Cannot find reference 'foo' in '__init__.py'"><caret>foo</error>
from mypack import <error descr="Cannot find reference 'foo' in 'mypack'"><caret>foo</error>
a = foo()
@@ -0,0 +1 @@
from mod.<caret><error descr="Cannot find reference 'unresolved' in 'mod'">unresolved</error> import <error descr="Unresolved reference 'something'">something</error>
@@ -1,3 +1,3 @@
import p1.m1
print(p1.<warning descr="Cannot find reference 'm2' in 'imported module p1'">m2</warning>.a2)
print(p1.<warning descr="Cannot find reference 'm2' in 'p1'">m2</warning>.a2)
@@ -1,10 +1,10 @@
from m1 import <error descr="Cannot find reference 'foo' in 'm1.pyi'">foo</error>
from m1 import <error descr="Cannot find reference 'bar' in 'm1.pyi'">bar</error>
from m1 import <error descr="Cannot find reference 'bar_imported' in 'm1.pyi'">bar_imported</error>
from m1 import <error descr="Cannot find reference 'foo' in 'm1'">foo</error>
from m1 import <error descr="Cannot find reference 'bar' in 'm1'">bar</error>
from m1 import <error descr="Cannot find reference 'bar_imported' in 'm1'">bar_imported</error>
from m1 import baz
from m1 import quux
from m1 import <error descr="Cannot find reference 'm2' in 'm1.pyi'">m2</error>
from m1 import <error descr="Cannot find reference 'm2_imported' in 'm1.pyi'">m2_imported</error>
from m1 import <error descr="Cannot find reference 'm2' in 'm1'">m2</error>
from m1 import <error descr="Cannot find reference 'm2_imported' in 'm1'">m2_imported</error>
from m1 import m3
print(foo, bar, bar_imported, baz, m2, m2_imported, m3, quux)
@@ -1,5 +1,5 @@
from .m1 import foo
from .m1 import <error descr="Cannot find reference 'bar' in 'm1.pyi'">bar</error>
from .m1 import <error descr="Cannot find reference 'bar' in 'package_with_stub_in_path.m1'">bar</error>
foo2 = foo
bar2 = bar
@@ -1,6 +1,6 @@
import m1
print(m1.<warning descr="Cannot find reference 'module_only_attr' in 'm1.pyi'">module_only_attr</warning>)
print(m1.<warning descr="Cannot find reference 'module_only_attr' in 'm1'">module_only_attr</warning>)
print(m1.provided_attr)
print(m1.<warning descr="Cannot find reference 'not_provided_attr' in 'm1.pyi'">not_provided_attr</warning>)
print(m1.<warning descr="Cannot find reference 'not_provided_attr' in 'm1'">not_provided_attr</warning>)
@@ -4184,11 +4184,11 @@ public class Py3TypeTest extends PyTestCase {
String testDir = TEST_DIRECTORY + getTestName(false);
runWithAdditionalClassEntryInSdkRoots(testDir + "/site-packages", () -> {
runWithAdditionalClassEntryInSdkRoots(testDir + "/python_stubs", () -> {
doTest("imported module pkg", """
doTest("pkg", """
import pkg.subpkg
expr = pkg
""");
doTest("__init__.py", """
doTest("pkg.subpkg", """
import pkg.subpkg
expr = pkg.subpkg
""");
@@ -2869,14 +2869,14 @@ public class PyTypeTest extends PyTestCase {
// PY-25751
public void testNotImportedModuleInDunderAll() {
doMultiFileTest("Union[aaa.py, Any]",
doMultiFileTest("Union[pkg.aaa, Any]",
"from pkg import *\n" +
"expr = aaa");
}
// PY-25751
public void testNotImportedPackageInDunderAll() {
doMultiFileTest("Union[__init__.py, Any]",
doMultiFileTest("Union[pkg.aaa, Any]",
"from pkg import *\n" +
"expr = aaa");
}