From 4a6e046a50e68ca90cae7725362e922fd3ca2f58 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 20 Jul 2023 16:57:44 +0100 Subject: Add return type to Patio function definitions --- .../compiler/patio/PatioCodeGenClosures.java | 2 +- .../compiler/patio/PatioCodeGenContext.java | 2 ++ .../compiler/patio/PatioCodeGenNamespaces.java | 2 ++ .../patio/ast/PatioFunctionDefinition.java | 22 ++++++++++++++++++++++ .../compiler/patio/ast/PatioSerializer.java | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) (limited to 'src/main/java/org') 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 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 params, List locals, + PatioType returnType, List 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 params, PVector locals, + PatioType returnType, PVector 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())) ); }; -- cgit v1.2.3