Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e7cabfb

Browse files
committed
Kotlin: Add assign exprs
1 parent a64fedf commit e7cabfb

2 files changed

Lines changed: 63 additions & 18 deletions

File tree

java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.github.codeql
22

33
import java.io.BufferedWriter
44
import java.io.File
5+
import java.io.PrintWriter
6+
import java.io.StringWriter
57
import java.nio.file.Files
68
import java.nio.file.Paths
79
import java.text.SimpleDateFormat
@@ -18,19 +20,8 @@ import org.jetbrains.kotlin.ir.util.render
1820
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
1921
import org.jetbrains.kotlin.ir.IrFileEntry
2022
import 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.*
2824
import 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
3425
import org.jetbrains.kotlin.ir.IrStatement
3526
import 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+
175185
class 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)

java/ql/test/kotlin/library-tests/stmts/exprs.expected

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
| file://:0:0:0:0 | q2 |
22
| file://:0:0:0:0 | q3 |
33
| file://:0:0:0:0 | z |
4+
| file://:0:0:0:0 | z |
5+
| file://:0:0:0:0 | z |
6+
| file://:0:0:0:0 | z |
7+
| file://:0:0:0:0 | z |
48
| stmts.kt:3:5:6:5 | when ... |
59
| stmts.kt:3:8:3:8 | x |
610
| stmts.kt:3:8:3:12 | ... > ... |
@@ -24,9 +28,17 @@
2428
| stmts.kt:17:26:17:58 | true |
2529
| stmts.kt:17:26:17:58 | when ... |
2630
| stmts.kt:17:29:17:32 | true |
31+
| stmts.kt:17:37:17:37 | ...=... |
32+
| stmts.kt:17:41:17:41 | 4 |
33+
| stmts.kt:17:52:17:52 | ...=... |
34+
| stmts.kt:17:56:17:56 | 5 |
2735
| stmts.kt:18:26:18:56 | true |
2836
| stmts.kt:18:26:18:56 | when ... |
2937
| stmts.kt:18:29:18:32 | true |
38+
| stmts.kt:18:37:18:37 | ...=... |
39+
| stmts.kt:18:41:18:41 | 4 |
40+
| stmts.kt:18:52:18:52 | ...=... |
41+
| stmts.kt:18:56:18:56 | 5 |
3042
| stmts.kt:19:12:19:12 | x |
3143
| stmts.kt:19:12:19:16 | ... + ... |
3244
| stmts.kt:19:16:19:16 | y |

0 commit comments

Comments
 (0)