@@ -2,6 +2,8 @@ package com.github.codeql
22
33import java.io.BufferedWriter
44import java.io.File
5+ import java.io.PrintWriter
6+ import java.io.StringWriter
57import java.nio.file.Files
68import java.nio.file.Paths
79import java.text.SimpleDateFormat
@@ -18,19 +20,8 @@ import org.jetbrains.kotlin.ir.util.render
1820import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
1921import org.jetbrains.kotlin.ir.IrFileEntry
2022import org.jetbrains.kotlin.ir.types.*
21- import org.jetbrains.kotlin.ir.expressions.IrBody
22- import org.jetbrains.kotlin.ir.expressions.IrBlockBody
23- import org.jetbrains.kotlin.ir.expressions.IrReturn
24- import org.jetbrains.kotlin.ir.expressions.IrExpression
25- import org.jetbrains.kotlin.ir.expressions.IrCall
26- import org.jetbrains.kotlin.ir.expressions.IrGetValue
27- import org.jetbrains.kotlin.ir.expressions.IrConst
23+ import org.jetbrains.kotlin.ir.expressions.*
2824import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.*
29- import org.jetbrains.kotlin.ir.expressions.IrWhen
30- import org.jetbrains.kotlin.ir.expressions.IrElseBranch
31- import org.jetbrains.kotlin.ir.expressions.IrWhileLoop
32- import org.jetbrains.kotlin.ir.expressions.IrBlock
33- import org.jetbrains.kotlin.ir.expressions.IrDoWhileLoop
3425import org.jetbrains.kotlin.ir.IrStatement
3526import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
3627
@@ -136,6 +127,18 @@ class TrapWriter (
136127 return maybeId
137128 }
138129 }
130+ val variableLabelMapping: MutableMap <IrVariable , Label <out DbLocalvar >> = mutableMapOf<IrVariable , Label <out DbLocalvar >>()
131+ fun <T > getVariableLabelFor (v : IrVariable ): Label <out DbLocalvar > {
132+ val maybeId = variableLabelMapping.get(v)
133+ if (maybeId == null ) {
134+ val id = getFreshLabel<DbLocalvar >()
135+ variableLabelMapping.put(v, id)
136+ writeTrap(" $id = *\n " )
137+ return id
138+ } else {
139+ return maybeId
140+ }
141+ }
139142 fun <T > getFreshLabel (): Label <T > {
140143 return Label (nextId++ )
141144 }
@@ -172,6 +175,13 @@ fun extractFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile
172175 }
173176}
174177
178+ fun <T > fakeLabel (): Label <T > {
179+ val sw = StringWriter ()
180+ Exception ().printStackTrace(PrintWriter (sw))
181+ println (" Fake label from:\n $sw " )
182+ return Label (0 )
183+ }
184+
175185class KotlinFileExtractor (val logger : Logger , val tw : TrapWriter ) {
176186 fun usePackage (pkg : String ): Label <out DbPackage > {
177187 return extractPackage(pkg)
@@ -208,7 +218,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
208218 s.isLong() -> return primitiveType(" long" )
209219 s.isUByte() || s.isUShort() || s.isUInt() || s.isULong() -> {
210220 logger.warn(" Unhandled unsigned type" )
211- return Label ( 0 )
221+ return fakeLabel( )
212222 }
213223
214224 s.isDouble() -> return primitiveType(" double" )
@@ -225,7 +235,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
225235 }
226236 else -> {
227237 logger.warn(" Unrecognised IrSimpleType: " + s.javaClass + " : " + s.render())
228- return Label ( 0 )
238+ return fakeLabel( )
229239 }
230240 }
231241 }
@@ -271,7 +281,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
271281 is IrClass -> return useClass(t)
272282 else -> {
273283 logger.warn(" Unrecognised IrType: " + t.javaClass)
274- return Label ( 0 )
284+ return fakeLabel( )
275285 }
276286 }
277287 }
@@ -283,7 +293,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
283293 is IrFunction -> return useFunction(dp)
284294 else -> {
285295 logger.warn(" Unrecognised IrDeclarationParent: " + dp.javaClass)
286- return Label ( 0 )
296+ return fakeLabel( )
287297 }
288298 }
289299 }
@@ -368,8 +378,12 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
368378 }
369379 }
370380
381+ fun useVariable (v : IrVariable ): Label <out DbLocalvar > {
382+ return tw.getVariableLabelFor<DbLocalvar >(v)
383+ }
384+
371385 fun extractVariable (v : IrVariable , callable : Label <out DbCallable >) {
372- val id = tw.getFreshIdLabel< DbLocalvar >( )
386+ val id = useVariable(v )
373387 val locId = tw.getLocation(v.startOffset, v.endOffset)
374388 val typeId = useType(v.type)
375389 val decId = tw.getFreshIdLabel<DbLocalvariabledeclexpr >()
@@ -402,9 +416,12 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
402416 is IrValueParameter -> {
403417 return useValueParameter(d)
404418 }
419+ is IrVariable -> {
420+ return useVariable(d)
421+ }
405422 else -> {
406423 logger.warn(" Unrecognised IrValueDeclaration: " + d.javaClass)
407- return Label ( 0 )
424+ return fakeLabel( )
408425 }
409426 }
410427 }
@@ -552,6 +569,22 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
552569 val vId = useValueDeclaration(e.symbol.owner)
553570 tw.writeVariableBinding(id, vId)
554571 }
572+ is IrSetValue -> {
573+ val id = tw.getFreshIdLabel<DbAssignexpr >()
574+ val typeId = useType(e.type)
575+ val locId = tw.getLocation(e.startOffset, e.endOffset)
576+ tw.writeExprs_assignexpr(id, typeId, parent, idx)
577+ tw.writeHasLocation(id, locId)
578+
579+ val lhsId = tw.getFreshIdLabel<DbVaraccess >()
580+ val lhsTypeId = useType(e.symbol.owner.type)
581+ tw.writeExprs_varaccess(lhsId, lhsTypeId, id, 0 )
582+ tw.writeHasLocation(id, locId)
583+ val vId = useValueDeclaration(e.symbol.owner)
584+ tw.writeVariableBinding(lhsId, vId)
585+
586+ extractExpression(e.value, callable, id, 1 )
587+ }
555588 is IrReturn -> {
556589 val id = tw.getFreshIdLabel<DbReturnstmt >()
557590 val locId = tw.getLocation(e.startOffset, e.endOffset)
0 commit comments