From 254374c6199290ada768fae58ea2be1770d3751d Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 5 Dec 2018 09:37:18 +0300 Subject: [PATCH] Use ModuleInfo in VirtualFileFinder to add script dependencies in search scope Otherwise it prevent to inline functions from those dependencies during scratch compilation --- .../kotlin/codegen/inline/inlineCodegenUtils.kt | 2 +- .../jvm/compiler/CliVirtualFileFinderFactory.kt | 5 +++++ .../kotlin/load/kotlin/VirtualFileFinder.kt | 8 +++++++- .../load/kotlin/VirtualFileFinderFactory.kt | 2 ++ .../kotlin/load/kotlin/MetadataFinderFactory.kt | 3 +++ .../vfilefinder/IDEVirtualFileFinderFactory.kt | 17 +++++++++++++++++ .../debugger/NoStrataPositionManagerHelper.kt | 6 +++++- 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt index e32e25c16c3..96982573414 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt @@ -149,7 +149,7 @@ internal fun getMethodNode( } internal fun findVirtualFile(state: GenerationState, classId: ClassId): VirtualFile? { - return VirtualFileFinder.getInstance(state.project).findVirtualFileWithHeader(classId) + return VirtualFileFinder.getInstance(state.project, state.module).findVirtualFileWithHeader(classId) } internal fun findVirtualFileImprecise(state: GenerationState, internalClassName: String): VirtualFile? { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt index aa1899c95cc..5ca920f16c6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory.kt @@ -16,12 +16,17 @@ package org.jetbrains.kotlin.cli.jvm.compiler +import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory // TODO: create different JvmDependenciesIndex instances for different sets of source roots to improve performance class CliVirtualFileFinderFactory(private val index: JvmDependenciesIndex) : VirtualFileFinderFactory { override fun create(scope: GlobalSearchScope): VirtualFileFinder = CliVirtualFileFinder(index, scope) + + override fun create(project: Project, module: ModuleDescriptor): VirtualFileFinder = + CliVirtualFileFinder(index, GlobalSearchScope.allScope(project)) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt index f5ccbdb89d5..50f9a75a2d7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinder.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.load.kotlin import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.name.ClassId @@ -51,7 +53,11 @@ abstract class VirtualFileFinder : KotlinClassFinder { } companion object SERVICE { + fun getInstance(project: Project, module: ModuleDescriptor): VirtualFileFinder = + VirtualFileFinderFactory.getInstance(project).create(project, module) + + @TestOnly fun getInstance(project: Project): VirtualFileFinder = - VirtualFileFinderFactory.getInstance(project).create(GlobalSearchScope.allScope(project)) + VirtualFileFinderFactory.getInstance(project).create(GlobalSearchScope.allScope(project)) } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt index e0bec324d09..70523170947 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory.kt @@ -19,9 +19,11 @@ package org.jetbrains.kotlin.load.kotlin import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.descriptors.ModuleDescriptor interface VirtualFileFinderFactory : MetadataFinderFactory { override fun create(scope: GlobalSearchScope): VirtualFileFinder + override fun create(project: Project, module: ModuleDescriptor): VirtualFileFinder companion object SERVICE { fun getInstance(project: Project): VirtualFileFinderFactory = diff --git a/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/MetadataFinderFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/MetadataFinderFactory.kt index f95410afa4b..5d75206303b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/MetadataFinderFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/load/kotlin/MetadataFinderFactory.kt @@ -16,9 +16,12 @@ package org.jetbrains.kotlin.load.kotlin +import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder interface MetadataFinderFactory { fun create(scope: GlobalSearchScope): KotlinMetadataFinder + fun create(project: Project, module: ModuleDescriptor): KotlinMetadataFinder } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.kt index 79fc50057bf..9bb67cea571 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/IDEVirtualFileFinderFactory.kt @@ -16,10 +16,27 @@ package org.jetbrains.kotlin.idea.vfilefinder +import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo +import org.jetbrains.kotlin.idea.caches.project.ScriptModuleInfo import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory class IDEVirtualFileFinderFactory : VirtualFileFinderFactory { override fun create(scope: GlobalSearchScope): VirtualFileFinder = IDEVirtualFileFinder(scope) + + override fun create(project: Project, module: ModuleDescriptor): VirtualFileFinder { + val ideaModuleInfo = (module.getCapability(ModuleInfo.Capability) as? IdeaModuleInfo) + + val scope = when (ideaModuleInfo) { + is ScriptModuleInfo -> GlobalSearchScope.union( + ideaModuleInfo.dependencies().map { it.contentScope() }.toTypedArray() + ) + else -> GlobalSearchScope.allScope(project) + } + return IDEVirtualFileFinder(scope) + } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt index b518dde8b77..be090575866 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/NoStrataPositionManagerHelper.kt @@ -36,8 +36,11 @@ import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.refactoring.toPsiFile import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.idea.vfilefinder.IDEVirtualFileFinder +import org.jetbrains.kotlin.idea.vfilefinder.IDEVirtualFileFinderFactory import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -135,7 +138,8 @@ private fun readClassFileImpl(project: Project, val classId = ClassId(jvmName.packageFqName, Name.identifier(fqNameWithInners.asString())) - val fileFinder = VirtualFileFinder.getInstance(project) + // TODO use debugger search scope + val fileFinder = VirtualFileFinderFactory.getInstance(project).create(GlobalSearchScope.allScope(project)) val classFile = fileFinder.findVirtualFileWithHeader(classId) ?: return null return classFile.contentsToByteArray(false) }