completion that guesses type name by variable name (PY-1010)

This commit is contained in:
Dmitry Jemerov
2010-07-01 21:53:41 +04:00
parent 1d2a80a4a0
commit 07f64f02f2
7 changed files with 60 additions and 1 deletions
@@ -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");