provide members for memcache module in GAE (PY-1278)

This commit is contained in:
Dmitry Jemerov
2010-11-18 18:29:14 +03:00
parent 9cdb2cda0d
commit 3d8960282c
4 changed files with 51 additions and 1 deletions
@@ -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);