diff options
7 files changed, 76 insertions, 15 deletions
diff --git a/hobgoblin/src/output/lang/rust/ast.hob b/hobgoblin/src/output/lang/rust/ast.hob index 22ee689..a39e0d4 100644 --- a/hobgoblin/src/output/lang/rust/ast.hob +++ b/hobgoblin/src/output/lang/rust/ast.hob @@ -20,6 +20,7 @@ sum RustItem { // === Functions === struct RustFunction { + field visibility: Option[RustVisibility]; field name: RustIdentifier; field params: List[RustFunctionParam]; field returnType: Option[RustType]; @@ -219,6 +220,12 @@ struct RustPathIdentSegmentIdentifier { struct RustPathIdentSegmentSelfType { } +// == Visibility == + +enum RustVisibility { + variant pub; +} + // == Identifiers == struct RustIdentifier { 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 279f944..c6cf7c4 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 @@ -203,6 +203,7 @@ public class RustTypesGenerator implements Generator { this.rustGenerator.generateRustTypeExpression(sumDefinition.type()), List.of( new RustFunction( + Optional.empty(), new RustIdentifier("from"), List.of(new RustFunctionParam(innerValueName, variantType)), Optional.of(RustPath.selfType()), 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 3c1bfba..4b2ca36 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 @@ -86,6 +86,11 @@ public class RustWriter implements AutoCloseable { // === Functions === private void writeFunction(RustFunction function) throws IOException { + if (function.visibility().isPresent()) { + this.writeVisibility(function.visibility().get()); + this.writer.write(" "); + } + this.writer.write("fn "); this.writeIdentifier(function.name()); this.writer.write("("); @@ -488,6 +493,14 @@ public class RustWriter implements AutoCloseable { } } + // == Visibility == + + private void writeVisibility(RustVisibility visibility) throws IOException { + this.writer.write(switch (visibility) { + case PUB -> "pub"; + }); + } + // == Identifiers == void writeIdentifier(RustIdentifier identifier) throws IOException { diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java index 1f90e88..2ce592c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java @@ -5,62 +5,70 @@ package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction imports -public record RustFunction(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem { +public record RustFunction(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem { public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder arbitrary() { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), java.util.Optional.empty(), java.util.Optional.empty()); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.empty(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), java.util.Optional.empty(), java.util.Optional.empty()); } - public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem.Builder, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem.Builder { + public record Builder(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem.Builder, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem.Builder { public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction build() { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction(visibility, name, params, returnType, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withVisibility(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withVisibility(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility visibility) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.of(visibility), name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name.build(), params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name.build(), params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withParams(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam>(this.params); params.add(param); - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam.Builder param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam>(this.params); params.add(param.build()); - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType returnType) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, java.util.Optional.of(returnType), body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, java.util.Optional.of(returnType), body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder returnType) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, java.util.Optional.of(returnType.build()), body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, java.util.Optional.of(returnType.build()), body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, java.util.Optional.of(body)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, java.util.Optional.of(body)); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType, java.util.Optional.of(body.build())); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, java.util.Optional.of(body.build())); } // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder body diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustVisibility.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustVisibility.java new file mode 100644 index 0000000..d7b7175 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustVisibility.java @@ -0,0 +1,13 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility imports + +public enum RustVisibility { + PUB + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility body +} 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 6900f83..d674346 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 @@ -53,6 +53,19 @@ public class RustWriterTests { } @Test + public void functionWithExplicitVisibility() throws IOException { + var rust = RustFunction.arbitrary() + .withVisibility(RustVisibility.PUB) + .withName(new RustIdentifier("width")) + .build(); + + var string = write(writer -> writer.writeAssociatedItem(rust)); + + assertThat(string, equalTo(""" + pub fn width();""")); + } + + @Test public void functionWithParams() throws IOException { var rust = RustFunction.arbitrary() .withName(new RustIdentifier("area")) diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java index acbc32c..1dcd068 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java @@ -28,6 +28,12 @@ public class RustFunctionMatcher implements org.zwobble.precisely.Matcher<java.l return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.class, this.submatchers); } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher withVisibility(org.zwobble.precisely.Matcher<? super java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility>> visibility) { + var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction>>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("visibility", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction::visibility, visibility)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher(submatchers); + } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher withName(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier> name) { var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction>>(this.submatchers); submatchers.add(org.zwobble.precisely.Matchers.has("name", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction::name, name)); |
