aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-20 16:57:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-20 16:57:44 +0100
commit4a6e046a50e68ca90cae7725362e922fd3ca2f58 (patch)
tree82b62dc64764743d37b0458f1fbc05999b140a39 /src/main/java/org
parentf37915a2907d090b10fb5a323211cf858bb8f2bf (diff)
Add return type to Patio function definitions
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java22
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java1
5 files changed, 28 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
index fc153522..8e108a45 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
@@ -63,7 +63,7 @@ class PatioCodeGenClosures {
var fullName = fullNameResult.value();
context = fullNameResult.context();
- context = context.createFunction(fullName, true, source, bodyContext -> {
+ context = context.createFunction(fullName, true, PatioCodeGenTypes.VALUE_TYPE, source, bodyContext -> {
var closurePointerResult = bodyContext.allocateLocal(
PatioCodeGenLocalSpace.CLOSURE_POINTER,
CLOSURE_POINTER_TYPE
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
index b80e96d3..e4a21fdf 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
@@ -253,6 +253,7 @@ public record PatioCodeGenContext(
public PatioCodeGenContext createFunction(
String name,
boolean isPrivate,
+ PatioType returnType,
Source source,
Function<PatioCodeGenContext, PatioCodeGenContext> createBody
) {
@@ -280,6 +281,7 @@ public record PatioCodeGenContext(
isPrivate,
params,
locals,
+ returnType,
bodyContext.functionContext.instructions,
source
)),
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index b7903eb7..3e87058d 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -1,5 +1,6 @@
package org.shedlang.compiler.patio;
+import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.types.NamespaceName;
@@ -16,6 +17,7 @@ public class PatioCodeGenNamespaces {
context = context.createFunction(
globalNameNamespaceInit(namespaceName),
false,
+ PatioTypes.VOID,
Sources.NULL,
initContext ->
generateInitBody.apply(initContext)
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
index 1057b2fd..93ea214a 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
@@ -2,6 +2,8 @@ package org.shedlang.compiler.patio.ast;
import org.pcollections.PVector;
import org.shedlang.compiler.patio.ast.instructions.PatioInstruction;
+import org.shedlang.compiler.patio.ast.types.PatioType;
+import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.util.P;
@@ -13,6 +15,7 @@ public record PatioFunctionDefinition(
boolean isPrivate,
List<PatioLocal> params,
List<PatioLocal> locals,
+ PatioType returnType,
List<PatioInstruction> body,
Source source
) implements PatioCompilationUnitElement {
@@ -22,6 +25,7 @@ public record PatioFunctionDefinition(
true,
P.vector(),
P.vector(),
+ PatioTypes.INT,
P.vector()
);
}
@@ -31,6 +35,7 @@ public record PatioFunctionDefinition(
boolean isPrivate,
PVector<PatioLocal> params,
PVector<PatioLocal> locals,
+ PatioType returnType,
PVector<PatioInstruction> body
) {
public Builder withName(String name) {
@@ -39,6 +44,7 @@ public record PatioFunctionDefinition(
this.isPrivate,
this.params,
this.locals,
+ this.returnType,
this.body
);
}
@@ -49,6 +55,7 @@ public record PatioFunctionDefinition(
isPrivate,
this.params,
this.locals,
+ this.returnType,
this.body
);
}
@@ -59,6 +66,7 @@ public record PatioFunctionDefinition(
this.isPrivate,
this.params.plus(param),
this.locals,
+ this.returnType,
this.body
);
}
@@ -69,6 +77,7 @@ public record PatioFunctionDefinition(
this.isPrivate,
this.params,
this.locals.plus(local),
+ this.returnType,
this.body
);
}
@@ -79,16 +88,29 @@ public record PatioFunctionDefinition(
this.isPrivate,
this.params,
this.locals,
+ this.returnType,
this.body.plus(instruction)
);
}
+ public Builder withReturnType(PatioType returnType) {
+ return new Builder(
+ this.name,
+ this.isPrivate,
+ this.params,
+ this.locals,
+ returnType,
+ this.body
+ );
+ }
+
public PatioFunctionDefinition build() {
return new PatioFunctionDefinition(
this.name,
this.isPrivate,
this.params,
this.locals,
+ this.returnType,
this.body,
Sources.NULL
);
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index 4182b918..ecaddef8 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -81,6 +81,7 @@ public class PatioSerializer {
.map(local -> localToTree(local))
.toList()
)),
+ treeNamed("return-type", typeToTree(functionDefinition.returnType())),
treeNamed("body", instructionsToTree(functionDefinition.body()))
);
};