mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
completion that guesses type name by variable name (PY-1010)
This commit is contained in:
@@ -42,6 +42,7 @@
|
||||
<typedHandler implementation="com.jetbrains.python.editor.ColonTypedHandler" id="pyColonUnindent"/>
|
||||
|
||||
<stubIndex implementation="com.jetbrains.python.psi.stubs.PyClassNameIndex"/>
|
||||
<stubIndex implementation="com.jetbrains.python.psi.stubs.PyClassNameIndexInsensitive"/>
|
||||
<stubIndex implementation="com.jetbrains.python.psi.stubs.PyFunctionNameIndex"/>
|
||||
<stubIndex implementation="com.jetbrains.python.psi.stubs.PySuperClassIndex"/>
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@ import com.intellij.util.ProcessingContext;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.patterns.SyntaxMatchers;
|
||||
import com.jetbrains.python.psi.resolve.*;
|
||||
import com.jetbrains.python.psi.stubs.PyClassNameIndexInsensitive;
|
||||
import com.jetbrains.python.psi.stubs.PyFunctionNameIndex;
|
||||
import com.jetbrains.python.psi.types.*;
|
||||
import com.jetbrains.python.toolbox.Maybe;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
@@ -156,6 +156,21 @@ public class PyQualifiedReferenceImpl extends PyReferenceImpl {
|
||||
return qualifierType.getCompletionVariants(myElement, ctx);
|
||||
}
|
||||
}
|
||||
return getUntypedVariants();
|
||||
}
|
||||
|
||||
private Object[] getUntypedVariants() {
|
||||
final PyExpression qualifierElement = myElement.getQualifier();
|
||||
if (qualifierElement instanceof PyReferenceExpression) {
|
||||
PyReferenceExpression qualifier = (PyReferenceExpression)qualifierElement;
|
||||
if (qualifier.getQualifier() == null) {
|
||||
final String className = qualifier.getText();
|
||||
final Collection<PyClass> classes = PyClassNameIndexInsensitive.find(className, getElement().getProject());
|
||||
if (classes.size() == 1) {
|
||||
return new PyClassType(classes.iterator().next(), false).getCompletionVariants(myElement, new ProcessingContext());
|
||||
}
|
||||
}
|
||||
}
|
||||
return ArrayUtil.EMPTY_OBJECT_ARRAY;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.jetbrains.python.psi.PyStubElementType;
|
||||
import com.jetbrains.python.psi.impl.PyClassImpl;
|
||||
import com.jetbrains.python.psi.impl.PyQualifiedName;
|
||||
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
|
||||
import com.jetbrains.python.psi.stubs.PyClassNameIndexInsensitive;
|
||||
import com.jetbrains.python.psi.stubs.PyClassStub;
|
||||
import com.jetbrains.python.psi.stubs.PySuperClassIndex;
|
||||
|
||||
@@ -74,6 +75,7 @@ public class PyClassElementType extends PyStubElementType<PyClassStub, PyClass>
|
||||
final String name = stub.getName();
|
||||
if (name != null) {
|
||||
sink.occurrence(PyClassNameIndex.KEY, name);
|
||||
sink.occurrence(PyClassNameIndexInsensitive.KEY, name.toLowerCase());
|
||||
}
|
||||
for(PyQualifiedName s: stub.getSuperClasses()) {
|
||||
if (s != null) {
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.jetbrains.python.psi.stubs;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.search.ProjectScope;
|
||||
import com.intellij.psi.stubs.StringStubIndexExtension;
|
||||
import com.intellij.psi.stubs.StubIndex;
|
||||
import com.intellij.psi.stubs.StubIndexKey;
|
||||
import com.intellij.util.io.KeyDescriptor;
|
||||
import com.jetbrains.python.psi.PyClass;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public class PyClassNameIndexInsensitive extends StringStubIndexExtension<PyClass> {
|
||||
public static final StubIndexKey<String,PyClass> KEY = StubIndexKey.createIndexKey("Py.class.shortNameInsensitive");
|
||||
|
||||
@Override
|
||||
public StubIndexKey<String, PyClass> getKey() {
|
||||
return KEY;
|
||||
}
|
||||
|
||||
public static Collection<PyClass> find(String name, Project project) {
|
||||
return StubIndex.getInstance().get(KEY, name.toLowerCase(), project, ProjectScope.getProjectScope(project));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class Product:
|
||||
def doStuff(self): pass
|
||||
|
||||
def foo(product):
|
||||
product.doStuff()
|
||||
@@ -0,0 +1,5 @@
|
||||
class Product:
|
||||
def doStuff(self): pass
|
||||
|
||||
def foo(product):
|
||||
product.doS<caret>
|
||||
@@ -111,6 +111,10 @@ public class PythonCompletionTest extends PyLightFixtureTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testClassNameFromVarName() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testImportModule() throws Exception {
|
||||
final String testName = "completion/" + getTestName(true);
|
||||
myFixture.configureByFiles(testName + ".py", "completion/someModule.py");
|
||||
|
||||
Reference in New Issue
Block a user