From 375a8f60493f90e176751d00a6fe620cfe68227b Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 28 Nov 2014 19:58:01 +0300 Subject: [PATCH] Added indices for functions and properties in package and used them to speed up completion --- .../JetTopLevelFunctionByPackageIndex.java | 49 +++++++++++++++++++ .../JetTopLevelPropertyByPackageIndex.java | 49 +++++++++++++++++++ .../stubindex/StubIndexServiceImpl.java | 22 ++++++--- ...ubBasedPackageMemberDeclarationProvider.kt | 28 +++++------ idea/src/META-INF/plugin.xml | 2 + 5 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelFunctionByPackageIndex.java create mode 100644 idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertyByPackageIndex.java diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelFunctionByPackageIndex.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelFunctionByPackageIndex.java new file mode 100644 index 00000000000..f2e1c57d3fd --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelFunctionByPackageIndex.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.stubindex; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.StringStubIndexExtension; +import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetNamedFunction; + +import java.util.Collection; + +public class JetTopLevelFunctionByPackageIndex extends StringStubIndexExtension { + private static final StubIndexKey KEY = KotlinIndexUtil.createIndexKey(JetTopLevelFunctionByPackageIndex.class); + + private static final JetTopLevelFunctionByPackageIndex ourInstance = new JetTopLevelFunctionByPackageIndex(); + + public static JetTopLevelFunctionByPackageIndex getInstance() { + return ourInstance; + } + + private JetTopLevelFunctionByPackageIndex() {} + + @NotNull + @Override + public StubIndexKey getKey() { + return KEY; + } + + @Override + public Collection get(String fqName, Project project, @NotNull GlobalSearchScope scope) { + return super.get(fqName, project, JetSourceFilterScope.kotlinSourcesAndLibraries(scope, project)); + } +} diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertyByPackageIndex.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertyByPackageIndex.java new file mode 100644 index 00000000000..36ffb3546ed --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertyByPackageIndex.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.stubindex; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.StringStubIndexExtension; +import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetProperty; + +import java.util.Collection; + +public class JetTopLevelPropertyByPackageIndex extends StringStubIndexExtension { + private static final StubIndexKey KEY = KotlinIndexUtil.createIndexKey(JetTopLevelPropertyByPackageIndex.class); + + private static final JetTopLevelPropertyByPackageIndex ourInstance = new JetTopLevelPropertyByPackageIndex(); + + public static JetTopLevelPropertyByPackageIndex getInstance() { + return ourInstance; + } + + private JetTopLevelPropertyByPackageIndex() {} + + @NotNull + @Override + public StubIndexKey getKey() { + return KEY; + } + + @Override + public Collection get(String fqName, Project project, @NotNull GlobalSearchScope scope) { + return super.get(fqName, project, JetSourceFilterScope.kotlinSourcesAndLibraries(scope, project)); + } +} diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java index 98c51575f56..3108f9c2d62 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java @@ -118,10 +118,14 @@ public class StubIndexServiceImpl implements StubIndexService { sink.occurrence(JetProbablyNothingFunctionShortNameIndex.getInstance().getKey(), name); } } - // can have special fq name in case of syntactically incorrect function with no name - FqName topFQName = stub.getFqName(); - if (topFQName != null) { - sink.occurrence(JetTopLevelFunctionsFqnNameIndex.getInstance().getKey(), topFQName.asString()); + + if (stub.isTopLevel()) { + // can have special fq name in case of syntactically incorrect function with no name + FqName fqName = stub.getFqName(); + if (fqName != null) { + sink.occurrence(JetTopLevelFunctionsFqnNameIndex.getInstance().getKey(), fqName.asString()); + sink.occurrence(JetTopLevelFunctionByPackageIndex.getInstance().getKey(), fqName.parent().asString()); + } } } @@ -145,11 +149,13 @@ public class StubIndexServiceImpl implements StubIndexService { sink.occurrence(JetProbablyNothingPropertyShortNameIndex.getInstance().getKey(), name); } } - // can have special fq name in case of syntactically incorrect function with no name + if (stub.isTopLevel()) { - FqName topFQName = stub.getFqName(); - if (topFQName != null) { - sink.occurrence(JetTopLevelPropertiesFqnNameIndex.getInstance().getKey(), topFQName.asString()); + FqName fqName = stub.getFqName(); + // can have special fq name in case of syntactically incorrect property with no name + if (fqName != null) { + sink.occurrence(JetTopLevelPropertiesFqnNameIndex.getInstance().getKey(), fqName.asString()); + sink.occurrence(JetTopLevelPropertyByPackageIndex.getInstance().getKey(), fqName.parent().asString()); } } } diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index 68a90d6b607..ef5020f9936 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -18,7 +18,6 @@ package org.jetbrains.jet.plugin.stubindex.resolve import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.stubs.StringStubIndexExtension import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider import org.jetbrains.jet.lang.resolve.name.FqName @@ -33,6 +32,9 @@ import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils import java.util.ArrayList import org.jetbrains.jet.lang.resolve.scopes.DescriptorKindFilter import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex +import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionByPackageIndex +import com.intellij.psi.stubs.StringStubIndexExtension +import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertyByPackageIndex public class StubBasedPackageMemberDeclarationProvider( private val fqName: FqName, @@ -43,33 +45,25 @@ public class StubBasedPackageMemberDeclarationProvider( override fun getDeclarations(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): List { val result = ArrayList() - if (kindFilter.acceptsKinds(DescriptorKindFilter.CLASSIFIERS_MASK)) { - JetClassByPackageIndex.getInstance().get(fqName.asString(), project, searchScope) - .filterTo(result) { nameFilter(it.getNameAsSafeName()) } + fun addFromIndex(index: StringStubIndexExtension) { + index.get(fqName.asString(), project, searchScope).filterTo(result) { nameFilter(it.getNameAsSafeName()) } + } + + if (kindFilter.acceptsKinds(DescriptorKindFilter.CLASSIFIERS_MASK)) { + addFromIndex(JetClassByPackageIndex.getInstance()) } - //TODO: add by package indices for functions and properties too? if (kindFilter.acceptsKinds(DescriptorKindFilter.FUNCTIONS_MASK)) { - result.addDeclarations(JetTopLevelFunctionsFqnNameIndex.getInstance(), nameFilter) + addFromIndex(JetTopLevelFunctionByPackageIndex.getInstance()) } if (kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK)) { - result.addDeclarations(JetTopLevelPropertiesFqnNameIndex.getInstance(), nameFilter) + addFromIndex(JetTopLevelPropertyByPackageIndex.getInstance()) } return result } - private fun MutableCollection.addDeclarations(index: StringStubIndexExtension, - nameFilter: (Name) -> Boolean) { - index.getAllKeys(project) - .stream() - .map { FqName(it) } - .filter { !it.isRoot() && it.parent() == fqName && nameFilter(it.shortName()) } - .toSet() - .flatMapTo(this) { index[it.asString(), project, searchScope] } - } - override fun getClassOrObjectDeclarations(name: Name): Collection { return JetFullClassNameIndex.getInstance().get(childName(name), project, searchScope) .map { JetClassInfoUtil.createClassLikeInfo(it) } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 2a56d2afb7f..e9b7fbdb93a 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -395,6 +395,8 @@ + +