From ff3f3d2f9b6ce235aeb13815f61c85aeaab2f78c Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 19 May 2021 17:58:44 +0300 Subject: [PATCH] [FIR] Properly setup search scope for IC symbol provider --- .../FirKotlinToJvmBytecodeCompiler.kt | 20 +++++++++++++++++-- .../kotlin/fir/session/FirSessionFactory.kt | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index 86a7763edc2..f5a1cca6ba6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionFactory.createSessionWithDependencies +import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider import org.jetbrains.kotlin.modules.Module import org.jetbrains.kotlin.modules.TargetId @@ -88,15 +89,30 @@ object FirKotlinToJvmBytecodeCompiler { val sourceScope = GlobalSearchScope.filesWithoutLibrariesScope(project, ktFiles.map { it.virtualFile }) .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project)) - val librariesScope = ProjectScope.getLibrariesScope(project) + var librariesScope = ProjectScope.getLibrariesScope(project) val providerAndScopeForIncrementalCompilation = run { if (targetIds == null || incrementalComponents == null) return@run null + val fileSystem = environment.projectEnvironment.environment.localFileSystem + val directoryWithIncrementalPartsFromPreviousCompilation = + moduleConfiguration[JVMConfigurationKeys.OUTPUT_DIRECTORY] + ?: return@run null + val previouslyCompiledFiles = directoryWithIncrementalPartsFromPreviousCompilation.walk() + .filter { it.extension == "class" } + .mapNotNull { fileSystem.findFileByIoFile(it) } + .toList() + .takeIf { it.isNotEmpty() } + ?: return@run null val packagePartProvider = IncrementalPackagePartProvider( environment.createPackagePartProvider(sourceScope), targetIds.map(incrementalComponents::getIncrementalCache) ) - FirSessionFactory.ProviderAndScopeForIncrementalCompilation(packagePartProvider, librariesScope) + val incrementalCompilationScope = GlobalSearchScope.filesWithoutLibrariesScope( + project, + previouslyCompiledFiles + ) + librariesScope = librariesScope.intersectWith(GlobalSearchScope.notScope(incrementalCompilationScope)) + FirSessionFactory.ProviderAndScopeForIncrementalCompilation(packagePartProvider, incrementalCompilationScope) } val languageVersionSettings = moduleConfiguration.languageVersionSettings diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index 6a835a8229a..28f568791fd 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -164,9 +164,9 @@ object FirSessionFactory { this, listOfNotNull( firProvider.symbolProvider, + symbolProviderForBinariesFromIncrementalCompilation, JavaSymbolProvider(this, moduleData, project, scope), FirDependenciesSymbolProviderImpl(this), - symbolProviderForBinariesFromIncrementalCompilation, ) ) )