summaryrefslogtreecommitdiff
path: root/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java')
-rw-r--r--python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java75
1 files changed, 47 insertions, 28 deletions
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java b/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java
index b60348d34938..e75df5b9a0d0 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/ImportCandidateHolder.java
@@ -24,18 +24,25 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
-import com.jetbrains.python.psi.*;
import com.intellij.psi.util.QualifiedName;
+import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* An immutable holder of information for one auto-import candidate.
- * User: dcheryasov
- * Date: Apr 23, 2009 4:17:50 PM
+ * <p/>
+ * There can be do different flavors of such candidates:
+ * <ul>
+ * <li>Candidates based on existing imports in module. In this case {@link #getImportElement()} must return not {@code null}.</li>
+ * <li>Candidates not yet imported. In this case {@link #getPath()} must return not {@code null}.</li>
+ * </ul>
+ * <p/>
+ *
+ * @author dcheryasov
*/
// visibility is intentionally package-level
-class ImportCandidateHolder implements Comparable {
+class ImportCandidateHolder implements Comparable<ImportCandidateHolder> {
private final PsiElement myImportable;
private final PyImportElement myImportElement;
private final PsiFileSystemItem myFile;
@@ -43,15 +50,19 @@ class ImportCandidateHolder implements Comparable {
/**
* Creates new instance.
- * @param importable an element that could be imported either from import element or from file.
- * @param file the file which is the source of the importable
+ *
+ * @param importable an element that could be imported either from import element or from file.
+ * @param file the file which is the source of the importable (module for symbols, containing directory for modules and packages)
* @param importElement an existing import element that can be a source for the importable.
- * @param path import path for the file, as a qualified name (a.b.c)
+ * @param path import path for the file, as a qualified name (a.b.c)
+ * For top-level imported symbols it's <em>qualified name of containing module</em> (or package for __init__.py).
+ * For modules and packages it should be <em>qualified name of their parental package</em>
+ * (empty for modules and packages located at source roots).
+ *
+ * @see com.jetbrains.python.codeInsight.imports.PythonReferenceImporter#proposeImportFix
*/
- public ImportCandidateHolder(
- @NotNull PsiElement importable, @NotNull PsiFileSystemItem file,
- @Nullable PyImportElement importElement, @Nullable QualifiedName path
- ) {
+ public ImportCandidateHolder(@NotNull PsiElement importable, @NotNull PsiFileSystemItem file,
+ @Nullable PyImportElement importElement, @Nullable QualifiedName path) {
myFile = file;
myImportable = importable;
myImportElement = importElement;
@@ -59,18 +70,22 @@ class ImportCandidateHolder implements Comparable {
assert importElement != null || path != null; // one of these must be present
}
+ @NotNull
public PsiElement getImportable() {
return myImportable;
}
+ @Nullable
public PyImportElement getImportElement() {
return myImportElement;
}
+ @NotNull
public PsiFileSystemItem getFile() {
return myFile;
}
+ @Nullable
public QualifiedName getPath() {
return myPath;
}
@@ -78,15 +93,17 @@ class ImportCandidateHolder implements Comparable {
/**
* Helper method that builds an import path, handling all these "import foo", "import foo as bar", "from bar import foo", etc.
* Either importPath or importSource must be not null.
- * @param name what is ultimately imported.
+ *
+ * @param name what is ultimately imported.
* @param importPath known path to import the name.
- * @param source known ImportElement to import the name; its 'as' clause is used if present.
+ * @param source known ImportElement to import the name; its 'as' clause is used if present.
* @return a properly qualified name.
*/
- public static String getQualifiedName(String name, QualifiedName importPath, PyImportElement source) {
- StringBuilder sb = new StringBuilder();
+ @NotNull
+ public static String getQualifiedName(@NotNull String name, @Nullable QualifiedName importPath, @Nullable PyImportElement source) {
+ final StringBuilder sb = new StringBuilder();
if (source != null) {
- PsiElement parent = source.getParent();
+ final PsiElement parent = source.getParent();
if (parent instanceof PyFromImportStatement) {
sb.append(name);
}
@@ -95,7 +112,7 @@ class ImportCandidateHolder implements Comparable {
}
}
else {
- if (importPath.getComponentCount() > 0) {
+ if (importPath != null && importPath.getComponentCount() > 0) {
sb.append(importPath).append(".");
}
sb.append(name);
@@ -103,8 +120,9 @@ class ImportCandidateHolder implements Comparable {
return sb.toString();
}
- public String getPresentableText(String myName) {
- StringBuilder sb = new StringBuilder(getQualifiedName(myName, myPath, myImportElement));
+ @NotNull
+ public String getPresentableText(@NotNull String myName) {
+ final StringBuilder sb = new StringBuilder(getQualifiedName(myName, myPath, myImportElement));
PsiElement parent = null;
if (myImportElement != null) {
parent = myImportElement.getParent();
@@ -113,13 +131,15 @@ class ImportCandidateHolder implements Comparable {
sb.append(((PyFunction)myImportable).getParameterList().getPresentableText(false));
}
else if (myImportable instanceof PyClass) {
- PyClass[] supers = ((PyClass)myImportable).getSuperClasses();
+ final PyClass[] supers = ((PyClass)myImportable).getSuperClasses();
if (supers.length > 0) {
sb.append("(");
// ", ".join(x.getName() for x in getSuperClasses())
- String[] super_names = new String[supers.length];
- for (int i=0; i < supers.length; i += 1) super_names[i] = supers[i].getName();
- sb.append(StringUtil.join(super_names, ", "));
+ final String[] superNames = new String[supers.length];
+ for (int i = 0; i < supers.length; i += 1) {
+ superNames[i] = supers[i].getName();
+ }
+ sb.append(StringUtil.join(superNames, ", "));
sb.append(")");
}
}
@@ -135,10 +155,9 @@ class ImportCandidateHolder implements Comparable {
return sb.toString();
}
- public int compareTo(Object o) {
- ImportCandidateHolder rhs = (ImportCandidateHolder) o;
- int lRelevance = getRelevance();
- int rRelevance = rhs.getRelevance();
+ public int compareTo(@NotNull ImportCandidateHolder rhs) {
+ final int lRelevance = getRelevance();
+ final int rRelevance = rhs.getRelevance();
if (rRelevance != lRelevance) {
return rRelevance - lRelevance;
}
@@ -150,7 +169,7 @@ class ImportCandidateHolder implements Comparable {
}
int getRelevance() {
- Project project = myImportable.getProject();
+ final Project project = myImportable.getProject();
final PsiFile psiFile = myImportable.getContainingFile();
final VirtualFile vFile = psiFile == null ? null : psiFile.getVirtualFile();
if (vFile == null) return 0;