summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java36
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaLambdaExpression.java54
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java9
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");