diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java index 5a74a6e0f1a3..18a8a80c0ec2 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -1,9 +1,6 @@ package com.jetbrains.python.psi.impl; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.ResolveState; +import com.intellij.psi.*; import com.intellij.util.ProcessingContext; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; @@ -61,7 +58,7 @@ public class PyJavaClassType implements PyClassLikeType { return null; } - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { final CompletionVariantsProcessor processor = new CompletionVariantsProcessor(location); myClass.processDeclarations(processor, ResolveState.initial(), null, location); return processor.getResult(); diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java index 180ad2377503..719bc23843e5 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java @@ -1,6 +1,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; @@ -56,7 +57,7 @@ public class PyJavaMethodType implements PyCallableType { } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { return ArrayUtil.EMPTY_OBJECT_ARRAY; } diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java index 54839bb046ed..9131b310a8a1 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java @@ -5,6 +5,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPackage; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; @@ -60,7 +61,7 @@ public class PyJavaPackageType implements PyType { } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { List variants = new ArrayList(); final GlobalSearchScope scope = getScope(location.getProject()); final PsiClass[] classes = myPackage.getClasses(scope); diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyClass.java b/python/psi-api/src/com/jetbrains/python/psi/PyClass.java index 5c4c08b4bbcb..4b34a1635377 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyClass.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyClass.java @@ -165,5 +165,5 @@ public interface PyClass extends PsiNameIdentifierOwner, PyStatement, NameDefine String getDocStringValue(); boolean processClassLevelDeclarations(@NotNull PsiScopeProcessor processor); - boolean processInstanceLevelDeclarations(@NotNull PsiScopeProcessor processor, @Nullable PyExpression location); + boolean processInstanceLevelDeclarations(@NotNull PsiScopeProcessor processor, @Nullable PsiElement location); } diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java index 5c6e67fc49d7..b4a0d8cb1df9 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java @@ -1,6 +1,7 @@ package com.jetbrains.python.psi.types; import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; @@ -37,11 +38,12 @@ public interface PyType { /** * Proposes completion variants from type's attributes. * + * * @param location the reference on which the completion was invoked * @param context to share state between nested invocations * @return completion variants good for {@link com.intellij.psi.PsiReference#getVariants} return value. */ - Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context); + Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context); /** * Context key for access to a set of names already found by variant search. diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java b/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java index 6d211e964557..19b2f693267a 100644 --- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java +++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java @@ -59,7 +59,7 @@ public class PyNamedTupleType extends PyClassTypeImpl implements PyCallableType } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { List result = new ArrayList(); Collections.addAll(result, super.getCompletionVariants(completionPrefix, location, context)); for (String field : myFields) { diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java index 0a7addcb4f9c..68b0b37daf90 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java @@ -975,7 +975,7 @@ public class PyClassImpl extends PyPresentableElementImpl implement } @Override - public boolean processInstanceLevelDeclarations(@NotNull PsiScopeProcessor processor, @Nullable PyExpression location) { + public boolean processInstanceLevelDeclarations(@NotNull PsiScopeProcessor processor, @Nullable PsiElement location) { Map declarationsInMethod = new HashMap(); PyFunction instanceMethod = PsiTreeUtil.getParentOfType(location, PyFunction.class); final PyClass containingClass = instanceMethod != null ? instanceMethod.getContainingClass() : null; diff --git a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java index c1483a2b446b..32564392a8d3 100644 --- a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java @@ -1,6 +1,7 @@ package com.jetbrains.python.psi.types; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; import com.intellij.util.Function; import com.intellij.util.ProcessingContext; import com.jetbrains.python.PyNames; @@ -53,7 +54,7 @@ public class PyCallableTypeImpl implements PyCallableType { } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { return new Object[0]; } diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index 046bb1fac020..5b77095e3099 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -335,7 +335,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { private static Key> CTX_VISITED = Key.create("PyClassType.Visited"); public static Key CTX_SUPPRESS_PARENTHESES = Key.create("PyFunction.SuppressParentheses"); - public Object[] getCompletionVariants(String prefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String prefix, PsiElement location, ProcessingContext context) { Set visited = context.get(CTX_VISITED); if (visited == null) { visited = new HashSet(); @@ -392,7 +392,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { return ret.toArray(); } - private void addOwnClassMembers(PyExpression expressionHook, Set namesAlready, boolean suppressParentheses, List ret) { + private void addOwnClassMembers(PsiElement expressionHook, Set namesAlready, boolean suppressParentheses, List ret) { PyClass containingClass = PsiTreeUtil.getParentOfType(expressionHook, PyClass.class); if (containingClass != null) { containingClass = CompletionUtil.getOriginalElement(containingClass); @@ -429,7 +429,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } } - private static boolean isInSuperCall(PyExpression hook) { + private static boolean isInSuperCall(PsiElement hook) { if (hook instanceof PyReferenceExpression) { final PyExpression qualifier = ((PyReferenceExpression)hook).getQualifier(); return qualifier instanceof PyCallExpression && ((PyCallExpression)qualifier).isCalleeText(PyNames.SUPER); @@ -438,7 +438,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } private void addInheritedMembers(String name, - PyExpression expressionHook, + PsiElement expressionHook, Set namesAlready, ProcessingContext context, List ret, diff --git a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java index 43ef7ddcc3f7..7032bf187d8c 100644 --- a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java @@ -1,5 +1,6 @@ package com.jetbrains.python.psi.types; +import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.PyResolveContext; @@ -53,7 +54,7 @@ public class PyFunctionType implements PyCallableType { } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { return new Object[0]; } diff --git a/python/src/com/jetbrains/python/psi/types/PyGenericType.java b/python/src/com/jetbrains/python/psi/types/PyGenericType.java index bf0c5565a14c..cede2e3fea58 100644 --- a/python/src/com/jetbrains/python/psi/types/PyGenericType.java +++ b/python/src/com/jetbrains/python/psi/types/PyGenericType.java @@ -1,5 +1,6 @@ package com.jetbrains.python.psi.types; +import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; @@ -32,7 +33,7 @@ public class PyGenericType implements PyType { } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { return new Object[0]; } diff --git a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java index 25957d6cacc1..5708645e8e9f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java @@ -51,7 +51,7 @@ public class PyImportedModuleType implements PyType { return null; } - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { List result = new ArrayList(); ScopeOwner scopeOwner = ScopeUtil.getScopeOwner(location); assert scopeOwner != null; diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 95e0f3b5dd06..bff1336a2712 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -258,10 +258,17 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } @Override - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { - Set namesAlready = context.get(CTX_NAMES); - List result = new ArrayList(); + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { + List result = getCompletionVariantsAsLookupElements(location, context, false, false); + return result.toArray(); + } + public List getCompletionVariantsAsLookupElements(PsiElement location, + ProcessingContext context, + boolean wantAllSubmodules, boolean suppressParentheses) { + List result = new ArrayList(); + + Set 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)) { @@ -281,6 +288,9 @@ public class PyModuleType implements PyType { // Modules don't descend from obje PsiTreeUtil.getParentOfType(psiElement, PyImportStatementBase.class) instanceof PyFromImportStatement; } }, new PyUtil.UnderscoreFilter(0)); + if (suppressParentheses) { + processor.suppressParentheses(); + } processor.setPlainNamesOnly(point == PointInImport.AS_NAME); // no parens after imported function names myModule.processDeclarations(processor, ResolveState.initial(), null, location); if (namesAlready != null) { @@ -297,17 +307,17 @@ 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 == PointInImport.AS_MODULE || point == PointInImport.AS_NAME) { // when imported from somehow, add submodules + if (point == PointInImport.AS_MODULE || point == PointInImport.AS_NAME || wantAllSubmodules) { // when imported from somehow, add submodules result.addAll(getSubModuleVariants(myModule.getContainingDirectory(), location, namesAlready)); } else { addImportedSubmodules(location, namesAlready, result); } } - return result.toArray(); + return result; } - private void addImportedSubmodules(PyExpression location, Set existingNames, List result) { + private void addImportedSubmodules(PsiElement location, Set existingNames, List result) { PsiFile file = location.getContainingFile(); if (file instanceof PyFile) { PyFile pyFile = (PyFile)file; diff --git a/python/src/com/jetbrains/python/psi/types/PyNoneType.java b/python/src/com/jetbrains/python/psi/types/PyNoneType.java index 338a2ba96b1b..0891be499b2e 100644 --- a/python/src/com/jetbrains/python/psi/types/PyNoneType.java +++ b/python/src/com/jetbrains/python/psi/types/PyNoneType.java @@ -1,5 +1,6 @@ package com.jetbrains.python.psi.types; +import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import com.jetbrains.python.psi.AccessDirection; @@ -28,7 +29,7 @@ public class PyNoneType implements PyType { // TODO must extend ClassType. It's return null; } - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { return ArrayUtil.EMPTY_OBJECT_ARRAY; } diff --git a/python/src/com/jetbrains/python/psi/types/PyUnionType.java b/python/src/com/jetbrains/python/psi/types/PyUnionType.java index ef6688bc5c61..9c85c4a5d18a 100644 --- a/python/src/com/jetbrains/python/psi/types/PyUnionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyUnionType.java @@ -1,6 +1,7 @@ package com.jetbrains.python.psi.types; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; import com.intellij.util.NullableFunction; import com.intellij.util.ProcessingContext; import com.intellij.util.SmartList; @@ -42,7 +43,7 @@ public class PyUnionType implements PyType { return allNulls ? null : ret; } - public Object[] getCompletionVariants(String completionPrefix, PyExpression location, ProcessingContext context) { + public Object[] getCompletionVariants(String completionPrefix, PsiElement location, ProcessingContext context) { Set variants = new HashSet(); for (PyType member : myMembers) { if (member != null) {