Use ModuleInfo in VirtualFileFinder to add script dependencies in search scope

Otherwise it prevent to inline functions from those dependencies during scratch compilation
This commit is contained in:
Natalia Selezneva
2018-12-05 09:37:18 +03:00
parent f3c828a17d
commit 254374c619
7 changed files with 40 additions and 3 deletions
@@ -149,7 +149,7 @@ internal fun getMethodNode(
} }
internal fun findVirtualFile(state: GenerationState, classId: ClassId): VirtualFile? { 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? { internal fun findVirtualFileImprecise(state: GenerationState, internalClassName: String): VirtualFile? {
@@ -16,12 +16,17 @@
package org.jetbrains.kotlin.cli.jvm.compiler package org.jetbrains.kotlin.cli.jvm.compiler
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex 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.VirtualFileFinder
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
// TODO: create different JvmDependenciesIndex instances for different sets of source roots to improve performance // TODO: create different JvmDependenciesIndex instances for different sets of source roots to improve performance
class CliVirtualFileFinderFactory(private val index: JvmDependenciesIndex) : VirtualFileFinderFactory { class CliVirtualFileFinderFactory(private val index: JvmDependenciesIndex) : VirtualFileFinderFactory {
override fun create(scope: GlobalSearchScope): VirtualFileFinder = CliVirtualFileFinder(index, scope) override fun create(scope: GlobalSearchScope): VirtualFileFinder = CliVirtualFileFinder(index, scope)
override fun create(project: Project, module: ModuleDescriptor): VirtualFileFinder =
CliVirtualFileFinder(index, GlobalSearchScope.allScope(project))
} }
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.load.kotlin
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.GlobalSearchScope 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.JavaClass
import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -51,7 +53,11 @@ abstract class VirtualFileFinder : KotlinClassFinder {
} }
companion object SERVICE { companion object SERVICE {
fun getInstance(project: Project, module: ModuleDescriptor): VirtualFileFinder =
VirtualFileFinderFactory.getInstance(project).create(project, module)
@TestOnly
fun getInstance(project: Project): VirtualFileFinder = fun getInstance(project: Project): VirtualFileFinder =
VirtualFileFinderFactory.getInstance(project).create(GlobalSearchScope.allScope(project)) VirtualFileFinderFactory.getInstance(project).create(GlobalSearchScope.allScope(project))
} }
} }
@@ -19,9 +19,11 @@ package org.jetbrains.kotlin.load.kotlin
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
interface VirtualFileFinderFactory : MetadataFinderFactory { interface VirtualFileFinderFactory : MetadataFinderFactory {
override fun create(scope: GlobalSearchScope): VirtualFileFinder override fun create(scope: GlobalSearchScope): VirtualFileFinder
override fun create(project: Project, module: ModuleDescriptor): VirtualFileFinder
companion object SERVICE { companion object SERVICE {
fun getInstance(project: Project): VirtualFileFinderFactory = fun getInstance(project: Project): VirtualFileFinderFactory =
@@ -16,9 +16,12 @@
package org.jetbrains.kotlin.load.kotlin package org.jetbrains.kotlin.load.kotlin
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder
interface MetadataFinderFactory { interface MetadataFinderFactory {
fun create(scope: GlobalSearchScope): KotlinMetadataFinder fun create(scope: GlobalSearchScope): KotlinMetadataFinder
fun create(project: Project, module: ModuleDescriptor): KotlinMetadataFinder
} }
@@ -16,10 +16,27 @@
package org.jetbrains.kotlin.idea.vfilefinder package org.jetbrains.kotlin.idea.vfilefinder
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope 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.VirtualFileFinder
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
class IDEVirtualFileFinderFactory : VirtualFileFinderFactory { class IDEVirtualFileFinderFactory : VirtualFileFinderFactory {
override fun create(scope: GlobalSearchScope): VirtualFileFinder = IDEVirtualFileFinder(scope) 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)
}
} }
@@ -36,8 +36,11 @@ import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset
import org.jetbrains.kotlin.idea.refactoring.toPsiFile import org.jetbrains.kotlin.idea.refactoring.toPsiFile
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.idea.util.application.runReadAction 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.lexer.KtTokens
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder 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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name 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 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 val classFile = fileFinder.findVirtualFileWithHeader(classId) ?: return null
return classFile.contentsToByteArray(false) return classFile.contentsToByteArray(false)
} }