diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt index 5adc82f4cc6..141a7f53cbf 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt @@ -26,22 +26,7 @@ import com.intellij.util.Processor import com.intellij.util.containers.ContainerUtil import org.jetbrains.annotations.NonNls import org.jetbrains.jet.asJava.JavaElementFinder -import org.jetbrains.jet.lang.descriptors.* -import org.jetbrains.jet.lang.psi.* -import org.jetbrains.jet.lang.psi.psiUtil.* -import org.jetbrains.jet.lang.resolve.BindingContext -import org.jetbrains.jet.lang.resolve.BindingTraceContext -import org.jetbrains.jet.lang.resolve.ImportPath -import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver -import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer -import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils -import org.jetbrains.jet.lang.resolve.name.FqName -import org.jetbrains.jet.lang.resolve.name.Name -import org.jetbrains.jet.lang.resolve.scopes.JetScope -import org.jetbrains.jet.lang.types.JetType -import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils import org.jetbrains.jet.plugin.caches.resolve.IDELightClassGenerationSupport -import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.plugin.stubindex.* import java.util.* @@ -53,15 +38,10 @@ import com.intellij.util.containers */ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCache() { class object { - public fun getKotlinInstance(project: Project): JetShortNamesCache { - val extensions = Extensions.getArea(project).getExtensionPoint(PsiShortNamesCache.EP_NAME).getExtensions() - for (extension in extensions) { - if (extension is JetShortNamesCache) { - return extension as JetShortNamesCache - } - } - throw IllegalStateException(javaClass().getSimpleName() + " is not found for project " + project) - } + public fun getKotlinInstance(project: Project): JetShortNamesCache + = Extensions.getArea(project).getExtensionPoint(PsiShortNamesCache.EP_NAME).getExtensions() + .filterIsInstance(javaClass()) + .first() } /** diff --git a/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt b/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt index a422408968d..bac73239da6 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt @@ -171,8 +171,4 @@ public class KotlinIndicesHelper(private val project: Project) { val allDescriptors = QualifiedExpressionResolver().analyseImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor()) return allDescriptors.filterIsInstance(javaClass()).filter { it.getReceiverParameter() == null } } - - public fun getClassDescriptorsByName(name: String, analyzer: KotlinCodeAnalyzer, scope: GlobalSearchScope): Collection { - return JetShortNamesCache.getKotlinInstance(project).getClassesByName(name, scope).flatMap { ResolveSessionUtils.getClassDescriptorsByFqName(analyzer, FqName(it.getQualifiedName()!!)) } - } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AutoImportFix.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/AutoImportFix.kt index 096a5d04326..b244dc72bbb 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AutoImportFix.kt +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AutoImportFix.kt @@ -16,7 +16,6 @@ package org.jetbrains.jet.plugin.quickfix -import com.google.common.collect.Lists import com.intellij.codeInsight.daemon.impl.ShowAutoImportPass import com.intellij.codeInsight.hint.HintManager import com.intellij.codeInsight.intention.HighPriorityAction @@ -47,7 +46,7 @@ import org.jetbrains.jet.plugin.project.ProjectStructureUtil import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.plugin.util.JetPsiHeuristicsUtil import java.util.ArrayList -import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils /** * Check possibility and perform fix for unresolved references. @@ -102,72 +101,49 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction() - if (!isSuppressedTopLevelImportInPosition(element)) { - result.addAll(getClassNames(referenceName, file, searchScope, resolveSessionForBodies)) - result.addAll(getJetTopLevelFunctions(referenceName, element, searchScope, resolveSessionForBodies, file.getProject())) + + if (!element.isImportDirectiveExpression() && !JetPsiUtil.isSelectorInQualified(element)) { + result.addAll(getClassNames(referenceName, file, searchScope)) + result.addAll(getTopLevelFunctions(referenceName, element, searchScope, resolveSession, file.getProject())) } - result.addAll(getJetExtensionFunctions(referenceName, element, searchScope, resolveSessionForBodies, file.getProject())) + result.addAll(getExtensionFunctions(referenceName, element, searchScope, resolveSession, file.getProject())) return result.filter { ImportInsertHelper.needImport(ImportPath(it, false), file) } } - private fun isSuppressedTopLevelImportInPosition(element: JetSimpleNameExpression) - = element.isImportDirectiveExpression() || JetPsiUtil.isSelectorInQualified(element) - - private fun getJetTopLevelFunctions(referenceName: String, context: JetExpression, searchScope: GlobalSearchScope, resolveSession: ResolveSessionForBodies, project: Project): Collection - = KotlinIndicesHelper(project).getTopLevelFunctionDescriptorsByName(referenceName, context, resolveSession, searchScope) + private fun getTopLevelFunctions(name: String, context: JetExpression, searchScope: GlobalSearchScope, resolveSession: ResolveSessionForBodies, project: Project): Collection + = KotlinIndicesHelper(project).getTopLevelFunctionDescriptorsByName(name, context, resolveSession, searchScope) .map { DescriptorUtils.getFqNameSafe(it) } .toSet() - private fun getJetExtensionFunctions(referenceName: String, expression: JetSimpleNameExpression, searchScope: GlobalSearchScope, resolveSession: ResolveSessionForBodies, project: Project): Collection - = KotlinIndicesHelper(project).getCallableExtensions({ it == referenceName}, expression, resolveSession, searchScope) + private fun getExtensionFunctions(name: String, expression: JetSimpleNameExpression, searchScope: GlobalSearchScope, resolveSession: ResolveSessionForBodies, project: Project): Collection + = KotlinIndicesHelper(project).getCallableExtensions({ it == name }, expression, resolveSession, searchScope) .map { DescriptorUtils.getFqNameSafe(it) } .toSet() - /* - * Searches for possible class names in kotlin context and java facade. - */ - private fun getClassNames(referenceName: String, file: JetFile, searchScope: GlobalSearchScope, analyzer: KotlinCodeAnalyzer): Collection { - val possibleResolveNames = if (!ProjectStructureUtil.isJsKotlinModule(file)) { - getClassesFromCache(referenceName, searchScope, file) - } - else { - getJetClasses(referenceName, searchScope, file.getProject(), analyzer) - } - - // TODO: Do appropriate sorting - return Lists.newArrayList(possibleResolveNames) - } - - private fun getClassesFromCache(typeName: String, searchScope: GlobalSearchScope, file: JetFile): Collection - = getShortNamesCache(file).getClassesByName(typeName, searchScope) + private fun getClassNames(name: String, file: JetFile, searchScope: GlobalSearchScope): Collection + = getShortNamesCache(file).getClassesByName(name, searchScope) .filter { JetPsiHeuristicsUtil.isAccessible(it, file) } .map { FqName(it.getQualifiedName()!!) } .toSet() private fun getShortNamesCache(jetFile: JetFile): PsiShortNamesCache { - if (ProjectStructureUtil.isJsKotlinModule(jetFile)) { - return JetShortNamesCache.getKotlinInstance(jetFile.getProject()) - } - - return PsiShortNamesCache.getInstance(jetFile.getProject()) + // if we are in JS module, do not include non-kotlin classes + return if (ProjectStructureUtil.isJsKotlinModule(jetFile)) + JetShortNamesCache.getKotlinInstance(jetFile.getProject()) + else + PsiShortNamesCache.getInstance(jetFile.getProject()) } - private fun getJetClasses(typeName: String, searchScope: GlobalSearchScope, project: Project, resolveSession: KotlinCodeAnalyzer): Collection - = KotlinIndicesHelper(project).getClassDescriptorsByName(typeName, resolveSession, searchScope) - .map { DescriptorUtils.getFqNameSafe(it) } - .toSet() - class object { public fun createFactory(): JetSingleIntentionActionFactory { return object : JetSingleIntentionActionFactory() {