PY-16541 Support copying references of top level functions

This commit is contained in:
Mikhail Golubev
2016-01-13 20:19:38 +03:00
parent 80713f912d
commit 79f8f1e301
6 changed files with 57 additions and 0 deletions
@@ -15,17 +15,22 @@
*/
package com.jetbrains.python.actions;
import com.google.common.collect.Iterables;
import com.intellij.ide.actions.QualifiedNameProvider;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyFunctionNameIndex;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
/**
* User: anna
@@ -48,6 +53,9 @@ public class PyQualifiedNameProvider implements QualifiedNameProvider {
if (containingClass != null) {
return containingClass.getQualifiedName() + "#" + ((PyFunction)element).getName();
}
else {
return ((PyFunction)element).getQualifiedName();
}
}
return null;
}
@@ -59,6 +67,10 @@ public class PyQualifiedNameProvider implements QualifiedNameProvider {
if (aClass != null) {
return aClass;
}
final Collection<PyFunction> functions = PyFunctionNameIndex.find(fqn, project);
if (!functions.isEmpty()) {
return ContainerUtil.getFirstItem(functions);
}
final int sharpIdx = fqn.indexOf("#");
if (sharpIdx > -1) {
final String className = StringUtil.getPackageName(fqn, '#');
@@ -0,0 +1,2 @@
def fu<caret>nc():
pass
@@ -0,0 +1,43 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python;
import com.jetbrains.python.actions.PyQualifiedNameProvider;
import com.jetbrains.python.fixtures.PyTestCase;
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");
assertEquals("a.b.c.module.func", getQualifiedNameOfElementUnderCaret());
}
@Nullable
private String getQualifiedNameOfElementUnderCaret() {
return new PyQualifiedNameProvider().getQualifiedName(myFixture.getElementAtCaret());
}
@Override
protected String getTestDataPath() {
return super.getTestDataPath() + "/qualifiedName";
}
}