[IC] Support precise output backup for kapt stubs
#KT-49785 In Progress
This commit is contained in:
committed by
Space Team
parent
274c9b6294
commit
4c2923f96f
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.cli.common.output
|
package org.jetbrains.kotlin.cli.common.output
|
||||||
|
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFile
|
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection
|
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
@@ -25,11 +24,11 @@ import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
|
|
||||||
fun OutputFileCollection.writeAll(outputDir: File, report: ((file: OutputFile, sources: List<File>, output: File) -> Unit)?) {
|
fun OutputFileCollection.writeAll(outputDir: File, report: ((sources: List<File>, output: File) -> Unit)?) {
|
||||||
for (file in asList()) {
|
for (file in asList()) {
|
||||||
val sources = file.sourceFiles
|
val sources = file.sourceFiles
|
||||||
val output = File(outputDir, file.relativePath)
|
val output = File(outputDir, file.relativePath)
|
||||||
report?.invoke(file, sources, output)
|
report?.invoke(sources, output)
|
||||||
try {
|
try {
|
||||||
FileUtil.writeToFile(output, file.asByteArray())
|
FileUtil.writeToFile(output, file.asByteArray())
|
||||||
} catch (e: FileNotFoundException) {
|
} catch (e: FileNotFoundException) {
|
||||||
@@ -51,7 +50,7 @@ fun OutputFileCollection.writeAllTo(outputDir: File) {
|
|||||||
fun OutputFileCollection.writeAll(outputDir: File, messageCollector: MessageCollector, reportOutputFiles: Boolean) {
|
fun OutputFileCollection.writeAll(outputDir: File, messageCollector: MessageCollector, reportOutputFiles: Boolean) {
|
||||||
try {
|
try {
|
||||||
if (!reportOutputFiles) writeAllTo(outputDir)
|
if (!reportOutputFiles) writeAllTo(outputDir)
|
||||||
else writeAll(outputDir) { _, sources, output ->
|
else writeAll(outputDir) { sources, output ->
|
||||||
messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output))
|
messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output))
|
||||||
}
|
}
|
||||||
} catch (e: NoPermissionException) {
|
} catch (e: NoPermissionException) {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import com.sun.tools.javac.tree.Pretty
|
|||||||
import com.sun.tools.javac.tree.TreeMaker
|
import com.sun.tools.javac.tree.TreeMaker
|
||||||
import com.sun.tools.javac.util.Context
|
import com.sun.tools.javac.util.Context
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFile
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||||
import org.jetbrains.kotlin.base.kapt3.AptMode.APT_ONLY
|
import org.jetbrains.kotlin.base.kapt3.AptMode.APT_ONLY
|
||||||
import org.jetbrains.kotlin.base.kapt3.AptMode.WITH_COMPILATION
|
import org.jetbrains.kotlin.base.kapt3.AptMode.WITH_COMPILATION
|
||||||
@@ -52,7 +51,6 @@ import org.jetbrains.kotlin.kapt3.base.KaptContext
|
|||||||
import org.jetbrains.kotlin.kapt3.base.LoadedProcessors
|
import org.jetbrains.kotlin.kapt3.base.LoadedProcessors
|
||||||
import org.jetbrains.kotlin.kapt3.base.ProcessorLoader
|
import org.jetbrains.kotlin.kapt3.base.ProcessorLoader
|
||||||
import org.jetbrains.kotlin.kapt3.base.doAnnotationProcessing
|
import org.jetbrains.kotlin.kapt3.base.doAnnotationProcessing
|
||||||
import org.jetbrains.kotlin.kapt3.base.stubs.KaptStubLineInformation.Companion.KAPT_METADATA_EXTENSION
|
|
||||||
import org.jetbrains.kotlin.kapt3.base.util.KaptBaseError
|
import org.jetbrains.kotlin.kapt3.base.util.KaptBaseError
|
||||||
import org.jetbrains.kotlin.kapt3.base.util.getPackageNameJava9Aware
|
import org.jetbrains.kotlin.kapt3.base.util.getPackageNameJava9Aware
|
||||||
import org.jetbrains.kotlin.kapt3.base.util.info
|
import org.jetbrains.kotlin.kapt3.base.util.info
|
||||||
@@ -307,11 +305,20 @@ abstract class AbstractKapt3Extension(
|
|||||||
logger.info { "Java stub generation took $stubGenerationTime ms" }
|
logger.info { "Java stub generation took $stubGenerationTime ms" }
|
||||||
logger.info { "Stubs for Kotlin classes: " + kaptStubs.joinToString { it.file.sourcefile.name } }
|
logger.info { "Stubs for Kotlin classes: " + kaptStubs.joinToString { it.file.sourcefile.name } }
|
||||||
|
|
||||||
saveStubs(kaptContext, kaptStubs)
|
saveStubs(kaptContext, kaptStubs, logger.messageCollector)
|
||||||
saveIncrementalData(kaptContext, logger.messageCollector, converter)
|
saveIncrementalData(kaptContext, logger.messageCollector, converter)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun saveStubs(kaptContext: KaptContext, stubs: List<KaptStub>) {
|
protected open fun saveStubs(
|
||||||
|
kaptContext: KaptContextForStubGeneration,
|
||||||
|
stubs: List<KaptStub>,
|
||||||
|
messageCollector: MessageCollector,
|
||||||
|
) {
|
||||||
|
val reportOutputFiles = kaptContext.generationState.configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES)
|
||||||
|
val outputFiles = if (reportOutputFiles) kaptContext.generationState.factory.asList().associateBy {
|
||||||
|
it.relativePath.substringBeforeLast(".class", missingDelimiterValue = "")
|
||||||
|
} else null
|
||||||
|
|
||||||
for (kaptStub in stubs) {
|
for (kaptStub in stubs) {
|
||||||
val stub = kaptStub.file
|
val stub = kaptStub.file
|
||||||
val className = (stub.defs.first { it is JCTree.JCClassDecl } as JCTree.JCClassDecl).simpleName.toString()
|
val className = (stub.defs.first { it is JCTree.JCClassDecl } as JCTree.JCClassDecl).simpleName.toString()
|
||||||
@@ -322,9 +329,24 @@ abstract class AbstractKapt3Extension(
|
|||||||
packageDir.mkdirs()
|
packageDir.mkdirs()
|
||||||
|
|
||||||
val sourceFile = File(packageDir, "$className.java")
|
val sourceFile = File(packageDir, "$className.java")
|
||||||
|
val classFilePathWithoutExtension = if (packageName.isEmpty()) {
|
||||||
|
className
|
||||||
|
} else {
|
||||||
|
"${packageName.replace('.', '/')}/$className"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reportStubsOutputForIC(generatedFile: File) {
|
||||||
|
if (!reportOutputFiles) return
|
||||||
|
if (classFilePathWithoutExtension == "error/NonExistentClass") return
|
||||||
|
val sourceFiles = (outputFiles?.get(classFilePathWithoutExtension)
|
||||||
|
?: error("The `outputFiles` map is not properly initialized (key = $classFilePathWithoutExtension)")).sourceFiles
|
||||||
|
messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sourceFiles, generatedFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
reportStubsOutputForIC(sourceFile)
|
||||||
sourceFile.writeText(stub.prettyPrint(kaptContext.context))
|
sourceFile.writeText(stub.prettyPrint(kaptContext.context))
|
||||||
|
|
||||||
kaptStub.writeMetadataIfNeeded(forSource = sourceFile)
|
kaptStub.writeMetadataIfNeeded(forSource = sourceFile, ::reportStubsOutputForIC)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,19 +360,7 @@ abstract class AbstractKapt3Extension(
|
|||||||
val reportOutputFiles = kaptContext.generationState.configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES)
|
val reportOutputFiles = kaptContext.generationState.configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES)
|
||||||
kaptContext.generationState.factory.writeAll(
|
kaptContext.generationState.factory.writeAll(
|
||||||
incrementalDataOutputDir,
|
incrementalDataOutputDir,
|
||||||
if (!reportOutputFiles) null else fun(file: OutputFile, sources: List<File>, output: File) {
|
if (!reportOutputFiles) null else fun(sources: List<File>, output: File) {
|
||||||
val stubFileObject = converter.bindings[file.relativePath.substringBeforeLast(".class", missingDelimiterValue = "")]
|
|
||||||
if (stubFileObject != null) {
|
|
||||||
val stubFile = File(options.stubsOutputDir, stubFileObject.name)
|
|
||||||
val lineMappingsFile = File(stubFile.parentFile, stubFile.nameWithoutExtension + KAPT_METADATA_EXTENSION)
|
|
||||||
|
|
||||||
for (outputFile in listOf(stubFile, lineMappingsFile)) {
|
|
||||||
if (outputFile.exists()) {
|
|
||||||
messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, outputFile))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output))
|
messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-1
@@ -192,7 +192,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati
|
|||||||
}
|
}
|
||||||
|
|
||||||
class KaptStub(val file: JCCompilationUnit, private val kaptMetadata: ByteArray? = null) {
|
class KaptStub(val file: JCCompilationUnit, private val kaptMetadata: ByteArray? = null) {
|
||||||
fun writeMetadataIfNeeded(forSource: File) {
|
fun writeMetadataIfNeeded(forSource: File, report: ((File) -> Unit)? = null) {
|
||||||
if (kaptMetadata == null) {
|
if (kaptMetadata == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -202,6 +202,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati
|
|||||||
forSource.nameWithoutExtension + KaptStubLineInformation.KAPT_METADATA_EXTENSION
|
forSource.nameWithoutExtension + KaptStubLineInformation.KAPT_METADATA_EXTENSION
|
||||||
)
|
)
|
||||||
|
|
||||||
|
report?.invoke(metadataFile)
|
||||||
metadataFile.writeBytes(kaptMetadata)
|
metadataFile.writeBytes(kaptMetadata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -124,7 +124,11 @@ class Kapt3ExtensionForTests(
|
|||||||
Kapt3ExtensionForTests::class.java.classLoader
|
Kapt3ExtensionForTests::class.java.classLoader
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun saveStubs(kaptContext: KaptContext, stubs: List<ClassFileToSourceStubConverter.KaptStub>) {
|
override fun saveStubs(
|
||||||
|
kaptContext: KaptContextForStubGeneration,
|
||||||
|
stubs: List<ClassFileToSourceStubConverter.KaptStub>,
|
||||||
|
messageCollector: MessageCollector,
|
||||||
|
) {
|
||||||
if (this.savedStubs != null) {
|
if (this.savedStubs != null) {
|
||||||
error("Stubs are already saved")
|
error("Stubs are already saved")
|
||||||
}
|
}
|
||||||
@@ -134,7 +138,7 @@ class Kapt3ExtensionForTests(
|
|||||||
.sorted()
|
.sorted()
|
||||||
.joinToString(FILE_SEPARATOR)
|
.joinToString(FILE_SEPARATOR)
|
||||||
|
|
||||||
super.saveStubs(kaptContext, stubs)
|
super.saveStubs(kaptContext, stubs, messageCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun saveIncrementalData(
|
override fun saveIncrementalData(
|
||||||
|
|||||||
Reference in New Issue
Block a user