diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinByModulesResolutionScopeProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinByModulesResolutionScopeProvider.kt index 70415904e06..aee1226c913 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinByModulesResolutionScopeProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinByModulesResolutionScopeProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -7,15 +7,19 @@ package org.jetbrains.kotlin.analysis.providers.impl import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.project.structure.KtModule -import org.jetbrains.kotlin.analysis.project.structure.allDirectDependencies import org.jetbrains.kotlin.analysis.providers.KotlinResolutionScopeProvider +import org.jetbrains.kotlin.utils.topologicalSort public class KotlinByModulesResolutionScopeProvider : KotlinResolutionScopeProvider() { override fun getResolutionScope(module: KtModule): GlobalSearchScope { - val allModules = buildList { - add(module) - addAll(module.allDirectDependencies()) + val allModules = topologicalSort(listOf(module)) { + buildList { + addAll(directDependsOnDependencies) + addAll(directFriendDependencies) + addAll(directRegularDependencies) + } } + return GlobalSearchScope.union(allModules.map { it.contentScope }) } -} \ No newline at end of file +} diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt index 14d38b1df03..786983518a4 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt @@ -40,7 +40,7 @@ abstract class KotlinAsJavaSupportBase(protected val project: Pro return when { facadeFiles.none(KtFile::hasTopLevelCallables) -> null facadeFiles.none(KtFile::isCompiled) -> { - LightClassCachedValue(createInstanceOfLightFacade(facadeFqName, facadeFiles), outOfBlockModificationTracker(file)) + LightClassCachedValue(createInstanceOfLightFacade(facadeFqName, module, facadeFiles), outOfBlockModificationTracker(file)) } facadeFiles.all(KtFile::isCompiled) -> { @@ -68,6 +68,10 @@ abstract class KotlinAsJavaSupportBase(protected val project: Pro protected abstract val TModule.contentSearchScope: GlobalSearchScope protected abstract fun createInstanceOfLightFacade(facadeFqName: FqName, files: List): KtLightClassForFacade? + protected open fun createInstanceOfLightFacade(facadeFqName: FqName, module: TModule, files: List): KtLightClassForFacade? { + return createInstanceOfLightFacade(facadeFqName, files) + } + protected abstract fun createInstanceOfDecompiledLightFacade(facadeFqName: FqName, files: List): KtLightClassForFacade? protected open fun projectWideOutOfBlockModificationTracker(): ModificationTracker { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt index 8a6fc302c9a..26af12ed7a0 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt @@ -141,10 +141,22 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase): KtLightClassForFacade? { val module = files.first().getModuleIfSupportEnabled() ?: return null + return createInstanceOfLightFacade(facadeFqName, module, files) + } + + override fun createInstanceOfLightFacade(facadeFqName: FqName, module: KtModule, files: List): KtLightClassForFacade? { return SymbolLightClassForFacade(facadeFqName, files, module) } - override val KtModule.contentSearchScope: GlobalSearchScope get() = this.contentScope + override val KtModule.contentSearchScope: GlobalSearchScope + get() = GlobalSearchScope.union( + buildList { + add(contentScope) + for (dependency in transitiveDependsOnDependencies) { + add(dependency.contentScope) + } + } + ) override fun facadeIsApplicable(module: KtModule, file: KtFile): Boolean = module.isFromSourceOrLibraryBinary() && module.isLightClassesEnabled() diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformIntermediateFacade.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformIntermediateFacade.java index 3023a440dbf..abe02730add 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformIntermediateFacade.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformIntermediateFacade.java @@ -1,22 +1,43 @@ public final class MyFacadeKt /* mypack.MyFacadeKt*/ { - @org.jetbrains.annotations.NotNull() - public static final mypack.IntermediateClassWithActualization getIntermediateVariable1();// getIntermediateVariable1() + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getCommonVariable1();// getCommonVariable1() - @org.jetbrains.annotations.NotNull() - public static final mypack.IntermediateClassWithActualization getIntermediateVariable2();// getIntermediateVariable2() + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getCommonVariable2();// getCommonVariable2() - @org.jetbrains.annotations.NotNull() - public static final mypack.IntermediateClassWithActualization getIntermediateVariableWithActualization();// getIntermediateVariableWithActualization() + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getCommonVariableWithActualization();// getCommonVariableWithActualization() - public static final void intermediateFunction1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction1(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getIntermediateVariable1();// getIntermediateVariable1() - public static final void intermediateFunction2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction2(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getIntermediateVariable2();// getIntermediateVariable2() - public static final void intermediateFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunctionWithActualization(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + @org.jetbrains.annotations.NotNull() + public static final mypack.IntermediateClassWithActualization getIntermediateVariableWithActualization();// getIntermediateVariableWithActualization() - public static final void setIntermediateVariable1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariable1(mypack.IntermediateClassWithActualization) + public static final void commonFunction1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunction1(mypack.IntermediateClassWithActualization, mypack.MyCommonClass) - public static final void setIntermediateVariable2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariable2(mypack.IntermediateClassWithActualization) + public static final void commonFunction2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunction2(mypack.IntermediateClassWithActualization, mypack.MyCommonClass) - public static final void setIntermediateVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariableWithActualization(mypack.IntermediateClassWithActualization) + public static final void commonFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunctionWithActualization(mypack.IntermediateClassWithActualization, mypack.MyCommonClass) + + public static final void intermediateFunction1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction1(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + + public static final void intermediateFunction2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction2(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + + public static final void intermediateFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunctionWithActualization(mypack.IntermediateClassWithActualization, mypack.IntermediateClassWithActualization, mypack.MyCommonClass, mypack.MyIntermediateClass) + + public static final void setCommonVariable1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setCommonVariable1(mypack.IntermediateClassWithActualization) + + public static final void setCommonVariable2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setCommonVariable2(mypack.IntermediateClassWithActualization) + + public static final void setCommonVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setCommonVariableWithActualization(mypack.IntermediateClassWithActualization) + + public static final void setIntermediateVariable1(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariable1(mypack.IntermediateClassWithActualization) + + public static final void setIntermediateVariable2(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariable2(mypack.IntermediateClassWithActualization) + + public static final void setIntermediateVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.IntermediateClassWithActualization);// setIntermediateVariableWithActualization(mypack.IntermediateClassWithActualization) } diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformJvmFacade.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformJvmFacade.java index 05030550b00..98bc8811ee6 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformJvmFacade.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/compilationErrors/MultiplatformJvmFacade.java @@ -1,7 +1,25 @@ public final class MyFacadeKt /* mypack.MyFacadeKt*/ { + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getCommonVariable1();// getCommonVariable1() + + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getCommonVariable2();// getCommonVariable2() + @org.jetbrains.annotations.NotNull() public static final mypack.MyJvmClass getCommonVariableWithActualization();// getCommonVariableWithActualization() + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getCommonVariableWithActualization();// getCommonVariableWithActualization() + + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getIntermediateVariable1();// getIntermediateVariable1() + + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getIntermediateVariable2();// getIntermediateVariable2() + + @org.jetbrains.annotations.NotNull() + public static final mypack.MyJvmClass getIntermediateVariableWithActualization();// getIntermediateVariableWithActualization() + @org.jetbrains.annotations.NotNull() public static final mypack.MyJvmClass getIntermediateVariableWithActualization();// getIntermediateVariableWithActualization() @@ -11,16 +29,40 @@ public final class MyFacadeKt /* mypack.MyFacadeKt*/ { @org.jetbrains.annotations.NotNull() public static final mypack.MyJvmClass getJvmVariable2();// getJvmVariable2() + public static final void commonFunction1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunction1(mypack.MyJvmClass, mypack.MyCommonClass) + + public static final void commonFunction2(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunction2(mypack.MyJvmClass, mypack.MyCommonClass) + + public static final void commonFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass);// commonFunctionWithActualization(mypack.MyJvmClass, mypack.MyCommonClass) + public static final void commonFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// commonFunctionWithActualization(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass) + public static final void intermediateFunction1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction1(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass) + + public static final void intermediateFunction2(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunction2(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass) + + public static final void intermediateFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunctionWithActualization(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass) + public static final void intermediateFunctionWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass);// intermediateFunctionWithActualization(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass) public static final void jvmFunction1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// jvmFunction1(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass, mypack.MyJvmClass) public static final void jvmFunction2(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass, @org.jetbrains.annotations.NotNull() mypack.MyCommonClass, @org.jetbrains.annotations.NotNull() mypack.MyIntermediateClass, @org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// jvmFunction2(mypack.MyJvmClass, mypack.MyJvmClass, mypack.MyCommonClass, mypack.MyIntermediateClass, mypack.MyJvmClass) + public static final void setCommonVariable1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setCommonVariable1(mypack.MyJvmClass) + + public static final void setCommonVariable2(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setCommonVariable2(mypack.MyJvmClass) + public static final void setCommonVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setCommonVariableWithActualization(mypack.MyJvmClass) + public static final void setCommonVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setCommonVariableWithActualization(mypack.MyJvmClass) + + public static final void setIntermediateVariable1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setIntermediateVariable1(mypack.MyJvmClass) + + public static final void setIntermediateVariable2(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setIntermediateVariable2(mypack.MyJvmClass) + + public static final void setIntermediateVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setIntermediateVariableWithActualization(mypack.MyJvmClass) + public static final void setIntermediateVariableWithActualization(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setIntermediateVariableWithActualization(mypack.MyJvmClass) public static final void setJvmVariable1(@org.jetbrains.annotations.NotNull() mypack.MyJvmClass);// setJvmVariable1(mypack.MyJvmClass)