From 8960baf22bc060b7edab7f6837344ac0449824d8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 9 Aug 2012 14:09:56 +0200 Subject: [PATCH] PyClassMembersProvider && PyModuleMembersProvider -> python-psi-api --- .../com/jetbrains/python/psi/PyPsiFacade.java | 5 +++++ .../python/psi/resolve/PointInImport.java | 18 ++++++++++++++++++ .../psi/types/PyClassMembersProvider.java | 0 .../psi/types/PyModuleMembersProvider.java | 11 ++++++----- .../stdlib/PyStdlibModuleMembersProvider.java | 7 ++++--- .../python/psi/impl/PyPsiFacadeImpl.java | 9 +++++++++ .../python/psi/resolve/ResolveImportUtil.java | 17 ----------------- .../python/psi/types/PyModuleType.java | 8 ++++---- 8 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 python/psi-api/src/com/jetbrains/python/psi/resolve/PointInImport.java rename python/{ => psi-api}/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java (100%) rename python/{ => psi-api}/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java (71%) diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyPsiFacade.java b/python/psi-api/src/com/jetbrains/python/psi/PyPsiFacade.java index 31c9b795eed3..8533a549cf4c 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyPsiFacade.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyPsiFacade.java @@ -2,6 +2,8 @@ package com.jetbrains.python.psi; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.resolve.QualifiedNameResolver; import com.jetbrains.python.psi.types.PyClassType; @@ -22,4 +24,7 @@ public abstract class PyPsiFacade { public abstract PyClass findClass(String qName); public abstract PyClassType createClassType(PyClass pyClass, boolean isDefinition); + + @Nullable + public abstract String findShortestImportableName(PsiElement importer, VirtualFile targetFile); } diff --git a/python/psi-api/src/com/jetbrains/python/psi/resolve/PointInImport.java b/python/psi-api/src/com/jetbrains/python/psi/resolve/PointInImport.java new file mode 100644 index 000000000000..7138528f0b3d --- /dev/null +++ b/python/psi-api/src/com/jetbrains/python/psi/resolve/PointInImport.java @@ -0,0 +1,18 @@ +package com.jetbrains.python.psi.resolve; + +public enum PointInImport { + /** + * The reference is not inside an import statement. + */ + NONE, + + /** + * The reference is inside import and refers to a module + */ + AS_MODULE, + + /** + * The reference is inside import and refers to a name imported from a module + */ + AS_NAME +} diff --git a/python/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java similarity index 100% rename from python/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java rename to python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java similarity index 71% rename from python/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java rename to python/psi-api/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java index b3e763d411a9..2030b094f4f4 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyModuleMembersProvider.java @@ -5,7 +5,8 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.jetbrains.python.codeInsight.PyDynamicMember; import com.jetbrains.python.psi.PyFile; -import com.jetbrains.python.psi.resolve.ResolveImportUtil; +import com.jetbrains.python.psi.PyPsiFacade; +import com.jetbrains.python.psi.resolve.PointInImport; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -17,10 +18,10 @@ import java.util.Collections; public abstract class PyModuleMembersProvider { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.pyModuleMembersProvider"); - public Collection getMembers(PyFile module, ResolveImportUtil.PointInImport point) { + public Collection getMembers(PyFile module, PointInImport point) { final VirtualFile vFile = module.getVirtualFile(); if (vFile != null) { - final String qName = ResolveImportUtil.findShortestImportableName(module, vFile); + final String qName = PyPsiFacade.getInstance(module.getProject()).findShortestImportableName(module, vFile); if (qName != null) { return getMembersByQName(module, qName, point); } @@ -30,7 +31,7 @@ public abstract class PyModuleMembersProvider { @Nullable public PsiElement resolveMember(PyFile module, String name) { - for (PyDynamicMember o : getMembers(module, ResolveImportUtil.PointInImport.NONE)) { + for (PyDynamicMember o : getMembers(module, PointInImport.NONE)) { if (o.getName().equals(name)) { return o.resolve(module); } @@ -38,5 +39,5 @@ public abstract class PyModuleMembersProvider { return null; } - protected abstract Collection getMembersByQName(PyFile module, String qName, ResolveImportUtil.PointInImport point); + protected abstract Collection getMembersByQName(PyFile module, String qName, PointInImport point); } diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibModuleMembersProvider.java b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibModuleMembersProvider.java index 3c51c14a3dc6..de90a2a64419 100644 --- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibModuleMembersProvider.java +++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibModuleMembersProvider.java @@ -5,6 +5,7 @@ import com.intellij.psi.PsiElement; import com.jetbrains.python.codeInsight.PyDynamicMember; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.impl.PyQualifiedName; +import com.jetbrains.python.psi.resolve.PointInImport; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.types.PyModuleMembersProvider; @@ -16,12 +17,12 @@ import java.util.Collections; */ public class PyStdlibModuleMembersProvider extends PyModuleMembersProvider { @Override - protected Collection getMembersByQName(PyFile module, String qName, ResolveImportUtil.PointInImport point) { + protected Collection getMembersByQName(PyFile module, String qName, PointInImport point) { if (qName.equals("os")) { - if (point == ResolveImportUtil.PointInImport.AS_MODULE) { + if (point == PointInImport.AS_MODULE) { return Collections.singletonList(new PyDynamicMember("path")); } - else if (point == ResolveImportUtil.PointInImport.NONE && module != null) { + else if (point == PointInImport.NONE && module != null) { final String name = SystemInfo.isWindows ? "ntpath" : "posixpath"; final PsiElement resolved = ResolveImportUtil.resolveModuleInRoots(PyQualifiedName.fromDottedString(name), module); if (resolved != null) { diff --git a/python/src/com/jetbrains/python/psi/impl/PyPsiFacadeImpl.java b/python/src/com/jetbrains/python/psi/impl/PyPsiFacadeImpl.java index 08f1f6fc6c74..ca3c74af862d 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyPsiFacadeImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyPsiFacadeImpl.java @@ -1,10 +1,13 @@ package com.jetbrains.python.psi.impl; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyPsiFacade; import com.jetbrains.python.psi.resolve.QualifiedNameResolver; import com.jetbrains.python.psi.resolve.QualifiedNameResolverImpl; +import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.stubs.PyClassNameIndex; import com.jetbrains.python.psi.types.PyClassType; import com.jetbrains.python.psi.types.PyClassTypeImpl; @@ -40,4 +43,10 @@ public class PyPsiFacadeImpl extends PyPsiFacade { public PyClassType createClassType(PyClass pyClass, boolean isDefinition) { return new PyClassTypeImpl(pyClass, isDefinition); } + + @Nullable + @Override + public String findShortestImportableName(PsiElement importer, VirtualFile targetFile) { + return ResolveImportUtil.findShortestImportableName(importer, targetFile); + } } diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index bd58f1d58655..f4f06d7ca332 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -593,23 +593,6 @@ public class ResolveImportUtil { return null; } - public static enum PointInImport { - /** - * The reference is not inside an import statement. - */ - NONE, - - /** - * The reference is inside import and refers to a module - */ - AS_MODULE, - - /** - * The reference is inside import and refers to a name imported from a module - */ - AS_NAME - } - /** * @param element what we test (identifier, reference, import element, etc) * @return the how the element relates to an enclosing import statement, if any diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 3fd2245a8471..bb7b132dc83f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -231,7 +231,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje Set names_already = context.get(CTX_NAMES); List result = new ArrayList(); - ResolveImportUtil.PointInImport point = ResolveImportUtil.getPointInImport(location); + PointInImport point = ResolveImportUtil.getPointInImport(location); for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { for (PyDynamicMember member : provider.getMembers(myModule, point)) { final String name = member.getName(); @@ -239,7 +239,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } } - if (point == ResolveImportUtil.PointInImport.NONE || point == ResolveImportUtil.PointInImport.AS_NAME) { // when not imported from, add regular attributes + if (point == PointInImport.NONE || point == PointInImport.AS_NAME) { // when not imported from, add regular attributes final CompletionVariantsProcessor processor = new CompletionVariantsProcessor(location, new Condition() { @Override public boolean value(PsiElement psiElement) { @@ -247,7 +247,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje PsiTreeUtil.getParentOfType(psiElement, PyImportStatementBase.class) instanceof PyFromImportStatement; } }, new PyUtil.UnderscoreFilter(0)); - processor.setPlainNamesOnly(point == ResolveImportUtil.PointInImport.AS_NAME); // no parens after imported function names + processor.setPlainNamesOnly(point == PointInImport.AS_NAME); // no parens after imported function names myModule.processDeclarations(processor, ResolveState.initial(), null, location); if (names_already != null) { for (LookupElement le : processor.getResultList()) { @@ -263,7 +263,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } } if (PyUtil.isPackage(myModule)) { // our module is a dir, not a single file - if (point == ResolveImportUtil.PointInImport.AS_MODULE || point == ResolveImportUtil.PointInImport.AS_NAME) { // when imported from somehow, add submodules + if (point == PointInImport.AS_MODULE || point == PointInImport.AS_NAME) { // when imported from somehow, add submodules result.addAll(getSubModuleVariants(myModule.getContainingDirectory(), location, names_already)); } else {