diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-20 14:21:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-20 14:21:22 +0000 |
| commit | f570b54bd3e0fe6ebc134101e3c54be5bc49253d (patch) | |
| tree | 289b1e99b9e0347dec1c3cb4c42f257696a75df7 /src/main/java | |
| parent | 1527c9dcaf66d500b1ccf4c3b26cd70b37089269 (diff) | |
Add Shid code gen for methods on structs
Diffstat (limited to 'src/main/java')
5 files changed, 56 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java index 3d1089b0..b802f255 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java @@ -62,7 +62,17 @@ public record TypedFunctionDefinitionNode( ); } - public TypedFunctionDefinitionNode.Builder addPositionalParam(String name, TypedTypeLevelExpressionNode<Type> type) { + public TypedFunctionDefinitionNode.Builder addPositionalParam( + String name, + TypedTypeLevelExpressionNode<Type> type + ) { + return addPositionalParam(name, Optional.of(type)); + } + + public TypedFunctionDefinitionNode.Builder addPositionalParam( + String name, + Optional<TypedTypeLevelExpressionNode<Type>> type + ) { return new TypedFunctionDefinitionNode.Builder( this.name, this.signature.addPositionalParam(name, type), diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java index 4e66b819..2e535a7d 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionSignatureNode.java @@ -43,9 +43,19 @@ public record TypedFunctionSignatureNode( ); } - public Builder addPositionalParam(String name, TypedTypeLevelExpressionNode<Type> type) { + public Builder addPositionalParam( + String name, + TypedTypeLevelExpressionNode<Type> type + ) { + return addPositionalParam(name, Optional.of(type)); + } + + public Builder addPositionalParam( + String name, + Optional<TypedTypeLevelExpressionNode<Type>> type + ) { return new Builder( - this.positionalParams.plus(new TypedParamNode(name, Optional.of(type), Sources.NULL)), + this.positionalParams.plus(new TypedParamNode(name, type, Sources.NULL)), this.namedParams, this.effect, this.returnType diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java index 5d36e05a..0d63e34b 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNode.java @@ -61,5 +61,14 @@ public record TypedStructDefinitionNode( this.methods ); } + + public Builder addMethod(TypedFunctionDefinitionNode method) { + return new Builder( + this.type, + this.fields, + this.fieldsArePositional, + this.methods.plus(method) + ); + } } } diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index 48dbbf3c..b0c33578 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -3,8 +3,8 @@ package org.shedlang.compiler.shid; import org.pcollections.*; import org.shedlang.compiler.ShedBuiltins; import org.shedlang.compiler.ast.typed.*; -import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.shid.instructions.*; +import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.Iterables; @@ -549,11 +549,31 @@ public class ShidCodeGen { ) { var structType = node.typeOrConstructor().toType(); + var methods = new ArrayList<ShidDefineStruct.Method>(); + for (var methodNode : node.methods()) { + var shidFunctionName = context.generateLocalNameForVariable( + structType.name() + "__" + methodNode.name() + ); + context = compileFunction( + shidFunctionName, + methodNode.signature().params(), + methodNode.body(), + ShidDefineFunction.Variant.FUNCTION, + methodNode.source(), + context + ); + methods.add(new ShidDefineStruct.Method( + methodNode.name(), + shidFunctionName + )); + } + var defineStructInstruction = new ShidDefineStruct( structType, node.fields().stream() .map(field -> new ShidDefineStruct.Field(field.name(), field.source())) .toList(), + methods, node.source() ); diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineStruct.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineStruct.java index b52c9e74..c76b4f20 100644 --- a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineStruct.java +++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineStruct.java @@ -13,10 +13,13 @@ public record ShidDefineStruct( SimpleStructType type, // TODO: remove fields? We should have fields from the type info. List<Field> fields, + List<Method> methods, Source source ) implements ShidInstruction { public record Field(String name, Source source) { + } + public record Method(String methodName, String shidFunctionName) { } @Override |
