PY-15603 Clean up in PyQualifiedNameProvider, add tests on class members

GitOrigin-RevId: 8082da991199b19830ff565065ef4d2d9124b37d
This commit is contained in:
Mikhail Golubev
2019-07-08 21:02:18 +03:00
committed by intellij-monorepo-bot
parent 83dc1fbc2d
commit 422c6aa643
8 changed files with 32 additions and 8 deletions
@@ -31,7 +31,7 @@ import java.util.Collection;
public class PyQualifiedNameProvider implements QualifiedNameProvider {
public static final char SEPARATOR = '.';
private static final char CLASS_MEMBER_SEPARATOR = '.';
@Override
public PsiElement adjustElementToCopy(PsiElement element) {
@@ -47,7 +47,7 @@ public class PyQualifiedNameProvider implements QualifiedNameProvider {
if (element instanceof PyFunction) {
final PyClass containingClass = ((PyFunction)element).getContainingClass();
if (containingClass != null) {
return containingClass.getQualifiedName() + SEPARATOR + ((PyFunction)element).getName();
return containingClass.getQualifiedName() + CLASS_MEMBER_SEPARATOR + ((PyFunction)element).getName();
}
else {
return ((PyFunction)element).getQualifiedName();
@@ -67,13 +67,12 @@ public class PyQualifiedNameProvider implements QualifiedNameProvider {
if (!functions.isEmpty()) {
return ContainerUtil.getFirstItem(functions);
}
final int sharpIdx = fqn.lastIndexOf(SEPARATOR);
if (sharpIdx > -1) {
final String className = StringUtil.getPackageName(fqn, SEPARATOR);
if (StringUtil.containsChar(fqn, CLASS_MEMBER_SEPARATOR)) {
final String className = StringUtil.getPackageName(fqn, CLASS_MEMBER_SEPARATOR);
aClass = PyClassNameIndex.findClass(className, project);
if (aClass != null) {
final String memberName = StringUtil.getShortName(fqn, SEPARATOR);
final String memberName = StringUtil.getShortName(fqn, CLASS_MEMBER_SEPARATOR);
final PyClass nestedClass = aClass.findNestedClass(memberName, false);
if (nestedClass != null) return nestedClass;
final PyFunction methodByName = aClass.findMethodByName(memberName, false, null);
@@ -0,0 +1,3 @@
class MyClass:
def met<caret>hod(self):
pass
@@ -0,0 +1,3 @@
class MyClass:
class Nes<caret>ted:
pass
@@ -15,16 +15,16 @@
*/
package com.jetbrains.python;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.actions.PyQualifiedNameProvider;
import com.jetbrains.python.fixtures.PyTestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
/**
* @author Mikhail Golubev
*/
public class PyQualifiedNameProviderTest extends PyTestCase {
@Test
public void testTopLevelFunctionReference() {
myFixture.copyDirectoryToProject(getTestName(true) + "/a", "a");
myFixture.configureByFile("a/b/c/module.py");
@@ -36,6 +36,25 @@ public class PyQualifiedNameProviderTest extends PyTestCase {
return new PyQualifiedNameProvider().getQualifiedName(myFixture.getElementAtCaret());
}
public void testNestedClassReference() {
doDirectoryTest("pkg/subpkg/mod.py", "pkg.subpkg.mod.MyClass.Nested");
}
public void testMethodReference() {
doDirectoryTest("pkg/subpkg/mod.py", "pkg.subpkg.mod.MyClass.method");
}
private void doDirectoryTest(@NotNull String targetFile, @NotNull String expectedQualifiedName) {
myFixture.copyDirectoryToProject(getTestName(true), "");
myFixture.configureByFile(targetFile);
final PsiElement target = myFixture.getElementAtCaret();
final PyQualifiedNameProvider provider = new PyQualifiedNameProvider();
final String actualQualifiedName = provider.getQualifiedName(myFixture.getElementAtCaret());
assertEquals(expectedQualifiedName, actualQualifiedName);
final PsiElement element = provider.qualifiedNameToElement(expectedQualifiedName, myFixture.getProject());
assertEquals(target, element);
}
@Override
protected String getTestDataPath() {
return super.getTestDataPath() + "/qualifiedName";