From 4455bd8ea5eaaefd1469f26b2c88f90bef634fa6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 13 Aug 2012 13:39:12 +0200 Subject: [PATCH] QualifiedNameResolver and ResolveImportUtil is back from resolving PsiFileSystemItems to PsiElements --- .../python/psi/PyFromImportStatement.java | 5 +-- .../psi/resolve/QualifiedNameResolver.java | 5 +-- .../PyUnresolvedReferencesInspection.java | 4 +- .../psi/impl/PyFromImportStatementImpl.java | 8 ++-- .../python/psi/resolve/PythonPathCache.java | 8 ++-- .../resolve/QualifiedNameResolverImpl.java | 14 +++---- .../python/psi/resolve/ResolveImportUtil.java | 38 +++++++++---------- 7 files changed, 40 insertions(+), 42 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyFromImportStatement.java b/python/psi-api/src/com/jetbrains/python/psi/PyFromImportStatement.java index 479521a774f3..fd959400dc96 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyFromImportStatement.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyFromImportStatement.java @@ -1,7 +1,6 @@ package com.jetbrains.python.psi; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.StubBasedPsiElement; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.stubs.PyFromImportStatementStub; @@ -63,7 +62,7 @@ public interface PyFromImportStatement extends PyImportStatementBase, StubBasedP * @return the resolved import source (file or directory containing __init__.py), or null if the import is unresolved. */ @Nullable - PsiFileSystemItem resolveImportSource(); + PsiElement resolveImportSource(); /** * Resolves the import source qualified name to a number of possible files or directories. Note: performs a Python only resolve, @@ -72,5 +71,5 @@ public interface PyFromImportStatement extends PyImportStatementBase, StubBasedP * @return possible candidates the resolved import source (file or directory containing __init__.py), or an empty list if the import is unresolved. */ @NotNull - List resolveImportSourceCandidates(); + List resolveImportSourceCandidates(); } diff --git a/python/psi-api/src/com/jetbrains/python/psi/resolve/QualifiedNameResolver.java b/python/psi-api/src/com/jetbrains/python/psi/resolve/QualifiedNameResolver.java index f5b8ff21e539..d1f111c01348 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/resolve/QualifiedNameResolver.java +++ b/python/psi-api/src/com/jetbrains/python/psi/resolve/QualifiedNameResolver.java @@ -4,7 +4,6 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFileSystemItem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,10 +30,10 @@ public interface QualifiedNameResolver { QualifiedNameResolver withPlainDirectories(); @NotNull - List resultsAsList(); + List resultsAsList(); @Nullable - PsiFileSystemItem firstResult(); + PsiElement firstResult(); @NotNull List resultsOfType(Class clazz); diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 7c1f4df79c2a..3cf98d3fb6d9 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -786,7 +786,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { continue; } } - PsiFileSystemItem importedElement; + PsiElement importedElement; if (unusedImport instanceof PyImportElement) { final PyImportElement importElement = (PyImportElement)unusedImport; final PsiElement element = ResolveImportUtil.resolveImportElement(importElement); @@ -806,7 +806,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { } } if (packageQName != null && importedElement instanceof PsiFileSystemItem) { - final PyQualifiedName importedQName = QualifiedNameFinder.findShortestImportableQName(importedElement); + final PyQualifiedName importedQName = QualifiedNameFinder.findShortestImportableQName((PsiFileSystemItem)importedElement); if (importedQName != null && importedQName.matchesPrefix(packageQName)) { continue; } diff --git a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java index 182a3ed46b58..3ad53f7d5055 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java @@ -189,20 +189,20 @@ public class PyFromImportStatementImpl extends PyBaseElementImpl candidates = resolveImportSourceCandidates(); + public PsiElement resolveImportSource() { + final List candidates = resolveImportSourceCandidates(); return candidates.size() > 0 ? candidates.get(0) : null; } @NotNull @Override - public List resolveImportSourceCandidates() { + public List resolveImportSourceCandidates() { final PyQualifiedName qName = getImportSourceQName(); if (qName == null) { final int level = getRelativeLevel(); if (level > 0) { final PsiDirectory upper = ResolveImportUtil.stepBackFrom(getContainingFile().getOriginalFile(), level); - return upper == null ? Collections.emptyList() : Collections.singletonList(upper); + return upper == null ? Collections.emptyList() : Collections.singletonList(upper); } } return ResolveImportUtil.resolveFromOrForeignImportStatementSource(this, qName); diff --git a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java index 89eee5c499d2..b9f61d8be639 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java +++ b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java @@ -1,7 +1,7 @@ package com.jetbrains.python.psi.resolve; import com.intellij.openapi.vfs.*; -import com.intellij.psi.PsiFileSystemItem; +import com.intellij.psi.PsiElement; import com.jetbrains.python.psi.impl.PyQualifiedName; import java.util.HashMap; @@ -12,7 +12,7 @@ import java.util.Map; * @author yole */ public abstract class PythonPathCache { - private final Map> myCache = new HashMap>(); + private final Map> myCache = new HashMap>(); private final Map myQNameCache = new HashMap(); protected void clearCache() { @@ -20,11 +20,11 @@ public abstract class PythonPathCache { myQNameCache.clear(); } - public synchronized List get(PyQualifiedName qualifiedName) { + public synchronized List get(PyQualifiedName qualifiedName) { return myCache.get(qualifiedName); } - public synchronized void put(PyQualifiedName qualifiedName, List results) { + public synchronized void put(PyQualifiedName qualifiedName, List results) { myCache.put(qualifiedName, results); } diff --git a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java index e0fadc2a31de..2ed6f1cb6e19 100644 --- a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java +++ b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java @@ -35,7 +35,7 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso private PsiFile myFootholdFile; private final @NotNull PyQualifiedName myQualifiedName; @NotNull PsiManager myPsiManager; - final Set results = Sets.newLinkedHashSet(); + final Set results = Sets.newLinkedHashSet(); private boolean myAcceptRootAsTopLevelPackage; private boolean myVisitAllModules = false; private int myRelativeLevel = -1; @@ -161,7 +161,7 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso @Override @NotNull - public List resultsAsList() { + public List resultsAsList() { if (myFootholdFile != null && !myFootholdFile.isValid()) { return Collections.emptyList(); } @@ -186,10 +186,10 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso return Lists.newArrayList(results); } - private List resolveInRoots() { + private List resolveInRoots() { PythonPathCache cache = findMyCache(); if (cache != null) { - final List cachedResults = cache.get(myQualifiedName); + final List cachedResults = cache.get(myQualifiedName); if (cachedResults != null) { return cachedResults; } @@ -217,7 +217,7 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso throw new IllegalStateException(); } - final ArrayList resultList = Lists.newArrayList(results); + final ArrayList resultList = Lists.newArrayList(results); if (cache != null) { cache.put(myQualifiedName, resultList); } @@ -226,8 +226,8 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso @Override @Nullable - public PsiFileSystemItem firstResult() { - final List results = resultsAsList(); + public PsiElement firstResult() { + final List results = resultsAsList(); return results.size() > 0 ? results.get(0) : null; } diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index 80b11cc0a75f..113f5b3063dd 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -106,8 +106,8 @@ public class ResolveImportUtil { return Collections.emptyList(); } final PsiFile file = importElement.getContainingFile().getOriginalFile(); - boolean absolute_import_enabled = isAbsoluteImportEnabledFor(importElement); - final List modules = resolveModule(qName, file, absolute_import_enabled, 0); + boolean absoluteImportEnabled = isAbsoluteImportEnabledFor(importElement); + final List modules = resolveModule(qName, file, absoluteImportEnabled, 0); if (modules.size() > 0) { return rateResults(modules); } @@ -125,7 +125,7 @@ public class ResolveImportUtil { PsiFile file = importElement.getContainingFile().getOriginalFile(); String name = qName.getComponents().get(0); - final List candidates = importStatement.resolveImportSourceCandidates(); + final List candidates = importStatement.resolveImportSourceCandidates(); List resultList = new ArrayList(); for (PsiElement candidate : candidates) { if (!candidate.isValid()) { @@ -152,7 +152,7 @@ public class ResolveImportUtil { @NotNull public static List resolveFromOrForeignImport(PyFromImportStatement fromImportStatement, PyQualifiedName qname) { - final List results = resolveFromImportStatementSource(fromImportStatement, qname); + final List results = resolveFromImportStatementSource(fromImportStatement, qname); if (results.isEmpty() && qname != null && qname.getComponentCount() > 0) { final PyQualifiedName importedQName = PyQualifiedName.fromComponents(qname.getLastComponent()); final PyQualifiedName containingQName = qname.removeLastComponent(); @@ -163,27 +163,27 @@ public class ResolveImportUtil { } @NotNull - public static List resolveFromImportStatementSource(PyFromImportStatement from_import_statement, PyQualifiedName qName) { - boolean absolute_import_enabled = isAbsoluteImportEnabledFor(from_import_statement); + public static List resolveFromImportStatementSource(PyFromImportStatement from_import_statement, PyQualifiedName qName) { + boolean absoluteImportEnabled = isAbsoluteImportEnabledFor(from_import_statement); PsiFile file = from_import_statement.getContainingFile(); - return resolveModule(qName, file, absolute_import_enabled, from_import_statement.getRelativeLevel()); + return resolveModule(qName, file, absoluteImportEnabled, from_import_statement.getRelativeLevel()); } @NotNull - public static List resolveFromOrForeignImportStatementSource(@NotNull PyFromImportStatement fromImportStatement, - @Nullable PyQualifiedName qName) { - final List results = resolveFromImportStatementSource(fromImportStatement, qName); + public static List resolveFromOrForeignImportStatementSource(@NotNull PyFromImportStatement fromImportStatement, + @Nullable PyQualifiedName qName) { + final List results = resolveFromImportStatementSource(fromImportStatement, qName); if (!results.isEmpty()) { return results; } final PsiElement result = qName != null ? resolveForeignImport(fromImportStatement, qName, null) : null; - return result instanceof PsiFileSystemItem ? Collections.singletonList((PsiFileSystemItem)result) - : Collections.emptyList(); + return result != null ? Collections.singletonList(result) : Collections.emptyList(); } /** * Resolves a module reference in a general case. * + * * @param qualifiedName qualified name of the module reference to resolve * @param sourceFile where that reference resides; serves as PSI foothold to determine module, project, etc. * @param importIsAbsolute if false, try old python 2.x's "relative first, absolute next" approach. @@ -191,8 +191,8 @@ public class ResolveImportUtil { * @return list of possible candidates */ @NotNull - public static List resolveModule(@Nullable PyQualifiedName qualifiedName, PsiFile sourceFile, - boolean importIsAbsolute, int relativeLevel) { + public static List resolveModule(@Nullable PyQualifiedName qualifiedName, PsiFile sourceFile, + boolean importIsAbsolute, int relativeLevel) { if (qualifiedName == null || sourceFile == null) { return Collections.emptyList(); } @@ -214,7 +214,7 @@ public class ResolveImportUtil { visitor.withRelative(0); } } - List results = visitor.resultsAsList(); + List results = visitor.resultsAsList(); if (results.isEmpty() && relativeLevel == 0 && !importIsAbsolute) { results = resolveRelativeImportAsAbsolute(sourceFile, qualifiedName); } @@ -235,8 +235,8 @@ public class ResolveImportUtil { * @return list of resolved elements. */ @NotNull - private static List resolveRelativeImportAsAbsolute(@NotNull PsiFile foothold, - @NotNull PyQualifiedName qualifiedName) { + private static List resolveRelativeImportAsAbsolute(@NotNull PsiFile foothold, + @NotNull PyQualifiedName qualifiedName) { final PsiDirectory containingDirectory = foothold.getContainingDirectory(); if (containingDirectory != null) { final PyQualifiedName containingPath = QualifiedNameFinder.findCanonicalImportPath(containingDirectory, null); @@ -343,8 +343,8 @@ public class ResolveImportUtil { return result; } if (parent instanceof PsiFile) { - final List items = resolveRelativeImportAsAbsolute((PsiFile)parent, - PyQualifiedName.fromComponents(referencedName)); + final List items = resolveRelativeImportAsAbsolute((PsiFile)parent, + PyQualifiedName.fromComponents(referencedName)); if (!items.isEmpty()) { return items.get(0); }