diff options
7 files changed, 71 insertions, 75 deletions
diff --git a/examples/02-sum/output/rust/src/shapes.rs b/examples/02-sum/output/rust/src/shapes.rs index 31c3db9..d5b7334 100644 --- a/examples/02-sum/output/rust/src/shapes.rs +++ b/examples/02-sum/output/rust/src/shapes.rs @@ -6,12 +6,14 @@ pub enum Shape { Triangle(crate::shapes::Triangle), } -impl Shape { - pub fn rectangle(value: crate::shapes::Rectangle) -> Self { +impl ::std::convert::From<crate::shapes::Rectangle> for crate::shapes::Shape { + fn from(value: crate::shapes::Rectangle) -> Self { Self::Rectangle(value) } +} - pub fn triangle(value: crate::shapes::Triangle) -> Self { +impl ::std::convert::From<crate::shapes::Triangle> for crate::shapes::Shape { + fn from(value: crate::shapes::Triangle) -> Self { Self::Triangle(value) } } diff --git a/examples/03-inductive-data-types/output/rust/src/arithmetic.rs b/examples/03-inductive-data-types/output/rust/src/arithmetic.rs index d6944a9..ac7c740 100644 --- a/examples/03-inductive-data-types/output/rust/src/arithmetic.rs +++ b/examples/03-inductive-data-types/output/rust/src/arithmetic.rs @@ -5,12 +5,14 @@ pub enum Expression { Const(crate::arithmetic::Const), } -impl Expression { - pub fn add(value: crate::arithmetic::Add) -> Self { +impl ::std::convert::From<crate::arithmetic::Add> for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Add) -> Self { Self::Add(::std::boxed::Box::new(value)) } +} - pub fn r#const(value: crate::arithmetic::Const) -> Self { +impl ::std::convert::From<crate::arithmetic::Const> for crate::arithmetic::Expression { + fn from(value: crate::arithmetic::Const) -> Self { Self::Const(value) } } diff --git a/examples/03-inductive-data-types/output/rust/src/main.rs b/examples/03-inductive-data-types/output/rust/src/main.rs index 28f7cec..61fd820 100644 --- a/examples/03-inductive-data-types/output/rust/src/main.rs +++ b/examples/03-inductive-data-types/output/rust/src/main.rs @@ -3,11 +3,11 @@ mod arithmetic; use arithmetic::{Add, Const, Expression}; fn main() { - let expression = Expression::add(Add { - left: Expression::add(Add { - left: Expression::r#const(Const { value: 42 }), - right: Expression::r#const(Const { value: 47 }), - }), - right: Expression::r#const(Const { value: 52 }), - }); + let expression: Expression = Add { + left: Add { + left: Const { value: 42 }.into(), + right: Const { value: 47 }.into(), + }.into(), + right: Const { value: 52 }.into(), + }.into(); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index a7d39eb..66a19fe 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -149,6 +149,8 @@ public class RustTypesGenerator implements Generator { TypedSumDefinitionNode sumDefinition, Context context ) { + var items = new ArrayList<RustItem>(); + var rustEnumName = generateTypeName(sumDefinition.name()); var rustVariants = sumDefinition.variants().stream() @@ -170,61 +172,51 @@ public class RustTypesGenerator implements Generator { .toList(); var rustEnum = new RustEnum(rustEnumName, rustVariants, sumDefinition.docComment()); + items.add(rustEnum); + + for (var variant : sumDefinition.variants()) { + var variantType = generateRustTypeExpression(variant.type(), context); + var variantName = generateVariantName(variant.type().value()); + var innerValueName = new RustIdentifier("value"); + RustExpression innerValue = new RustPathInExpression(List.of( + new RustPathExprSegment( + new RustPathIdentSegmentIdentifier(innerValueName), + Optional.empty() + ) + )); + + if (variant.isBox()) { + innerValue = new RustCallExpression( + RustPathInExpression.global("std", "boxed", "Box", "new"), + List.of(innerValue) + ); + } - var rustCreateVariantFunctions = sumDefinition.variants().stream() - .<RustAssociatedItem>map(variant -> { - var variantType = generateRustTypeExpression(variant.type(), context); - -// if (variant.isBox()) { -// variantType = RustTypePath.global("std", "boxed", "Box") -// .withArgs(List.of(variantType)); -// } -// - var variantName = generateVariantName(variant.type().value()); -// -// return new RustEnumVariant( -// variantName, -// new RustEnumVariantTuple(List.of( -// new RustTupleField(variantType) -// )) -// ); - - var innerValueName = new RustIdentifier("value"); - RustExpression innerValue = new RustPathInExpression(List.of( - new RustPathExprSegment( - new RustPathIdentSegmentIdentifier(innerValueName), - Optional.empty() - ) - )); - - if (variant.isBox()) { - innerValue = new RustCallExpression( - RustPathInExpression.global("std", "boxed", "Box", "new"), - List.of(innerValue) - ); - } - - return new RustFunction( - new RustIdentifier(Casing.upperCamelCaseToSnakeCase(variantName.value())), - List.of( - new RustFunctionParam(innerValueName, variantType) - ), - Optional.of(RustTypePath.selfType()), - Optional.of(new RustBlockExpression( - List.of(), - Optional.of( - new RustCallExpression( - RustPathInExpression.selfType(variantName), - List.of(innerValue) + var fromImpl = new RustTraitImpl( + RustTypePath.global("std", "convert", "From") + .withArgs(List.of(variantType)), + generateRustTypeExpression(sumDefinition.type(), context), + List.of( + new RustFunction( + new RustIdentifier("from"), + List.of(new RustFunctionParam(innerValueName, variantType)), + Optional.of(RustTypePath.selfType()), + Optional.of(new RustBlockExpression( + List.of(), + Optional.of( + new RustCallExpression( + RustPathInExpression.selfType(variantName), + List.of(innerValue) + ) ) - ) - )) - ); - }) - .toList(); - var rustImpl = new RustInherentImpl(RustTypePath.of(rustEnumName), rustCreateVariantFunctions); + )) + ) + ) + ); - return List.of(rustEnum, rustImpl); + items.add(fromImpl); + } + return items; } private RustType generateRustTypeExpression( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java index cc00f82..3d85056 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java @@ -82,7 +82,7 @@ public class RustWriter implements AutoCloseable { // === Functions === private void writeFunction(RustFunction function) throws IOException { - this.writer.write("pub fn "); + this.writer.write("fn "); this.writeIdentifier(function.name()); this.writer.write("("); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePath.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePath.java index 797f770..6ce5f7f 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePath.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePath.java @@ -90,7 +90,7 @@ public record RustTypePath(java.util.List<org.zwobble.hobgoblin.compiler.output. return new RustTypePath(segments); } - public RustType withArgs(List<RustType> args) { + public RustTypePath withArgs(List<RustType> args) { var segments = new ArrayList<>(this.segments); var lastSegment = segments.removeLast().withArgs(args); segments.add(lastSegment); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java index dd3a7f9..33fa490 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java @@ -49,7 +49,7 @@ public class RustWriterTests { var string = write(writer -> writer.writeAssociatedItem(rust)); assertThat(string, equalTo(""" - pub fn width();""")); + fn width();""")); } @Test @@ -63,7 +63,7 @@ public class RustWriterTests { var string = write(writer -> writer.writeAssociatedItem(rust)); assertThat(string, equalTo(""" - pub fn area(width: i32, height: u64);""")); + fn area(width: i32, height: u64);""")); } @Test @@ -76,7 +76,7 @@ public class RustWriterTests { var string = write(writer -> writer.writeAssociatedItem(rust)); assertThat(string, equalTo(""" - pub fn area() -> i32;""")); + fn area() -> i32;""")); } @Test @@ -91,7 +91,7 @@ public class RustWriterTests { var string = write(writer -> writer.writeAssociatedItem(rust)); assertThat(string, equalTo(""" - pub fn predicate() { + fn predicate() { false }""")); } @@ -259,9 +259,9 @@ public class RustWriterTests { assertThat(string, equalTo(""" impl Square { - pub fn width(); + fn width(); - pub fn height(); + fn height(); }""")); } @@ -292,9 +292,9 @@ public class RustWriterTests { assertThat(string, equalTo(""" impl Shape for Square { - pub fn width(); + fn width(); - pub fn height(); + fn height(); }""")); } |
