diff --git a/java/kotlin-extractor/src/main/kotlin/ExternalClassExtractor.kt b/java/kotlin-extractor/src/main/kotlin/ExternalClassExtractor.kt index ad50f8949b4..40a4297839f 100644 --- a/java/kotlin-extractor/src/main/kotlin/ExternalClassExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/ExternalClassExtractor.kt @@ -9,7 +9,7 @@ import java.util.ArrayList import java.util.HashSet import java.util.zip.GZIPOutputStream -class ExternalClassExtractor(val logger: FileLogger, val sourceFilePath: String, val primitiveTypeMapping: PrimitiveTypeMapping, val pluginContext: IrPluginContext) { +class ExternalClassExtractor(val logger: FileLogger, val invocationTrapFile: String, val sourceFilePath: String, val primitiveTypeMapping: PrimitiveTypeMapping, val pluginContext: IrPluginContext) { val externalClassesDone = HashSet() val externalClassWorkList = ArrayList() @@ -33,10 +33,17 @@ class ExternalClassExtractor(val logger: FileLogger, val sourceFilePath: String, logger.info("Skipping extracting class ${irClass.name}") } else { GZIPOutputStream(manager.getFile().outputStream()).bufferedWriter().use { trapFileBW -> + // We want our comments to be the first thing in the file, + // so start off with a mere TrapWriter + val tw = TrapWriter(TrapLabelManager(), trapFileBW) + tw.writeComment("Generated by the CodeQL Kotlin extractor for external dependencies") + tw.writeComment("Part of invocation $invocationTrapFile") + // Now elevate to a SourceFileTrapWriter, and populate the + // file information val binaryPath = getIrClassBinaryPath(irClass) - val tw = - FileTrapWriter(TrapLabelManager(), trapFileBW, binaryPath, true) - val fileExtractor = KotlinFileExtractor(logger, tw, manager, this, primitiveTypeMapping, pluginContext) + val ftw = tw.makeFileTrapWriter(binaryPath, true) + + val fileExtractor = KotlinFileExtractor(logger, ftw, manager, this, primitiveTypeMapping, pluginContext) fileExtractor.extractClassSource(irClass) } } diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt index beee3852829..a26aaac0e08 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt @@ -112,11 +112,17 @@ fun doFile(invocationTrapFile: String, if (checkTrapIdentical || !trapFile.exists()) { val trapTmpFile = File.createTempFile("$filePath.", ".trap.tmp", trapFileDir) trapTmpFile.bufferedWriter().use { trapFileBW -> - val tw = SourceFileTrapWriter(TrapLabelManager(), trapFileBW, file, true) - tw.writeComment("Generated by invocation $invocationTrapFile") - val externalClassExtractor = ExternalClassExtractor(logger, file.path, primitiveTypeMapping, pluginContext) - val fileExtractor = KotlinSourceFileExtractor(logger, tw, file, externalClassExtractor, primitiveTypeMapping, pluginContext) - fileExtractor.extractFileContents(tw.fileId) + // We want our comments to be the first thing in the file, + // so start off with a mere TrapWriter + val tw = TrapWriter(TrapLabelManager(), trapFileBW) + tw.writeComment("Generated by the CodeQL Kotlin extractor for kotlin source code") + tw.writeComment("Part of invocation $invocationTrapFile") + // Now elevate to a SourceFileTrapWriter, and populate the + // file information + val sftw = tw.makeSourceFileTrapWriter(file, true) + val externalClassExtractor = ExternalClassExtractor(logger, invocationTrapFile, file.path, primitiveTypeMapping, pluginContext) + val fileExtractor = KotlinSourceFileExtractor(logger, sftw, file, externalClassExtractor, primitiveTypeMapping, pluginContext) + fileExtractor.extractFileContents(sftw.fileId) externalClassExtractor.extractExternalClasses() } if (checkTrapIdentical && trapFile.exists()) { diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt index b8fa341fe52..c3059453dad 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt @@ -73,7 +73,7 @@ open class KotlinUsesExtractor( val clsFile = cls.fileOrNull if (isExternalDeclaration(cls) || clsFile == null) { - val newTrapWriter = tw.makeFileTrapWriter(getIrClassBinaryPath(cls)) + val newTrapWriter = tw.makeFileTrapWriter(getIrClassBinaryPath(cls), false) val newLogger = FileLogger(logger.logCounter, newTrapWriter) return KotlinFileExtractor(newLogger, newTrapWriter, dependencyCollector, externalClassExtractor, primitiveTypeMapping, pluginContext) } diff --git a/java/kotlin-extractor/src/main/kotlin/TrapWriter.kt b/java/kotlin-extractor/src/main/kotlin/TrapWriter.kt index 279223704b3..4dab36df8f3 100644 --- a/java/kotlin-extractor/src/main/kotlin/TrapWriter.kt +++ b/java/kotlin-extractor/src/main/kotlin/TrapWriter.kt @@ -159,8 +159,8 @@ open class TrapWriter (protected val lm: TrapLabelManager, private val bw: Buffe * Gets a FileTrapWriter like this one (using the same label manager, * writer etc), but using the given `filePath` for locations. */ - fun makeFileTrapWriter(filePath: String) = - FileTrapWriter(lm, bw, filePath, false) + fun makeFileTrapWriter(filePath: String, populateFileTables: Boolean) = + FileTrapWriter(lm, bw, filePath, populateFileTables) /** * Gets a FileTrapWriter like this one (using the same label manager,