[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
This commit is contained in:
Dmitry Gridin
2021-06-08 13:31:17 +07:00
committed by Nikita Bobko
parent 988d65c82f
commit b141d6b936
2 changed files with 60 additions and 1 deletions
@@ -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<ModuleLevelBuilder> = listOf(KotlinBuilder())
override fun createModuleLevelBuilders(): List<ModuleLevelBuilder> = listOf(KotlinBuilder(), KotlinCompilerReferenceIndexBuilder())
}
@@ -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<ModuleBuildTarget>()
override fun getPresentableName(): String = JpsBuildBundle.message("builder.name.backward.references.indexer")
override fun build(
context: CompileContext,
chunk: ModuleChunk,
dirtyFilesHolder: DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget>,
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<String> = emptyList()
companion object {
private const val MESSAGE_TYPE = "processed module"
const val BUILDER_ID = "kotlin.compiler.ref.index"
}
}