Extracted QualifiedNameFinder.getQualifiedName() from PyQualifiedNameOwner implementations

This commit is contained in:
Andrey Vlasovskikh
2014-08-18 20:50:27 +04:00
parent 53c0b4864c
commit 2d1cef87ec
3 changed files with 31 additions and 38 deletions
@@ -20,7 +20,6 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.LocalSearchScope;
@@ -237,27 +236,7 @@ public class PyClassImpl extends PyPresentableElementImpl<PyClassStub> implement
@Nullable
public String getQualifiedName() {
String name = getName();
final PyClassStub stub = getStub();
PsiElement ancestor = stub != null ? stub.getParentStub().getPsi() : getParent();
while (!(ancestor instanceof PsiFile)) {
if (ancestor == null) return name; // can this happen?
if (ancestor instanceof PyClass) {
name = ((PyClass)ancestor).getName() + "." + name;
}
ancestor = stub != null ? ((StubBasedPsiElement)ancestor).getStub().getParentStub().getPsi() : ancestor.getParent();
}
PsiFile psiFile = ((PsiFile)ancestor).getOriginalFile();
final PyFile builtins = PyBuiltinCache.getInstance(this).getBuiltinsFile();
if (!psiFile.equals(builtins)) {
VirtualFile vFile = psiFile.getVirtualFile();
if (vFile != null) {
final String packageName = QualifiedNameFinder.findShortestImportableName(this, vFile);
return packageName + "." + name;
}
}
return name;
return QualifiedNameFinder.getQualifiedName(this);
}
@Override
@@ -699,21 +699,6 @@ public class PyFunctionImpl extends PyPresentableElementImpl<PyFunctionStub> imp
@Nullable
@Override
public String getQualifiedName() {
String name = getName();
if (name == null) {
return null;
}
PyClass containingClass = getContainingClass();
if (containingClass != null) {
return containingClass.getQualifiedName() + "." + name;
}
if (PsiTreeUtil.getStubOrPsiParent(this) instanceof PyFile) {
VirtualFile virtualFile = getContainingFile().getVirtualFile();
if (virtualFile != null) {
final String packageName = QualifiedNameFinder.findShortestImportableName(this, virtualFile);
return packageName + "." + name;
}
}
return null;
return QualifiedNameFinder.getQualifiedName(this);
}
}
@@ -24,10 +24,14 @@ import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyFunction;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -156,6 +160,31 @@ public class QualifiedNameFinder {
return qname;
}
@Nullable
public static String getQualifiedName(@NotNull PyElement element) {
final String name = element.getName();
if (name != null) {
final ScopeOwner owner = ScopeUtil.getScopeOwner(element);
final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(element);
if (owner instanceof PyClass) {
final String classQName = ((PyClass)owner).getQualifiedName();
if (classQName != null) {
return classQName + "." + name;
}
}
else if (owner instanceof PyFile && !builtinCache.isBuiltin(element)) {
final VirtualFile virtualFile = ((PyFile)owner).getVirtualFile();
if (virtualFile != null) {
final String fileQName = findShortestImportableName(element, virtualFile);
if (fileQName != null) {
return fileQName + "." + name;
}
}
}
}
return null;
}
/**
* Tries to find roots that contain given vfile, and among them the root that contains at the smallest depth.
* For equal depth source root is in preference to library.