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

Skip to content

Commit b4bc406

Browse files
committed
Kotlin: More expressions
1 parent 14a46b0 commit b4bc406

3 files changed

Lines changed: 75 additions & 37 deletions

File tree

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

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -361,37 +361,57 @@ class KotlinFileExtractor(val tw: TrapWriter) {
361361
}
362362
}
363363

364+
fun extractCall(c: IrCall, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int) {
365+
val exprId: Label<out DbExpr> = when {
366+
c.origin == PLUS -> {
367+
val id = tw.getFreshIdLabel<DbAddexpr>()
368+
val typeId = useType(c.type)
369+
val locId = tw.getLocation(c.startOffset, c.endOffset)
370+
tw.writeExprs_addexpr(id, typeId, parent, idx)
371+
tw.writeHasLocation(id, locId)
372+
id
373+
} c.origin == MINUS -> {
374+
val id = tw.getFreshIdLabel<DbSubexpr>()
375+
val typeId = useType(c.type)
376+
val locId = tw.getLocation(c.startOffset, c.endOffset)
377+
tw.writeExprs_subexpr(id, typeId, parent, idx)
378+
tw.writeHasLocation(id, locId)
379+
id
380+
} c.origin == DIV -> {
381+
val id = tw.getFreshIdLabel<DbDivexpr>()
382+
val typeId = useType(c.type)
383+
val locId = tw.getLocation(c.startOffset, c.endOffset)
384+
tw.writeExprs_divexpr(id, typeId, parent, idx)
385+
tw.writeHasLocation(id, locId)
386+
id
387+
} c.origin == PERC -> {
388+
val id = tw.getFreshIdLabel<DbRemexpr>()
389+
val typeId = useType(c.type)
390+
val locId = tw.getLocation(c.startOffset, c.endOffset)
391+
tw.writeExprs_remexpr(id, typeId, parent, idx)
392+
tw.writeHasLocation(id, locId)
393+
id
394+
} else -> {
395+
extractorBug("Unrecognised IrCall: " + c.render())
396+
return
397+
}
398+
}
399+
val dr = c.dispatchReceiver
400+
val offset = if(dr == null) 0 else 1
401+
if(dr != null) {
402+
extractExpression(dr, callable, exprId, 0)
403+
}
404+
for(i in 0 until c.valueArgumentsCount) {
405+
val arg = c.getValueArgument(i)
406+
if(arg != null) {
407+
extractExpression(arg, callable, exprId, i + offset)
408+
}
409+
}
410+
}
411+
364412
fun extractExpression(e: IrExpression, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int) {
365413
when(e) {
366-
is IrCall -> {
367-
val sig: IdSignature.PublicSignature? = e.symbol.signature?.asPublic()
368-
if(sig == null) {
369-
extractorBug("IrCall without public signature")
370-
} else {
371-
when {
372-
e.origin == PLUS -> {
373-
if(e.valueArgumentsCount == 1) {
374-
val left = e.dispatchReceiver
375-
val right = e.getValueArgument(0)
376-
if(left != null && right != null) {
377-
val id = tw.getFreshIdLabel<DbAddexpr>()
378-
val typeId = useType(e.type)
379-
val locId = tw.getLocation(e.startOffset, e.endOffset)
380-
tw.writeExprs_addexpr(id, typeId, parent, idx)
381-
tw.writeHasLocation(id, locId)
382-
extractExpression(left, callable, id, 0)
383-
extractExpression(right, callable, id, 1)
384-
} else {
385-
extractorBug("Unrecognised IrCall: left or right is null")
386-
}
387-
} else {
388-
extractorBug("Unrecognised IrCall: Not binary")
389-
}
390-
}
391-
else -> extractorBug("Unrecognised IrCall: " + e.render())
392-
}
393-
}
394-
}
414+
is IrCall -> extractCall(e, callable, parent, idx)
395415
is IrConst<*> -> {
396416
val v = e.value as Int
397417
val id = tw.getFreshIdLabel<DbIntegerliteral>()
Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
1-
| exprs.kt:3:13:3:13 | x |
2-
| exprs.kt:3:13:3:17 | ... + ... |
3-
| exprs.kt:3:17:3:17 | y |
4-
| exprs.kt:4:12:4:14 | 123 |
5-
| exprs.kt:4:12:4:20 | ... + ... |
6-
| exprs.kt:4:18:4:20 | 456 |
7-
| file://:0:0:0:0 | i |
1+
| exprs.kt:3:14:3:14 | 1 |
2+
| exprs.kt:4:14:4:14 | x |
3+
| exprs.kt:4:14:4:18 | ... + ... |
4+
| exprs.kt:4:18:4:18 | y |
5+
| exprs.kt:5:14:5:14 | x |
6+
| exprs.kt:5:14:5:18 | ... - ... |
7+
| exprs.kt:5:18:5:18 | y |
8+
| exprs.kt:6:14:6:14 | x |
9+
| exprs.kt:6:14:6:18 | ... / ... |
10+
| exprs.kt:6:18:6:18 | y |
11+
| exprs.kt:7:14:7:14 | x |
12+
| exprs.kt:7:14:7:18 | ... % ... |
13+
| exprs.kt:7:18:7:18 | y |
14+
| exprs.kt:8:12:8:14 | 123 |
15+
| exprs.kt:8:12:8:20 | ... + ... |
16+
| exprs.kt:8:18:8:20 | 456 |
17+
| file://:0:0:0:0 | i1 |
18+
| file://:0:0:0:0 | i2 |
19+
| file://:0:0:0:0 | i3 |
20+
| file://:0:0:0:0 | i4 |
21+
| file://:0:0:0:0 | i5 |
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11

22
fun topLevelMethod(x: Int, y: Int): Int {
3-
var i = x + y
3+
val i1 = 1
4+
val i2 = x + y
5+
val i3 = x - y
6+
val i4 = x / y
7+
val i5 = x % y
48
return 123 + 456
59
}
610

0 commit comments

Comments
 (0)