PY-13740 Django 1.7 QuerySet.as_manager() code completion support:

PyDynamicMember renamed
This commit is contained in:
Ilya.Kazakevich
2014-10-03 17:27:46 +04:00
parent 959a5cc76f
commit 6185917f90
12 changed files with 62 additions and 62 deletions
@@ -33,7 +33,7 @@ import javax.swing.*;
/**
* @author Dennis.Ushakov
*/
public class PyDynamicMember {
public class PyCustomMember {
private String myName;
private final boolean myResolveToInstance;
private final Function<PsiElement, PyType> myTypeCallback;
@@ -45,7 +45,7 @@ public class PyDynamicMember {
boolean myFunction = false;
public PyDynamicMember(@NotNull final String name, @Nullable final String type, final boolean resolveToInstance) {
public PyCustomMember(@NotNull final String name, @Nullable final String type, final boolean resolveToInstance) {
myName = name;
myResolveToInstance = resolveToInstance;
myTypeName = type;
@@ -54,7 +54,7 @@ public class PyDynamicMember {
myTypeCallback = null;
}
public PyDynamicMember(@NotNull final String name) {
public PyCustomMember(@NotNull final String name) {
myName = name;
myResolveToInstance = false;
myTypeName = null;
@@ -63,9 +63,9 @@ public class PyDynamicMember {
myTypeCallback = null;
}
public PyDynamicMember(@NotNull final String name,
@Nullable final String type,
final Function<PsiElement, PyType> typeCallback) {
public PyCustomMember(@NotNull final String name,
@Nullable final String type,
final Function<PsiElement, PyType> typeCallback) {
myName = name;
myResolveToInstance = false;
@@ -75,7 +75,7 @@ public class PyDynamicMember {
myTypeCallback = typeCallback;
}
public PyDynamicMember(@NotNull final String name, @Nullable final PsiElement target) {
public PyCustomMember(@NotNull final String name, @Nullable final PsiElement target) {
myName = name;
myTarget = target;
myResolveToInstance = false;
@@ -83,47 +83,47 @@ public class PyDynamicMember {
myTypeCallback = null;
}
public PyDynamicMember resolvesTo(String moduleQName) {
public PyCustomMember resolvesTo(String moduleQName) {
myPsiPath = new PyPsiPath.ToFile(moduleQName);
return this;
}
public PyDynamicMember resolvesToClass(String classQName) {
public PyCustomMember resolvesToClass(String classQName) {
myPsiPath = new PyPsiPath.ToClassQName(classQName);
return this;
}
public PyDynamicMember toClass(String name) {
public PyCustomMember toClass(String name) {
myPsiPath = new PyPsiPath.ToClass(myPsiPath, name);
return this;
}
public PyDynamicMember toFunction(String name) {
public PyCustomMember toFunction(String name) {
myPsiPath = new PyPsiPath.ToFunction(myPsiPath, name);
return this;
}
public PyDynamicMember toFunctionRecursive(String name) {
public PyCustomMember toFunctionRecursive(String name) {
myPsiPath = new PyPsiPath.ToFunctionRecursive(myPsiPath, name);
return this;
}
public PyDynamicMember toClassAttribute(String name) {
public PyCustomMember toClassAttribute(String name) {
myPsiPath = new PyPsiPath.ToClassAttribute(myPsiPath, name);
return this;
}
public PyDynamicMember toCall(String name, String... args) {
public PyCustomMember toCall(String name, String... args) {
myPsiPath = new PyPsiPath.ToCall(myPsiPath, name, args);
return this;
}
public PyDynamicMember toAssignment(String assignee) {
public PyCustomMember toAssignment(String assignee) {
myPsiPath = new PyPsiPath.ToAssignment(myPsiPath, assignee);
return this;
}
public PyDynamicMember toPsiElement(final PsiElement psiElement) {
public PyCustomMember toPsiElement(final PsiElement psiElement) {
myPsiPath = new PyPsiPath() {
@Override
@@ -179,7 +179,7 @@ public class PyDynamicMember {
return myTypeName.substring(pos + 1);
}
public PyDynamicMember asFunction() {
public PyCustomMember asFunction() {
myFunction = true;
return this;
}
@@ -17,7 +17,7 @@ package com.jetbrains.python.psi.types;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -30,7 +30,7 @@ public interface PyClassMembersProvider {
ExtensionPointName<PyClassMembersProvider> EP_NAME = ExtensionPointName.create("Pythonid.pyClassMembersProvider");
@NotNull
Collection<PyDynamicMember> getMembers(PyClassType clazz, @Nullable PsiElement location);
Collection<PyCustomMember> getMembers(PyClassType clazz, @Nullable PsiElement location);
@Nullable
PsiElement resolveMember(PyClassType clazz, String name, @Nullable PsiElement location);
@@ -16,7 +16,7 @@
package com.jetbrains.python.psi.types;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -30,22 +30,22 @@ import java.util.Collections;
public class PyClassMembersProviderBase implements PyClassMembersProvider {
@NotNull
@Override
public Collection<PyDynamicMember> getMembers(PyClassType clazz, PsiElement location) {
public Collection<PyCustomMember> getMembers(PyClassType clazz, PsiElement location) {
return Collections.emptyList();
}
@Override
public PsiElement resolveMember(PyClassType clazz, String name, PsiElement location) {
final Collection<PyDynamicMember> members = getMembers(clazz, location);
final Collection<PyCustomMember> members = getMembers(clazz, location);
return resolveMemberByName(members, clazz, name);
}
@Nullable
public static PsiElement resolveMemberByName(Collection<PyDynamicMember> members,
public static PsiElement resolveMemberByName(Collection<PyCustomMember> members,
PyClassType clazz,
String name) {
final PyClass pyClass = clazz.getPyClass();
for (PyDynamicMember member : members) {
for (PyCustomMember member : members) {
if (member.getName().equals(name)) {
return member.resolve(pyClass);
}
@@ -18,7 +18,7 @@ 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.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyPsiFacade;
import com.jetbrains.python.psi.resolve.PointInImport;
@@ -33,7 +33,7 @@ import java.util.Collections;
public abstract class PyModuleMembersProvider {
public static final ExtensionPointName<PyModuleMembersProvider> EP_NAME = ExtensionPointName.create("Pythonid.pyModuleMembersProvider");
public Collection<PyDynamicMember> getMembers(PyFile module, PointInImport point) {
public Collection<PyCustomMember> getMembers(PyFile module, PointInImport point) {
final VirtualFile vFile = module.getVirtualFile();
if (vFile != null) {
final String qName = PyPsiFacade.getInstance(module.getProject()).findShortestImportableName(vFile, module);
@@ -46,7 +46,7 @@ public abstract class PyModuleMembersProvider {
@Nullable
public PsiElement resolveMember(PyFile module, String name) {
for (PyDynamicMember o : getMembers(module, PointInImport.NONE)) {
for (PyCustomMember o : getMembers(module, PointInImport.NONE)) {
if (o.getName().equals(name)) {
return o.resolve(module);
}
@@ -54,5 +54,5 @@ public abstract class PyModuleMembersProvider {
return null;
}
protected abstract Collection<PyDynamicMember> getMembersByQName(PyFile module, String qName);
protected abstract Collection<PyCustomMember> getMembersByQName(PyFile module, String qName);
}
@@ -15,7 +15,7 @@
*/
package com.jetbrains.numpy.codeInsight;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.types.PyModuleMembersProvider;
@@ -39,11 +39,11 @@ public class NumpyModuleMembersProvider extends PyModuleMembersProvider {
};
@Override
protected Collection<PyDynamicMember> getMembersByQName(PyFile module, String qName) {
protected Collection<PyCustomMember> getMembersByQName(PyFile module, String qName) {
if ("numpy".equals(qName)) {
final List<PyDynamicMember> members = new ArrayList<PyDynamicMember>();
final List<PyCustomMember> members = new ArrayList<PyCustomMember>();
for (String type : NUMERIC_TYPES) {
members.add(new PyDynamicMember(type, "numpy.core.multiarray.dtype", false));
members.add(new PyCustomMember(type, "numpy.core.multiarray.dtype", false));
}
return members;
}
@@ -17,7 +17,7 @@ package com.jetbrains.python.codeInsight.stdlib;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyTargetExpression;
@@ -35,16 +35,16 @@ import java.util.List;
* @author yole
*/
public class PyStdlibClassMembersProvider extends PyClassMembersProviderBase {
private Key<List<PyDynamicMember>> mySocketMembersKey = Key.create("socket.members");
private Key<List<PyCustomMember>> mySocketMembersKey = Key.create("socket.members");
@NotNull
@Override
public Collection<PyDynamicMember> getMembers(PyClassType classType, PsiElement location) {
public Collection<PyCustomMember> getMembers(PyClassType classType, PsiElement location) {
PyClass clazz = classType.getPyClass();
final String qualifiedName = clazz.getQualifiedName();
if ("socket._socketobject".equals(qualifiedName)) {
final PyFile socketFile = (PyFile)clazz.getContainingFile();
List<PyDynamicMember> socketMembers = socketFile.getUserData(mySocketMembersKey);
List<PyCustomMember> socketMembers = socketFile.getUserData(mySocketMembersKey);
if (socketMembers == null) {
socketMembers = calcSocketMembers(socketFile);
socketFile.putUserData(mySocketMembersKey, socketMembers);
@@ -54,20 +54,20 @@ public class PyStdlibClassMembersProvider extends PyClassMembersProviderBase {
return Collections.emptyList();
}
private static List<PyDynamicMember> calcSocketMembers(PyFile socketFile) {
List<PyDynamicMember> result = new ArrayList<PyDynamicMember>();
private static List<PyCustomMember> calcSocketMembers(PyFile socketFile) {
List<PyCustomMember> result = new ArrayList<PyCustomMember>();
addMethodsFromAttr(socketFile, result, "_socketmethods");
addMethodsFromAttr(socketFile, result, "_delegate_methods");
return result;
}
private static void addMethodsFromAttr(PyFile socketFile, List<PyDynamicMember> result, final String attrName) {
private static void addMethodsFromAttr(PyFile socketFile, List<PyCustomMember> result, final String attrName) {
final PyTargetExpression socketMethods = socketFile.findTopLevelAttribute(attrName);
if (socketMethods != null) {
final List<String> methods = PyUtil.getStringListFromTargetExpression(socketMethods);
if (methods != null) {
for (String name : methods) {
result.add(new PyDynamicMember(name).resolvesTo("_socket").toClass("SocketType").toFunction(name));
result.add(new PyCustomMember(name).resolvesTo("_socket").toClass("SocketType").toFunction(name));
}
}
}
@@ -18,7 +18,7 @@ package com.jetbrains.python.codeInsight.stdlib;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import com.jetbrains.python.psi.types.PyModuleMembersProvider;
@@ -33,15 +33,15 @@ import java.util.List;
*/
public class PyStdlibModuleMembersProvider extends PyModuleMembersProvider {
@Override
protected Collection<PyDynamicMember> getMembersByQName(PyFile module, String qName) {
protected Collection<PyCustomMember> getMembersByQName(PyFile module, String qName) {
if (qName.equals("os")) {
final List<PyDynamicMember> results = new ArrayList<PyDynamicMember>();
final List<PyCustomMember> results = new ArrayList<PyCustomMember>();
PsiElement path = null;
if (module != null) {
final String pathModuleName = SystemInfo.isWindows ? "ntpath" : "posixpath";
path = ResolveImportUtil.resolveModuleInRoots(QualifiedName.fromDottedString(pathModuleName), module);
}
results.add(new PyDynamicMember("path", path));
results.add(new PyCustomMember("path", path));
return results;
}
return Collections.emptyList();
@@ -16,7 +16,7 @@
package com.jetbrains.python.codeInsight.userSkeletons;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.PyTargetExpression;
@@ -37,7 +37,7 @@ import java.util.List;
public class PyUserSkeletonsClassMembersProvider extends PyClassMembersProviderBase implements PyOverridingAncestorsClassMembersProvider {
@NotNull
@Override
public Collection<PyDynamicMember> getMembers(@NotNull PyClassType classType, PsiElement location) {
public Collection<PyCustomMember> getMembers(@NotNull PyClassType classType, PsiElement location) {
final PyClass cls = classType.getPyClass();
final PyClass skeleton = PyUserSkeletonsUtil.getUserSkeleton(cls);
if (skeleton != null) {
@@ -73,24 +73,24 @@ public class PyUserSkeletonsClassMembersProvider extends PyClassMembersProviderB
return null;
}
private static Collection<PyDynamicMember> getClassMembers(@NotNull PyClass cls) {
final List<PyDynamicMember> result = new ArrayList<PyDynamicMember>();
private static Collection<PyCustomMember> getClassMembers(@NotNull PyClass cls) {
final List<PyCustomMember> result = new ArrayList<PyCustomMember>();
for (PyFunction function : cls.getMethods()) {
final String name = function.getName();
if (name != null) {
result.add(new PyDynamicMember(name, function));
result.add(new PyCustomMember(name, function));
}
}
for (PyTargetExpression attribute : cls.getInstanceAttributes()) {
final String name = attribute.getName();
if (name != null) {
result.add(new PyDynamicMember(name, attribute));
result.add(new PyCustomMember(name, attribute));
}
}
for (PyTargetExpression attribute : cls.getClassAttributes()) {
final String name = attribute.getName();
if (name != null) {
result.add(new PyDynamicMember(name, attribute));
result.add(new PyCustomMember(name, attribute));
}
}
return result;
@@ -17,7 +17,7 @@ package com.jetbrains.python.codeInsight.userSkeletons;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFileSystemItem;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.types.PyModuleMembersProvider;
@@ -43,17 +43,17 @@ public class PyUserSkeletonsModuleMembersProvider extends PyModuleMembersProvide
}
@Override
protected Collection<PyDynamicMember> getMembersByQName(PyFile module, String qName) {
protected Collection<PyCustomMember> getMembersByQName(PyFile module, String qName) {
final PyFile moduleSkeleton = PyUserSkeletonsUtil.getUserSkeletonForModuleQName(qName, module);
if (moduleSkeleton != null) {
final List<PyDynamicMember> results = new ArrayList<PyDynamicMember>();
final List<PyCustomMember> results = new ArrayList<PyCustomMember>();
for (PyElement element : moduleSkeleton.iterateNames()) {
if (element instanceof PsiFileSystemItem) {
continue;
}
final String name = element.getName();
if (name != null) {
results.add(new PyDynamicMember(name, element));
results.add(new PyCustomMember(name, element));
}
}
return results;
@@ -35,7 +35,7 @@ import com.intellij.util.PlatformUtils;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.imports.AutoImportHintAction;
@@ -721,8 +721,8 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
PsiReference reference,
@NotNull final String name) {
for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) {
final Collection<PyDynamicMember> resolveResult = provider.getMembers(type, reference.getElement());
for (PyDynamicMember member : resolveResult) {
final Collection<PyCustomMember> resolveResult = provider.getMembers(type, reference.getElement());
for (PyCustomMember member : resolveResult) {
if (member.getName().equals(name)) return true;
}
}
@@ -33,7 +33,7 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.ResolveResultList;
@@ -415,7 +415,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
// from providers
for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) {
for (PyDynamicMember member : provider.getMembers(this, location)) {
for (PyCustomMember member : provider.getMembers(this, location)) {
final String name = member.getName();
if (!namesAlready.contains(name)) {
LookupElementBuilder lookupElementBuilder = LookupElementBuilder.create(name).withIcon(member.getIcon()).withTypeText(getName());
@@ -30,7 +30,7 @@ import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ProcessingContext;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyDynamicMember;
import com.jetbrains.python.codeInsight.PyCustomMember;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
@@ -289,7 +289,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
Set<String> namesAlready = context.get(CTX_NAMES);
PointInImport point = ResolveImportUtil.getPointInImport(location);
for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) {
for (PyDynamicMember member : provider.getMembers(myModule, point)) {
for (PyCustomMember member : provider.getMembers(myModule, point)) {
final String name = member.getName();
if (namesAlready != null) {
namesAlready.add(name);