1+ package com.github.codeql
2+
3+ import com.semmle.extractor.java.OdasaOutput
4+ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
5+ import org.jetbrains.kotlin.ir.declarations.IrClass
6+ import java.io.File
7+ import java.util.ArrayList
8+ import java.util.HashSet
9+ import java.util.zip.GZIPOutputStream
10+
11+ class ExternalClassExtractor (val logger : FileLogger , val sourceFilePath : String , val pluginContext : IrPluginContext ) {
12+
13+ val externalClassesDone = HashSet <IrClass >()
14+ val externalClassWorkList = ArrayList <IrClass >()
15+
16+ fun extractLater (c : IrClass ): Boolean {
17+ val ret = externalClassesDone.add(c)
18+ if (ret) externalClassWorkList.add(c)
19+ return ret
20+ }
21+
22+ fun extractExternalClasses () {
23+ val output = OdasaOutput (false , logger)
24+ output.setCurrentSourceFile(File (sourceFilePath))
25+ do {
26+ val nextBatch = ArrayList (externalClassWorkList)
27+ externalClassWorkList.clear()
28+ nextBatch.forEach { irClass ->
29+ output.getTrapLockerForClassFile(irClass).useAC { locker ->
30+ locker.getTrapFileManager().useAC { manager ->
31+ if (manager == null ) {
32+ logger.info(" Skipping extracting class ${irClass.name} " )
33+ } else {
34+ GZIPOutputStream (manager.getFile().outputStream()).bufferedWriter().use { trapFileBW ->
35+ val tw =
36+ ClassFileTrapWriter (TrapLabelManager (), trapFileBW, getIrClassBinaryPath(irClass))
37+ val fileExtractor = KotlinFileExtractor (logger, tw, manager, this , pluginContext)
38+ fileExtractor.extractClassSource(irClass)
39+ }
40+ }
41+ }
42+ }
43+ }
44+ } while (externalClassWorkList.isNotEmpty())
45+ output.writeTrapSet()
46+ }
47+
48+ }
0 commit comments