diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt index 6c1cccb761c..0346798c7bc 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiJavaModule import com.intellij.psi.PsiManager import com.intellij.psi.impl.light.LightJavaModule +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.common.config.ContentRoot import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity @@ -58,6 +59,8 @@ class ClasspathRootsResolver( ) { val javaModuleGraph = JavaModuleGraph(javaModuleFinder) + private val searchScope = GlobalSearchScope.allScope(psiManager.project) + data class RootsAndModules(val roots: List, val modules: List) private data class RootWithPrefix(val root: VirtualFile, val packagePrefix: String?) @@ -162,7 +165,7 @@ class ClasspathRootsResolver( } if (moduleInfoFile != null) { - val moduleInfo = JavaModuleInfo.read(moduleInfoFile, javaFileManager) ?: return null + val moduleInfo = JavaModuleInfo.read(moduleInfoFile, javaFileManager, searchScope) ?: return null return JavaModule.Explicit(moduleInfo, listOf(JavaModule.Root(root, isBinary = true)), moduleInfoFile) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt index 4ee9b53450f..b0d6978ec11 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt @@ -84,8 +84,6 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ fun findClass(classId: ClassId, searchScope: GlobalSearchScope) = findClass(JavaClassFinder.Request(classId), searchScope) - override fun findClass(classId: ClassId): JavaClass? = findClass(JavaClassFinder.Request(classId), allScope) - override fun findClass(request: JavaClassFinder.Request, searchScope: GlobalSearchScope): JavaClass? { val (classId, classFileContentFromRequest, outerClassFromRequest) = request val virtualFile = findVirtualFileForTopLevelClass(classId, searchScope) ?: return null @@ -112,7 +110,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ val classContent = classFileContentFromRequest ?: virtualFile.contentsToByteArray() if (virtualFile.nameWithoutExtension.contains("$") && isNotTopLevelClass(classContent)) return@getOrPut null - val resolver = ClassifierResolutionContext { findClass(it) } + val resolver = ClassifierResolutionContext { findClass(it, allScope) } BinaryJavaClass( virtualFile, classId.asSingleFqName(), resolver, signatureParsingComponent, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index d6d3cf3c99f..3b300f41c49 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -198,7 +198,8 @@ class KotlinCoreEnvironment private constructor( jdkHome?.path?.let { path -> jrtFileSystem?.findFileByPath(path + URLUtil.JAR_SEPARATOR) }, - javaFileManager + javaFileManager, + project ) val outputDirectory = diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt index 7e2d690d73a..db1a3d6e67c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder.kt @@ -16,17 +16,25 @@ package org.jetbrains.kotlin.cli.jvm.modules +import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiJavaModule +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.resolve.jvm.KotlinCliJavaFileManager import org.jetbrains.kotlin.resolve.jvm.modules.JavaModule import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleFinder import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleInfo -class CliJavaModuleFinder(jrtFileSystemRoot: VirtualFile?, val javaFileManager: KotlinCliJavaFileManager) : JavaModuleFinder { +class CliJavaModuleFinder( + jrtFileSystemRoot: VirtualFile?, + private val javaFileManager: KotlinCliJavaFileManager, + project: Project +) : JavaModuleFinder { private val modulesRoot = jrtFileSystemRoot?.findChild("modules") private val userModules = linkedMapOf() + private val allScope = GlobalSearchScope.allScope(project) + fun addUserModule(module: JavaModule) { userModules.putIfAbsent(module.name, module) } @@ -42,7 +50,7 @@ class CliJavaModuleFinder(jrtFileSystemRoot: VirtualFile?, val javaFileManager: private fun findSystemModule(moduleRoot: VirtualFile): JavaModule.Explicit? { val file = moduleRoot.findChild(PsiJavaModule.MODULE_INFO_CLS_FILE) ?: return null - val moduleInfo = JavaModuleInfo.read(file, javaFileManager) ?: return null + val moduleInfo = JavaModuleInfo.read(file, javaFileManager, allScope) ?: return null return JavaModule.Explicit(moduleInfo, listOf(JavaModule.Root(moduleRoot, isBinary = true)), file) } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleInfo.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleInfo.kt index 32704dabe2c..63d6190bebe 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleInfo.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleInfo.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.resolve.jvm.modules import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiJavaModule import com.intellij.psi.PsiModifier +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.structure.JavaAnnotation import org.jetbrains.kotlin.load.java.structure.impl.JavaAnnotationImpl import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryClassSignatureParser @@ -60,7 +62,7 @@ class JavaModuleInfo( psiJavaModule.annotations.convert(::JavaAnnotationImpl) ) - fun read(file: VirtualFile, javaFileManager: KotlinCliJavaFileManager): JavaModuleInfo? { + fun read(file: VirtualFile, javaFileManager: KotlinCliJavaFileManager, searchScope: GlobalSearchScope): JavaModuleInfo? { val contents = try { file.contentsToByteArray() } catch (e: IOException) { @@ -93,7 +95,7 @@ class JavaModuleInfo( val (annotation, visitor) = BinaryJavaAnnotation.createAnnotationAndVisitor( descriptor, - ClassifierResolutionContext(javaFileManager::findClass), + ClassifierResolutionContext { javaFileManager.findClass(JavaClassFinder.Request(it), searchScope) }, BinaryClassSignatureParser(), isFreshlySupportedTypeUseAnnotation = true ) diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt index 935ffbdbaae..5b8bc7939d6 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager.kt @@ -20,11 +20,9 @@ import com.intellij.psi.impl.file.impl.JavaFileManager import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.structure.JavaClass -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName interface KotlinCliJavaFileManager : JavaFileManager { - fun findClass(classId: ClassId): JavaClass? fun findClass(request: JavaClassFinder.Request, searchScope: GlobalSearchScope): JavaClass? fun knownClassNamesInPackage(packageFqName: FqName): Set? }