JPS: provide SourcesPreprocessor extension point

This commit is contained in:
Sergey Rostov
2020-04-10 17:16:33 +03:00
parent b6cf08d097
commit fd9bec81cf
@@ -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<File>): List<File>
}
fun preprocessSources(srcFiles: List<File>): List<File> {
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))