diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index 78226cce..bf6d2072 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -111,7 +111,23 @@ public class ShidCodeGen { } private static Context compileCall(TypedCallNode node, Context context) { - context = compileExpression(node.receiver(), context); + var extraArgumentCount = 0; + if ( + node.receiver() instanceof TypedMemberAccessNode receiverNode && + receiverNode.memberKind() == MemberKind.METHOD + ) { + extraArgumentCount = 1; + var methodCallReceiver = receiverTypeToReceiver(receiverNode.receiver().type()); + var methodCallReceiverType = ((ShidFieldLoad.Receiver.Struct) methodCallReceiver).type(); + context = context.addInstruction(new ShidMethodLoad( + methodCallReceiverType, + receiverNode.memberName(), + receiverNode.source() + )); + context = compileExpression(receiverNode.receiver(), context); + } else { + context = compileExpression(node.receiver(), context); + } for (var arg : node.args().positional()) { context = compileExpression(arg, context); @@ -122,7 +138,7 @@ public class ShidCodeGen { } var callInstruction = new ShidCall( - node.args().positional().size(), + node.args().positional().size() + extraArgumentCount, node.args().named().stream() .map(arg -> arg.name()) .toList(), |
