From b141d6b9360c344b34f232891001802706413cc0 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 8 Jun 2021 13:31:17 +0700 Subject: [PATCH] [CHERRY PICKED FROM IJ] [kotlin] compiler index: implement jps part ^KTIJ-16709 GitOrigin-RevId: f68ff2ef8c1d287c0d3ab0ca92ba0d316bda4c5a Original commit: https://github.com/JetBrains/intellij-community/commit/cb138014488d97c7243d1be6ac3a27593ceef7a2 --- .../kotlin/jps/build/KotlinBuilderService.kt | 3 +- .../KotlinCompilerReferenceIndexBuilder.kt | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinCompilerReferenceIndexBuilder.kt diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderService.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderService.kt index 1af1159709d..4ac6d7207cf 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderService.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderService.kt @@ -18,7 +18,8 @@ package org.jetbrains.kotlin.jps.build import org.jetbrains.jps.incremental.BuilderService import org.jetbrains.jps.incremental.ModuleLevelBuilder +import org.jetbrains.kotlin.jps.incremental.KotlinCompilerReferenceIndexBuilder class KotlinBuilderService : BuilderService() { - override fun createModuleLevelBuilders(): List = listOf(KotlinBuilder()) + override fun createModuleLevelBuilders(): List = listOf(KotlinBuilder(), KotlinCompilerReferenceIndexBuilder()) } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinCompilerReferenceIndexBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinCompilerReferenceIndexBuilder.kt new file mode 100644 index 00000000000..fc37d2d93dd --- /dev/null +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinCompilerReferenceIndexBuilder.kt @@ -0,0 +1,58 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.jps.incremental + +import com.intellij.util.containers.ContainerUtil +import org.jetbrains.jps.ModuleChunk +import org.jetbrains.jps.builders.BuildTargetRegistry +import org.jetbrains.jps.builders.DirtyFilesHolder +import org.jetbrains.jps.builders.JpsBuildBundle +import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor +import org.jetbrains.jps.incremental.BuilderCategory +import org.jetbrains.jps.incremental.CompileContext +import org.jetbrains.jps.incremental.ModuleBuildTarget +import org.jetbrains.jps.incremental.ModuleLevelBuilder +import org.jetbrains.jps.incremental.messages.CustomBuilderMessage + +/** + * Based on [org.jetbrains.jps.backwardRefs.JavaBackwardReferenceIndexBuilder] + */ +class KotlinCompilerReferenceIndexBuilder : ModuleLevelBuilder(BuilderCategory.CLASS_POST_PROCESSOR) { + private val compiledTargets = ContainerUtil.newConcurrentSet() + + override fun getPresentableName(): String = JpsBuildBundle.message("builder.name.backward.references.indexer") + + override fun build( + context: CompileContext, + chunk: ModuleChunk, + dirtyFilesHolder: DirtyFilesHolder, + outputConsumer: OutputConsumer, + ): ExitCode = ExitCode.OK.also { + chunk.targets.mapNotNullTo(compiledTargets) { buildTarget -> + buildTarget.takeIf { context.scope.isWholeTargetAffected(it) } + } + } + + override fun buildFinished(context: CompileContext) { + val targetIndex = context.projectDescriptor.buildTargetIndex + for (module in context.projectDescriptor.project.modules) { + val allAreDummyOrCompiled = targetIndex.getModuleBasedTargets(module, BuildTargetRegistry.ModuleTargetSelector.ALL) + .none { target -> target is ModuleBuildTarget && target !in compiledTargets && !targetIndex.isDummy(target) } + + if (allAreDummyOrCompiled) { + context.processMessage( + CustomBuilderMessage(BUILDER_ID, MESSAGE_TYPE, module.name) + ) + } + } + + compiledTargets.clear() + } + + override fun getCompilableFileExtensions(): List = emptyList() + + companion object { + private const val MESSAGE_TYPE = "processed module" + const val BUILDER_ID = "kotlin.compiler.ref.index" + } +} \ No newline at end of file