aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-11 18:21:38 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-11 18:21:38 +0000
commit8ddcc9410a370664c800525bfedc5a01a61e1489 (patch)
treebaf7fbdaee9e2d89de18abfc106aa00aeb91af7d /src/main/java
parent041d35ae5b61d3dd94bcd164b72158de2049ff18 (diff)
Add builder for DefineFunctionInstruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
index 07815898..e7019357 100644
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
@@ -1,7 +1,10 @@
package org.shedlang.compiler.stackir.instructions;
+import org.pcollections.PVector;
import org.shedlang.compiler.ast.typed.FreeVariables;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.util.P;
import java.util.List;
@@ -19,4 +22,83 @@ public record DefineFunctionInstruction(
public record Param(String name, Source source) {
}
+
+ public static Builder builder() {
+ return new Builder(
+ "f",
+ P.vector(),
+ P.vector(),
+ FreeVariables.builder(),
+ P.vector()
+ );
+ }
+
+ public record Builder(
+ String name,
+ PVector<Param> positionalParams,
+ PVector<Param> namedParams,
+ FreeVariables.Builder freeVariables,
+ PVector<Instruction> body
+ ) {
+ public DefineFunctionInstruction build() {
+ return new DefineFunctionInstruction(
+ name,
+ positionalParams,
+ namedParams,
+ freeVariables.build(),
+ body,
+ Sources.NULL
+ );
+ }
+
+ public Builder withName(String name) {
+ return new Builder(
+ name,
+ this.positionalParams,
+ this.namedParams,
+ this.freeVariables,
+ this.body
+ );
+ }
+
+ public Builder addPositionalParam(String name) {
+ return new Builder(
+ this.name,
+ this.positionalParams.plus(new Param(name, Sources.NULL)),
+ this.namedParams,
+ this.freeVariables,
+ this.body
+ );
+ }
+
+ public Builder addNamedParam(String name) {
+ return new Builder(
+ this.name,
+ this.positionalParams,
+ this.namedParams.plus(new Param(name, Sources.NULL)),
+ this.freeVariables,
+ this.body
+ );
+ }
+
+ public Builder addFreeVariable(String name) {
+ return new Builder(
+ this.name,
+ this.positionalParams,
+ this.namedParams,
+ this.freeVariables.plus(name, Sources.NULL),
+ this.body
+ );
+ }
+
+ public Builder addBodyInstruction(Instruction instruction) {
+ return new Builder(
+ this.name,
+ this.positionalParams,
+ this.namedParams,
+ this.freeVariables,
+ this.body.plus(instruction)
+ );
+ }
+ }
}