diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-20 16:57:44 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-20 16:57:44 +0100 |
| commit | 4a6e046a50e68ca90cae7725362e922fd3ca2f58 (patch) | |
| tree | 82b62dc64764743d37b0458f1fbc05999b140a39 /src/main/java/org | |
| parent | f37915a2907d090b10fb5a323211cf858bb8f2bf (diff) | |
Add return type to Patio function definitions
Diffstat (limited to 'src/main/java/org')
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())) ); }; |
