mirror of
https://github.com/github/codeql.git
synced 2025-12-21 19:26:31 +01:00
Kotlin: Start using invocation TRAP files
This commit is contained in:
@@ -11,11 +11,11 @@ class KotlinExtractorCommandLineProcessor : CommandLineProcessor {
|
||||
|
||||
override val pluginOptions = listOf(
|
||||
CliOption(
|
||||
optionName = "testOption",
|
||||
valueDescription = "A test option",
|
||||
description = "For testing options",
|
||||
required = false,
|
||||
allowMultipleOccurrences = true
|
||||
optionName = OPTION_INVOCATION_TRAP_FILE,
|
||||
valueDescription = "Invocation TRAP file",
|
||||
description = "Extractor will append invocation-related TRAP to this file",
|
||||
required = true,
|
||||
allowMultipleOccurrences = false
|
||||
)
|
||||
)
|
||||
|
||||
@@ -24,9 +24,10 @@ class KotlinExtractorCommandLineProcessor : CommandLineProcessor {
|
||||
value: String,
|
||||
configuration: CompilerConfiguration
|
||||
) = when (option.optionName) {
|
||||
"testOption" -> configuration.appendList(KEY_TEST, value)
|
||||
"invocationTrapFile" -> configuration.put(KEY_INVOCATION_TRAP_FILE, value)
|
||||
else -> error("kotlin extractor: Bad option: ${option.optionName}")
|
||||
}
|
||||
}
|
||||
|
||||
val KEY_TEST = CompilerConfigurationKey<List<String>>("kotlin extractor test")
|
||||
private val OPTION_INVOCATION_TRAP_FILE = "invocationTrapFile"
|
||||
val KEY_INVOCATION_TRAP_FILE = CompilerConfigurationKey<String>(OPTION_INVOCATION_TRAP_FILE)
|
||||
|
||||
@@ -10,7 +10,10 @@ class KotlinExtractorComponentRegistrar : ComponentRegistrar {
|
||||
project: MockProject,
|
||||
configuration: CompilerConfiguration
|
||||
) {
|
||||
val tests = configuration[KEY_TEST] ?: emptyList()
|
||||
IrGenerationExtension.registerExtension(project, KotlinExtractorExtension(tests))
|
||||
val invocationTrapFile = configuration[KEY_INVOCATION_TRAP_FILE]
|
||||
if(invocationTrapFile == null) {
|
||||
throw Exception("Required argument for TRAP invocation file not given")
|
||||
}
|
||||
IrGenerationExtension.registerExtension(project, KotlinExtractorExtension(invocationTrapFile))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.github.codeql
|
||||
|
||||
import java.io.BufferedWriter
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.PrintWriter
|
||||
import java.io.StringWriter
|
||||
import java.nio.file.Files
|
||||
@@ -27,13 +28,13 @@ import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
|
||||
class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationExtension {
|
||||
class KotlinExtractorExtension(private val invocationTrapFile: String) : IrGenerationExtension {
|
||||
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
|
||||
// This default should be kept in sync with language-packs/java/tools/kotlin-extractor
|
||||
val trapDir = File(System.getenv("CODEQL_EXTRACTOR_JAVA_TRAP_DIR").takeUnless { it.isNullOrEmpty() } ?: "kotlin-extractor/trap")
|
||||
val invocationTrapDir = File("$trapDir/invocations")
|
||||
invocationTrapDir.mkdirs()
|
||||
val invocationTrapFile = File.createTempFile("kotlin.", ".trap", invocationTrapDir);
|
||||
invocationTrapFile.bufferedWriter().use { invocationTrapFileBW ->
|
||||
FileOutputStream(File(invocationTrapFile), true).bufferedWriter().use { invocationTrapFileBW ->
|
||||
invocationTrapFileBW.write("compilation_started(#compilation)\n")
|
||||
invocationTrapFileBW.flush()
|
||||
val logger = Logger(invocationTrapFileBW)
|
||||
logger.info("Extraction started")
|
||||
logger.flush()
|
||||
@@ -45,6 +46,8 @@ class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationEx
|
||||
// files etc, so we just exit when we are finished extracting.
|
||||
logger.info("Extraction completed")
|
||||
logger.flush()
|
||||
invocationTrapFileBW.write("compilation_finished(#compilation, 0.0, 0.0)\n")
|
||||
invocationTrapFileBW.flush()
|
||||
}
|
||||
exitProcess(0)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user