diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt index 3f66e44ab4c..f8faf7a0149 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinJvmModuleBuildTarget.kt @@ -17,6 +17,7 @@ import org.jetbrains.jps.builders.storage.BuildDataPaths import org.jetbrains.jps.incremental.* import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.module.JpsSdkDependency +import org.jetbrains.jps.service.JpsServiceManager import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.build.GeneratedJvmClass import org.jetbrains.kotlin.build.JvmBuildMetaInfo @@ -186,13 +187,16 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB } val kotlinModuleId = target.targetId + val allFiles = sources.allFiles + val commonSourceFiles = sources.crossCompiledFiles + builder.addModule( kotlinModuleId.name, outputDir.absolutePath, - sources.allFiles, + preprocessSources(allFiles), target.findSourceRoots(dirtyFilesHolder.context), target.findClassPathRoots(), - sources.crossCompiledFiles, + preprocessSources(commonSourceFiles), target.findModularJdkRoot(), kotlinModuleId.type, isTests, @@ -209,6 +213,28 @@ class KotlinJvmModuleBuildTarget(kotlinContext: KotlinCompileContext, jpsModuleB return scriptFile } + /** + * Internal API for source level code preprocessors. + * + * Currently used in https://plugins.jetbrains.com/plugin/13355-spot-profiler-for-java + */ + interface SourcesPreprocessor { + /** + * Preprocess some sources and return path to the resulting file. + * This function should be pure and should return the same output for given input + * (required for incremental compilation). + */ + fun preprocessSources(srcFiles: List): List + } + + fun preprocessSources(srcFiles: List): List { + var result = srcFiles + JpsServiceManager.getInstance().getExtensions(SourcesPreprocessor::class.java).forEach { + result = it.preprocessSources(result) + } + return result + } + private fun createTempFileForChunkModuleDesc(): File { val readableSuffix = buildString { append(StringUtil.sanitizeJavaIdentifier(chunk.representativeTarget.module.name))