diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/output/outputUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/output/outputUtils.kt index 495d156d9a7..231dd7b8423 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/output/outputUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/output/outputUtils.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.cli.common.output 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.cli.common.messages.CompilerMessageSeverity 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.FileNotFoundException -fun OutputFileCollection.writeAll(outputDir: File, report: ((file: OutputFile, sources: List, output: File) -> Unit)?) { +fun OutputFileCollection.writeAll(outputDir: File, report: ((sources: List, output: File) -> Unit)?) { for (file in asList()) { val sources = file.sourceFiles val output = File(outputDir, file.relativePath) - report?.invoke(file, sources, output) + report?.invoke(sources, output) try { FileUtil.writeToFile(output, file.asByteArray()) } catch (e: FileNotFoundException) { @@ -51,7 +50,7 @@ fun OutputFileCollection.writeAllTo(outputDir: File) { fun OutputFileCollection.writeAll(outputDir: File, messageCollector: MessageCollector, reportOutputFiles: Boolean) { try { if (!reportOutputFiles) writeAllTo(outputDir) - else writeAll(outputDir) { _, sources, output -> + else writeAll(outputDir) { sources, output -> messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output)) } } catch (e: NoPermissionException) { diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt index 0471fe1b940..3f2e6e2bc3b 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt @@ -23,7 +23,6 @@ import com.sun.tools.javac.tree.Pretty import com.sun.tools.javac.tree.TreeMaker import com.sun.tools.javac.util.Context 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.base.kapt3.AptMode.APT_ONLY 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.ProcessorLoader 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.getPackageNameJava9Aware 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 { "Stubs for Kotlin classes: " + kaptStubs.joinToString { it.file.sourcefile.name } } - saveStubs(kaptContext, kaptStubs) + saveStubs(kaptContext, kaptStubs, logger.messageCollector) saveIncrementalData(kaptContext, logger.messageCollector, converter) } - protected open fun saveStubs(kaptContext: KaptContext, stubs: List) { + protected open fun saveStubs( + kaptContext: KaptContextForStubGeneration, + stubs: List, + 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) { val stub = kaptStub.file val className = (stub.defs.first { it is JCTree.JCClassDecl } as JCTree.JCClassDecl).simpleName.toString() @@ -322,9 +329,24 @@ abstract class AbstractKapt3Extension( packageDir.mkdirs() 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)) - 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) kaptContext.generationState.factory.writeAll( incrementalDataOutputDir, - if (!reportOutputFiles) null else fun(file: OutputFile, sources: List, 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)) - } - } - } - + if (!reportOutputFiles) null else fun(sources: List, output: File) { messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output)) } ) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 6bc5314be96..00284a27225 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -192,7 +192,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati } 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) { return } @@ -202,6 +202,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati forSource.nameWithoutExtension + KaptStubLineInformation.KAPT_METADATA_EXTENSION ) + report?.invoke(metadataFile) metadataFile.writeBytes(kaptMetadata) } } diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/integration/Kapt3ExtensionProvider.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/integration/Kapt3ExtensionProvider.kt index 75657321c83..3979046206a 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/integration/Kapt3ExtensionProvider.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/integration/Kapt3ExtensionProvider.kt @@ -124,7 +124,11 @@ class Kapt3ExtensionForTests( Kapt3ExtensionForTests::class.java.classLoader ) - override fun saveStubs(kaptContext: KaptContext, stubs: List) { + override fun saveStubs( + kaptContext: KaptContextForStubGeneration, + stubs: List, + messageCollector: MessageCollector, + ) { if (this.savedStubs != null) { error("Stubs are already saved") } @@ -134,7 +138,7 @@ class Kapt3ExtensionForTests( .sorted() .joinToString(FILE_SEPARATOR) - super.saveStubs(kaptContext, stubs) + super.saveStubs(kaptContext, stubs, messageCollector) } override fun saveIncrementalData(