diff --git a/python/psi-api/src/com/jetbrains/python/codeInsight/PyCustomMember.java b/python/psi-api/src/com/jetbrains/python/codeInsight/PyCustomMember.java index ea90835b6754..09df81960c6a 100644 --- a/python/psi-api/src/com/jetbrains/python/codeInsight/PyCustomMember.java +++ b/python/psi-api/src/com/jetbrains/python/codeInsight/PyCustomMember.java @@ -203,6 +203,9 @@ public class PyCustomMember extends UserDataHolderBase { return resolveTarget; } if (resolveTarget != null || targetClass != null) { + if (targetClass == null && resolveTarget instanceof PyClass) { + targetClass = (PyClass)resolveTarget; + } return new MyInstanceElement(targetClass, context, resolveTarget); } return null; diff --git a/python/testData/resolve/multiFile/customMemberTargetClass/a.py b/python/testData/resolve/multiFile/customMemberTargetClass/a.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/customMemberTargetClass/pkg/__init__.py b/python/testData/resolve/multiFile/customMemberTargetClass/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/customMemberTargetClass/pkg/mod1.py b/python/testData/resolve/multiFile/customMemberTargetClass/pkg/mod1.py new file mode 100644 index 000000000000..77a060078ab1 --- /dev/null +++ b/python/testData/resolve/multiFile/customMemberTargetClass/pkg/mod1.py @@ -0,0 +1,3 @@ +class Clazz(object): + def member_fun(self): + return True \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index 341e3c54d9a9..9a3ee78773ac 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -16,27 +16,25 @@ package com.jetbrains.python; import com.google.common.collect.Lists; -import com.intellij.openapi.extensions.ExtensionPoint; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.GeneratedSourcesFilter; import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.source.PsiFileImpl; -import com.intellij.psi.util.QualifiedName; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.PsiTestUtil; +import com.jetbrains.python.codeInsight.PyCustomMember; import com.jetbrains.python.fixtures.PyMultiFileResolveTestCase; import com.jetbrains.python.fixtures.PyResolveTestCase; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyImportResolver; import com.jetbrains.python.psi.impl.PyPsiUtils; -import com.jetbrains.python.psi.resolve.PyQualifiedNameResolveContext; +import com.jetbrains.python.psi.types.PyClassType; +import com.jetbrains.python.psi.types.PyType; +import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; @@ -543,4 +541,15 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { return fileSystemItems.map(f -> VfsUtilCore.getRelativeLocation(f.getVirtualFile(), root)).collect(Collectors.toList()); } + + public void testCustomMemberTargetClass(){ + prepareTestDirectory(); + PyCustomMember customMember = new PyCustomMember("Clazz").resolvesToClass("pkg.mod1.Clazz"); + PsiFile context = myFixture.configureByText("a.py", ""); + PsiElement resolved = customMember.resolve(context); + assertInstanceOf(resolved, PyTypedElement.class); + PyTypedElement pyTypedElement = (PyTypedElement) resolved; + PyType type = TypeEvalContext.codeAnalysis(myFixture.getProject(), context).getType(pyTypedElement); + assertInstanceOf(type, PyClassType.class); + } } \ No newline at end of file