From d6455ebfd81109f412f7bd12523d444690a3fa7b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 30 Jul 2015 18:28:09 +0200 Subject: [PATCH] BuiltInsReferenceResolver: avoid premature initialization, more cleanup #KT-8631 Fixed --- .../codeInsight/DescriptorToSourceUtilsIde.kt | 7 +- .../references/BuiltInsReferenceResolver.kt | 77 +++++++------------ 2 files changed, 29 insertions(+), 55 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/DescriptorToSourceUtilsIde.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/DescriptorToSourceUtilsIde.kt index e71d8aa3577..c0375562a9d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/DescriptorToSourceUtilsIde.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/DescriptorToSourceUtilsIde.kt @@ -52,13 +52,8 @@ public object DescriptorToSourceUtilsIde { // therefore we put both source declaration and decompiled declaration to stream, and afterwards we filter it in getAllDeclarations sequenceOfLazyValues( { DescriptorToSourceUtils.getSourceFromDescriptor(effectiveReferenced) }, - { findBuiltinDeclaration(project, effectiveReferenced) ?: DecompiledNavigationUtils.getDeclarationFromDecompiledClassFile(project, effectiveReferenced) } + { BuiltInsReferenceResolver.resolveBuiltInSymbol(project, effectiveReferenced) ?: DecompiledNavigationUtils.getDeclarationFromDecompiledClassFile(project, effectiveReferenced) } ) }.filterNotNull() } - - private fun findBuiltinDeclaration(project: Project, descriptor: DeclarationDescriptor): PsiElement? { - val libraryReferenceResolver = BuiltInsReferenceResolver.getInstance(project) - return libraryReferenceResolver.resolveBuiltInSymbol(descriptor) - } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt index b88516c96f1..7bca26088f6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt @@ -17,27 +17,19 @@ package org.jetbrains.kotlin.idea.references import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.components.AbstractProjectComponent import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupManager import com.intellij.openapi.vfs.VfsUtilCore -import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager -import com.intellij.util.Function import com.intellij.util.PathUtil -import com.intellij.util.containers.ContainerUtil -import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.context.* -import org.jetbrains.kotlin.context.MutableModuleContext +import org.jetbrains.kotlin.context.ContextForNewModule import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.frontend.di.* +import org.jetbrains.kotlin.frontend.di.createLazyResolveSession import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetFile @@ -46,19 +38,14 @@ import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.TargetPlatform -import org.jetbrains.kotlin.resolve.lazy.ResolveSession +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.resolve.scopes.JetScope -import org.jetbrains.kotlin.types.DynamicTypesSettings -import org.jetbrains.kotlin.utils.* - +import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies +import org.jetbrains.kotlin.utils.rethrow import java.io.File import java.net.MalformedURLException import java.net.URL -import java.util.HashSet - -import org.jetbrains.kotlin.resolve.descriptorUtil.classId -import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies public class BuiltInsReferenceResolver(val project: Project, val startupManager: StartupManager) { @@ -120,12 +107,7 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: // (it's simply the "kotlin" directory in kotlin-plugin.jar) // But in tests, sources of built-ins are not added to the classpath automatically, so we manually specify URLs for both: // LightClassUtil.getBuiltInsDirUrl() does so for native built-ins and the code below for compilable built-ins - try { - return builtIns + getBuiltInSourceFiles(BUILT_INS_COMPILABLE_SRC_DIR.toURI().toURL()) - } - catch (e: MalformedURLException) { - throw rethrow(e) - } + return builtIns + getBuiltInSourceFiles(BUILT_INS_COMPILABLE_SRC_DIR.toURI().toURL()) } return builtIns @@ -147,33 +129,25 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: } private fun findCurrentDescriptorForMember(originalDescriptor: MemberDescriptor): DeclarationDescriptor? { - if (!isFromBuiltinModule(originalDescriptor)) return null - val containingDeclaration = findCurrentDescriptor(originalDescriptor.getContainingDeclaration()) val memberScope = getMemberScope(containingDeclaration) ?: return null val renderedOriginal = DescriptorRenderer.FQ_NAMES_IN_TYPES.render(originalDescriptor) - val descriptors: Collection - if (originalDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptor) { - descriptors = containingDeclaration.getConstructors() + val descriptors = if (originalDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptor) { + containingDeclaration.getConstructors() } else { - descriptors = memberScope.getAllDescriptors() + memberScope.getAllDescriptors() } return descriptors.firstOrNull { renderedOriginal == DescriptorRenderer.FQ_NAMES_IN_TYPES.render(it) } } private fun findCurrentDescriptor(originalDescriptor: DeclarationDescriptor): DeclarationDescriptor? = when(originalDescriptor) { - is ClassDescriptor -> { - if (isFromBuiltinModule(originalDescriptor)) - moduleDescriptor!!.findClassAcrossModuleDependencies(originalDescriptor.classId) - else - null - } + is ClassDescriptor -> moduleDescriptor!!.findClassAcrossModuleDependencies(originalDescriptor.classId) is PackageFragmentDescriptor -> { - if (isFromBuiltinModule(originalDescriptor) && KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == originalDescriptor.fqName) + if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == originalDescriptor.fqName) builtinsPackageFragment else null @@ -184,18 +158,6 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: else -> null } - public fun resolveBuiltInSymbol(declarationDescriptor: DeclarationDescriptor): PsiElement? { - if (moduleDescriptor == null) { - return null - } - - val descriptor = findCurrentDescriptor(declarationDescriptor) - if (descriptor != null) { - return DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) - } - return null - } - companion object { private val BUILT_INS_COMPILABLE_SRC_DIR = File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString()) @@ -208,6 +170,23 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: return KotlinBuiltIns.getInstance().getBuiltInsModule() == DescriptorUtils.getContainingModule(originalDescriptor) } + public fun resolveBuiltInSymbol(project: Project, declarationDescriptor: DeclarationDescriptor): PsiElement? { + if (!isFromBuiltinModule(declarationDescriptor)) { + return null + } + + val resolver = getInstance(project) + if (resolver.moduleDescriptor == null) { + return null + } + + val descriptor = resolver.findCurrentDescriptor(declarationDescriptor) + if (descriptor != null) { + return DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) + } + return null + } + public fun isFromBuiltIns(element: PsiElement): Boolean = getInstance(element.project).builtInsSources!!.contains(element.getContainingFile())