aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 12:38:04 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 12:38:04 +0100
commit511304a1a553249a2d26f8b6ac227190641ec614 (patch)
treea1538cb8d6169465eb6507953871116d051c9734 /src/main/java
parent3f71d5e7eb9bc1eb49e3e2694f262233b470ac7b (diff)
Add function declarations to Patio
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java64
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java12
3 files changed, 77 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
index d4ad4715..61cccb91 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.patio.ast;
import org.shedlang.compiler.sources.Source;
-public sealed interface PatioCompilationUnitElement permits PatioDataElement, PatioFunctionDefinition {
+public sealed interface PatioCompilationUnitElement permits PatioDataElement, PatioFunctionDeclaration, PatioFunctionDefinition {
String name();
Source source();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java
new file mode 100644
index 00000000..28810b5e
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java
@@ -0,0 +1,64 @@
+package org.shedlang.compiler.patio.ast;
+
+import org.pcollections.PVector;
+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;
+
+import java.util.List;
+
+public record PatioFunctionDeclaration(
+ String name,
+ List<PatioLocal> params,
+ PatioType returnType,
+ Source source
+) implements PatioCompilationUnitElement {
+ public static Builder builder() {
+ return new Builder(
+ "f",
+ P.vector(),
+ PatioTypes.INT
+ );
+ }
+
+ public record Builder(
+ String name,
+ PVector<PatioLocal> params,
+ PatioType returnType
+ ) {
+ public Builder withName(String name) {
+ return new Builder(
+ name,
+ this.params,
+ this.returnType
+ );
+ }
+
+ public Builder addParam(PatioLocal param) {
+ return new Builder(
+ this.name,
+ this.params.plus(param),
+ this.returnType
+ );
+ }
+
+ public Builder withReturnType(PatioType returnType) {
+ return new Builder(
+ this.name,
+ this.params,
+ returnType
+ );
+ }
+
+ public PatioFunctionDeclaration build() {
+ return new PatioFunctionDeclaration(
+ this.name,
+ this.params,
+ this.returnType,
+ 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 25552eb2..e5245d0a 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -80,6 +80,18 @@ public class PatioSerializer {
dataLayoutToTree(dataElement.layout())
);
+ case PatioFunctionDeclaration functionDeclaration ->
+ treeListIndented(
+ treeIdentifier("function-decl"),
+ treeString(element.name()),
+ treeNamed("params", treeList(
+ functionDeclaration.params().stream()
+ .map(param -> localToTree(param))
+ .toList()
+ )),
+ treeNamed("return-type", typeToTree(functionDeclaration.returnType()))
+ );
+
case PatioFunctionDefinition functionDefinition ->
treeListIndented(
treeIdentifier("function"),