mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PyClassMembersProvider && PyModuleMembersProvider -> python-psi-api
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.jetbrains.python.psi.types;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.jetbrains.python.codeInsight.PyDynamicMember;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author Dennis.Ushakov
|
||||
*/
|
||||
public interface PyClassMembersProvider {
|
||||
ExtensionPointName<PyClassMembersProvider> EP_NAME = ExtensionPointName.create("Pythonid.pyClassMembersProvider");
|
||||
|
||||
Collection<PyDynamicMember> getMembers(PyClassType clazz);
|
||||
|
||||
@Nullable
|
||||
PsiElement resolveMember(PyClassType clazz, String name);
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.jetbrains.python.psi.types;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
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.PyPsiFacade;
|
||||
import com.jetbrains.python.psi.resolve.PointInImport;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public abstract class PyModuleMembersProvider {
|
||||
public static final ExtensionPointName<PyModuleMembersProvider> EP_NAME = ExtensionPointName.create("Pythonid.pyModuleMembersProvider");
|
||||
|
||||
public Collection<PyDynamicMember> getMembers(PyFile module, PointInImport point) {
|
||||
final VirtualFile vFile = module.getVirtualFile();
|
||||
if (vFile != null) {
|
||||
final String qName = PyPsiFacade.getInstance(module.getProject()).findShortestImportableName(module, vFile);
|
||||
if (qName != null) {
|
||||
return getMembersByQName(module, qName, point);
|
||||
}
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PsiElement resolveMember(PyFile module, String name) {
|
||||
for (PyDynamicMember o : getMembers(module, PointInImport.NONE)) {
|
||||
if (o.getName().equals(name)) {
|
||||
return o.resolve(module);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected abstract Collection<PyDynamicMember> getMembersByQName(PyFile module, String qName, PointInImport point);
|
||||
}
|
||||
Reference in New Issue
Block a user