From 8ddcc9410a370664c800525bfedc5a01a61e1489 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 11 Nov 2023 18:21:38 +0000 Subject: Add builder for DefineFunctionInstruction --- .../instructions/DefineFunctionInstruction.java | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) (limited to 'src/main/java') 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 positionalParams, + PVector namedParams, + FreeVariables.Builder freeVariables, + PVector 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) + ); + } + } } -- cgit v1.2.3