diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 73a52fe9d45e..401285c6176b 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -54,6 +54,7 @@ + diff --git a/python/src/com/jetbrains/python/PyGotoSymbolContributor.java b/python/src/com/jetbrains/python/PyGotoSymbolContributor.java index 506996da9da2..8bfd9954b838 100644 --- a/python/src/com/jetbrains/python/PyGotoSymbolContributor.java +++ b/python/src/com/jetbrains/python/PyGotoSymbolContributor.java @@ -4,13 +4,16 @@ import com.intellij.navigation.ChooseByNameContributor; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.ProjectScope; import com.intellij.psi.stubs.StubIndex; import com.intellij.util.ArrayUtil; import com.jetbrains.python.psi.stubs.PyClassNameIndex; import com.jetbrains.python.psi.stubs.PyFunctionNameIndex; +import com.jetbrains.python.psi.stubs.PyVariableNameIndex; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * @author yole @@ -20,6 +23,7 @@ public class PyGotoSymbolContributor implements ChooseByNameContributor { Set symbols = new HashSet(); symbols.addAll(PyClassNameIndex.allKeys(project)); symbols.addAll(StubIndex.getInstance().getAllKeys(PyFunctionNameIndex.KEY, project)); + symbols.addAll(StubIndex.getInstance().getAllKeys(PyVariableNameIndex.KEY, project)); return ArrayUtil.toStringArray(symbols); } @@ -31,6 +35,7 @@ public class PyGotoSymbolContributor implements ChooseByNameContributor { List symbols = new ArrayList(); symbols.addAll(PyClassNameIndex.find(name, project, scope)); symbols.addAll(PyFunctionNameIndex.find(name, project, scope)); + symbols.addAll(PyVariableNameIndex.find(name, project, scope)); return symbols.toArray(new NavigationItem[symbols.size()]); } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java index a62339ccf5e1..71d80a3b3cab 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java @@ -13,7 +13,9 @@ import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.impl.PyTargetExpressionImpl; +import com.jetbrains.python.psi.stubs.PyFileStub; import com.jetbrains.python.psi.stubs.PyTargetExpressionStub; +import com.jetbrains.python.psi.stubs.PyVariableNameIndex; import java.io.IOException; @@ -115,6 +117,12 @@ public class PyTargetExpressionElementType extends PyStubElementType { + public static final StubIndexKey KEY = StubIndexKey.createIndexKey("Py.variable.shortName"); + + public StubIndexKey getKey() { + return KEY; + } + + public static Collection find(String name, Project project, GlobalSearchScope scope) { + return StubIndex.getInstance().get(KEY, name, project, scope); + } +} diff --git a/python/testData/stubs/VariableIndex.py b/python/testData/stubs/VariableIndex.py new file mode 100644 index 000000000000..c44a0878dcb0 --- /dev/null +++ b/python/testData/stubs/VariableIndex.py @@ -0,0 +1,9 @@ +xyzzy = 1 + +__all__ = ['xyzzy'] + +def foo(): + shazam = 2 + +class C: + boohoo = 3 diff --git a/python/testSrc/com/jetbrains/python/PyStubsTest.java b/python/testSrc/com/jetbrains/python/PyStubsTest.java index dc649f6f2c43..1163ba39c7d6 100644 --- a/python/testSrc/com/jetbrains/python/PyStubsTest.java +++ b/python/testSrc/com/jetbrains/python/PyStubsTest.java @@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubUpdatingIndex; import com.intellij.testFramework.TestDataPath; @@ -19,8 +20,10 @@ import com.jetbrains.python.psi.impl.PyFileImpl; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher; import com.jetbrains.python.psi.stubs.PyClassStub; +import com.jetbrains.python.psi.stubs.PyVariableNameIndex; import com.jetbrains.python.toolbox.Maybe; +import java.util.Collection; import java.util.List; @TestDataPath("$CONTENT_ROOT/../testData/stubs/") @@ -269,6 +272,16 @@ public class PyStubsTest extends PyLightFixtureTestCase { assertNotParsed(file); } + public void testVariableIndex() { + getTestFile(); + GlobalSearchScope scope = GlobalSearchScope.allScope(myFixture.getProject()); + Collection result = PyVariableNameIndex.find("xyzzy", myFixture.getProject(), scope); + assertEquals(1, result.size()); + assertEquals(0, PyVariableNameIndex.find("shazam", myFixture.getProject(), scope).size()); + assertEquals(0, PyVariableNameIndex.find("boohoo", myFixture.getProject(), scope).size()); + assertEquals(0, PyVariableNameIndex.find("__all__", myFixture.getProject(), scope).size()); + } + private PyFile getTestFile() { return getTestFile(getTestName(false) + ".py"); }