mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
provide members for memcache module in GAE (PY-1278)
This commit is contained in:
@@ -324,6 +324,7 @@
|
||||
<extensionPoint qualifiedName="Pythonid.pySuperMethodsSearch" interface="com.intellij.util.QueryExecutor"/>
|
||||
<extensionPoint qualifiedName="Pythonid.pyClassInheritorsSearch" interface="com.intellij.util.QueryExecutor"/>
|
||||
<extensionPoint qualifiedName="Pythonid.pyClassMembersProvider" interface="com.jetbrains.python.psi.types.PyClassMembersProvider"/>
|
||||
<extensionPoint qualifiedName="Pythonid.pyModuleMembersProvider" interface="com.jetbrains.python.psi.types.PyModuleMembersProvider"/>
|
||||
<extensionPoint qualifiedName="Pythonid.pyOverridingMethodsSearch" interface="com.intellij.util.QueryExecutor"/>
|
||||
<extensionPoint qualifiedName="Pythonid.runnableScriptFilter" interface="com.jetbrains.python.run.RunnableScriptFilter"/>
|
||||
<extensionPoint qualifiedName="Pythonid.runnableUnitTestFilter" interface="com.jetbrains.python.testing.RunnableUnitTestFilter"/>
|
||||
@@ -354,6 +355,7 @@
|
||||
|
||||
<!-- App Engine -->
|
||||
<typeProvider implementation="com.jetbrains.appengine.model.AppEngineTypeProvider"/>
|
||||
<pyModuleMembersProvider implementation="com.jetbrains.appengine.model.AppEngineModuleMembersProvider"/>
|
||||
</extensions>
|
||||
|
||||
<project-components>
|
||||
|
||||
@@ -74,7 +74,10 @@ public class PyDynamicMember {
|
||||
return myName;
|
||||
}
|
||||
|
||||
public static Icon getIcon() {
|
||||
public Icon getIcon() {
|
||||
if (myTarget != null) {
|
||||
return myTarget.getIcon(0);
|
||||
}
|
||||
return IconLoader.getIcon("/nodes/method.png");
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.jetbrains.python.psi.types;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.jetbrains.python.codeInsight.PyDynamicMember;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public abstract class PyModuleMembersProvider {
|
||||
public static final ExtensionPointName<PyModuleMembersProvider> EP_NAME = ExtensionPointName.create("Pythonid.pyModuleMembersProvider");
|
||||
|
||||
public abstract Collection<PyDynamicMember> getMembers(PsiFile module);
|
||||
|
||||
@Nullable
|
||||
public PsiElement resolveMember(PsiFile module, String name) {
|
||||
for (PyDynamicMember o : getMembers(module)) {
|
||||
if (o.getName().equals(name)) {
|
||||
return o.resolve(module);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -3,12 +3,14 @@ package com.jetbrains.python.psi.types;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.codeInsight.PyDynamicMember;
|
||||
import com.jetbrains.python.psi.AccessDirection;
|
||||
import com.jetbrains.python.psi.PyExpression;
|
||||
import com.jetbrains.python.psi.PyFile;
|
||||
@@ -46,6 +48,13 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
|
||||
|
||||
@Nullable
|
||||
public List<? extends PsiElement> resolveMember(final String name, AccessDirection direction, PyResolveContext resolveContext) {
|
||||
for(PyModuleMembersProvider provider: Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) {
|
||||
final PsiElement element = provider.resolveMember(myModule, name);
|
||||
if (element != null) {
|
||||
return new SmartList<PsiElement>(element);
|
||||
}
|
||||
}
|
||||
|
||||
//return PyResolveUtil.treeWalkUp(new PyResolveUtil.ResolveProcessor(name), myModule, null, null);
|
||||
final PsiElement result = ResolveImportUtil.resolveChild(myModule, name, myModule, null, false);
|
||||
if (result != null) return new SmartList<PsiElement>(result);
|
||||
@@ -94,6 +103,14 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
|
||||
public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) {
|
||||
Set<String> names_already = context.get(CTX_NAMES);
|
||||
List<Object> result = new ArrayList<Object>();
|
||||
|
||||
for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) {
|
||||
for (PyDynamicMember member : provider.getMembers(myModule)) {
|
||||
final String name = member.getName();
|
||||
result.add(LookupElementBuilder.create(name).setIcon(member.getIcon()).setTypeText(member.getShortType()));
|
||||
}
|
||||
}
|
||||
|
||||
ResolveImportUtil.PointInImport point = ResolveImportUtil.getPointInImport(location);
|
||||
if (point.role == NONE || point.role == AS_NAME) { // when not imported from, add regular attributes
|
||||
final VariantsProcessor processor = new VariantsProcessor(location);
|
||||
|
||||
Reference in New Issue
Block a user