aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java20
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(),