mirror of
https://github.com/github/codeql.git
synced 2026-05-22 07:07:09 +02:00
KE2: Add the top-level eror handling
This commit is contained in:
@@ -2,6 +2,7 @@ package com.github.codeql
|
||||
|
||||
import com.intellij.openapi.editor.Document
|
||||
import com.intellij.psi.PsiFile
|
||||
import java.io.File
|
||||
import java.nio.file.Paths
|
||||
import org.jetbrains.kotlin.analysis.api.KaAnalysisApiInternals
|
||||
import org.jetbrains.kotlin.analysis.api.KaSession
|
||||
@@ -18,8 +19,39 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
|
||||
@OptIn(KaAnalysisApiInternals::class)
|
||||
fun main(args : Array<String>) {
|
||||
try {
|
||||
runExtractor(args)
|
||||
// We catch Throwable rather than Exception, as we want to
|
||||
// log about the failure even if we get a stack overflow
|
||||
// or an assertion failure in one file.
|
||||
} catch (e: Throwable) {
|
||||
// If we get an exception at the top level, then something's
|
||||
// gone very wrong. Don't try to be too fancy, but try to
|
||||
// log a simple message.
|
||||
val msg = "[ERROR] CodeQL Kotlin extractor: Top-level exception."
|
||||
// First, if we can find our log directory, then let's try
|
||||
// making a log file there:
|
||||
val extractorLogDir = System.getenv("CODEQL_EXTRACTOR_JAVA_LOG_DIR")
|
||||
if (extractorLogDir != null && extractorLogDir != "") {
|
||||
// We use a slightly different filename pattern compared
|
||||
// to normal logs. Just the existence of a `-top` log is
|
||||
// a sign that something's gone very wrong.
|
||||
val logFile = File.createTempFile("kotlin-extractor-top.", ".log", File(extractorLogDir))
|
||||
logFile.writeText(msg)
|
||||
// Now we've got that out, let's see if we can append a stack trace too
|
||||
logFile.appendText(e.stackTraceToString())
|
||||
} else {
|
||||
// We don't have much choice here except to print to
|
||||
// stderr and hope for the best.
|
||||
System.err.println(msg)
|
||||
e.printStackTrace(System.err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(KaAnalysisApiInternals::class)
|
||||
fun runExtractor(args : Array<String>) {
|
||||
lateinit var sourceModule: KaSourceModule
|
||||
val k2args : K2JVMCompilerArguments = parseCommandLineArguments(args.toList())
|
||||
|
||||
|
||||
@@ -60,45 +60,6 @@ class KotlinExtractorExtension(
|
||||
private val exitAfterExtraction: Boolean
|
||||
) : IrGenerationExtension {
|
||||
|
||||
// This is the main entry point to the extractor.
|
||||
// It will be called by kotlinc with the IR for the files being
|
||||
// compiled in `moduleFragment`, and `pluginContext` providing
|
||||
// various utility functions.
|
||||
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
|
||||
try {
|
||||
runExtractor(moduleFragment, pluginContext)
|
||||
// We catch Throwable rather than Exception, as we want to
|
||||
// continue trying to extract everything else even if we get a
|
||||
// stack overflow or an assertion failure in one file.
|
||||
} catch (e: Throwable) {
|
||||
// If we get an exception at the top level, then something's
|
||||
// gone very wrong. Don't try to be too fancy, but try to
|
||||
// log a simple message.
|
||||
val msg = "[ERROR] CodeQL Kotlin extractor: Top-level exception."
|
||||
// First, if we can find our log directory, then let's try
|
||||
// making a log file there:
|
||||
val extractorLogDir = System.getenv("CODEQL_EXTRACTOR_JAVA_LOG_DIR")
|
||||
if (extractorLogDir != null && extractorLogDir != "") {
|
||||
// We use a slightly different filename pattern compared
|
||||
// to normal logs. Just the existence of a `-top` log is
|
||||
// a sign that something's gone very wrong.
|
||||
val logFile =
|
||||
File.createTempFile("kotlin-extractor-top.", ".log", File(extractorLogDir))
|
||||
logFile.writeText(msg)
|
||||
// Now we've got that out, let's see if we can append a stack trace too
|
||||
logFile.appendText(e.stackTraceToString())
|
||||
} else {
|
||||
// We don't have much choice here except to print to
|
||||
// stderr and hope for the best.
|
||||
System.err.println(msg)
|
||||
e.printStackTrace(System.err)
|
||||
}
|
||||
}
|
||||
if (exitAfterExtraction) {
|
||||
exitProcess(0)
|
||||
}
|
||||
}
|
||||
|
||||
private fun runExtractor(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
|
||||
val startTimeMs = System.currentTimeMillis()
|
||||
val usesK2 = usesK2(pluginContext)
|
||||
|
||||
Reference in New Issue
Block a user