diff --git a/java/kotlin-extractor2/src/main/kotlin/KotlinExtractor.kt b/java/kotlin-extractor2/src/main/kotlin/KotlinExtractor.kt index 177bdeb2ca2..cedec0203c8 100644 --- a/java/kotlin-extractor2/src/main/kotlin/KotlinExtractor.kt +++ b/java/kotlin-extractor2/src/main/kotlin/KotlinExtractor.kt @@ -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) { + 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) { lateinit var sourceModule: KaSourceModule val k2args : K2JVMCompilerArguments = parseCommandLineArguments(args.toList()) diff --git a/java/kotlin-extractor2/src/main/kotlin/KotlinExtractorExtension.kt b/java/kotlin-extractor2/src/main/kotlin/KotlinExtractorExtension.kt index 63631a47445..47f8b202b0d 100644 --- a/java/kotlin-extractor2/src/main/kotlin/KotlinExtractorExtension.kt +++ b/java/kotlin-extractor2/src/main/kotlin/KotlinExtractorExtension.kt @@ -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)