@@ -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 >()
0 commit comments