diff options
Diffstat (limited to 'src/main/java/org')
4 files changed, 89 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java index 3d57b82..bc1fe01 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java @@ -344,17 +344,7 @@ public class JavaWriter implements AutoCloseable { this.writer.write(" "); this.writeIdentifier(method.name()); this.writer.write("("); - - writeWithSeparator( - method.params(), - param -> { - writeTypeRef(param.type()); - writer.write(" "); - this.writeIdentifier(param.name()); - }, - () -> writer.write(", ") - ); - + this.writeParams(method.params()); this.writer.write(")"); if (!method.throws_().isEmpty()) { @@ -376,6 +366,18 @@ public class JavaWriter implements AutoCloseable { // == Methods == + private void writeParams(List<JavaParam> params) throws IOException { + writeWithSeparator( + params, + param -> { + writeTypeRef(param.type()); + writer.write(" "); + this.writeIdentifier(param.name()); + }, + () -> writer.write(", ") + ); + } + // == Type references == void writeTypeRef(JavaTypeRef type) throws IOException { @@ -670,6 +672,10 @@ public class JavaWriter implements AutoCloseable { writeIntegerLiteral(integerLiteral); } + case JavaLambdaExpression lambdaExpression -> { + writeLambdaExpression(lambdaExpression); + } + case JavaMethodCall methodCall -> { writeMethodCall(methodCall); } @@ -748,6 +754,7 @@ public class JavaWriter implements AutoCloseable { case JavaFieldAccess fieldAccess -> JavaPrecedence.PRIMARY; case JavaInstanceofExpression instanceofExpression -> JavaPrecedence.RELATIONAL; case JavaIntegerLiteral integerLiteral -> JavaPrecedence.PRIMARY; + case JavaLambdaExpression _ -> JavaPrecedence.PRIMARY; case JavaMethodCall methodCall -> JavaPrecedence.PRIMARY; case JavaMethodRef methodRef -> JavaPrecedence.PRIMARY; case JavaNewExpression newExpression -> JavaPrecedence.PRIMARY; @@ -873,6 +880,13 @@ public class JavaWriter implements AutoCloseable { this.writer.write(Long.toString(integerLiteral.value())); } + private void writeLambdaExpression(JavaLambdaExpression lambdaExpression) throws IOException { + this.writer.write("("); + this.writeParams(lambdaExpression.params()); + this.writer.write(") -> "); + this.writeBlock(lambdaExpression.body()); + } + private void writeMethodCall(JavaMethodCall call) throws IOException { this.writeSubExpression(call.receiver(), JavaPrecedence.PRIMARY, true); this.writer.write("."); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java index dd6257b..7e2aae1 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java @@ -5,7 +5,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression imports -public sealed interface JavaExpression permits org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaArrayAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperation, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCast, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaFieldAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInstanceofExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIntegerLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodCall, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodRef, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaNewExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaNullLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPostfixExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaRef, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStaticFieldAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStaticMethodCall, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStringLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaSwitchExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTernaryConditional { +public sealed interface JavaExpression permits org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaArrayAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBinaryOperation, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBooleanLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCast, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaFieldAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInstanceofExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIntegerLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodCall, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodRef, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaNewExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaNullLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPostfixExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaRef, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStaticFieldAccess, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStaticMethodCall, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaStringLiteral, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaSwitchExpression, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTernaryConditional { public interface Builder { public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression build(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaLambdaExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaLambdaExpression.java new file mode 100644 index 0000000..d7d397d --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaLambdaExpression.java @@ -0,0 +1,54 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression imports + +public record JavaLambdaExpression( + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params, + org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock body +) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression { + public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(java.util.List.of(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock.arbitrary().build()); + } + + public record Builder( + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params, + org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock body + ) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaExpression.Builder { + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression build() { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression(params, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder withParams(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(params, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam param) { + var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam>(this.params); + params.add(param); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(params, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam.Builder param) { + var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam>(this.params); + params.add(param.build()); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(params, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock body) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(params, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock.Builder body) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder(params, body.build()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaLambdaExpression body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java index 6f88a6c..734ee95 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java @@ -42,6 +42,15 @@ public record JavaTypeRef( return new JavaTypeRef(packageName, typeNames, args, 0); } + public static JavaTypeRef local(JavaIdentifier name) { + return new JavaTypeRef( + JavaPackageName.EMPTY, + List.of(name), + List.of(), + 0 + ); + } + private static class JavaPackages { private static final JavaPackageName JAVA_IO = JavaPackageName.of("java", "io"); private static final JavaPackageName JAVA_LANG = JavaPackageName.of("java", "lang"); |
