diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-11 18:21:38 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-11 18:21:38 +0000 |
| commit | 8ddcc9410a370664c800525bfedc5a01a61e1489 (patch) | |
| tree | baf7fbdaee9e2d89de18abfc106aa00aeb91af7d /src/main/java | |
| parent | 041d35ae5b61d3dd94bcd164b72158de2049ff18 (diff) | |
Add builder for DefineFunctionInstruction
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java | 82 |
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) + ); + } + } } |
