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/generators/javatypes/JavaTypesGenerator.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java15
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java38
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java36
4 files changed, 81 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
index cd311d9..33072d7 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
@@ -477,6 +477,7 @@ public class JavaTypesGenerator implements Generator {
return new JavaInterfaceDeclaration(
generateTypeRef(sumDefinition.type(), context),
JavaInterfaceOpenness.SEALED,
+ List.of(),
sumDefinition.variants().stream()
.map(variant -> generateTypeRef(variant.type(), context))
.toList(),
@@ -493,6 +494,7 @@ public class JavaTypesGenerator implements Generator {
generateBuilderTypeRef(sumDefinition.type()),
JavaInterfaceOpenness.OPEN,
List.of(),
+ List.of(),
List.of(
new JavaMethodDeclaration(
BUILD_METHOD_NAME,
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 60998aa..3d57b82 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
@@ -149,6 +149,21 @@ public class JavaWriter implements AutoCloseable {
}
this.writer.write("interface ");
this.writeIdentifier(interfaceDeclaration.name());
+
+ if (!interfaceDeclaration.typeParameters().isEmpty()) {
+ this.writer.write("<");
+ writeWithSeparator(
+ interfaceDeclaration.typeParameters(),
+ typeParameter -> {
+ this.writeIdentifier(typeParameter.name());
+ },
+ () -> {
+ this.writer.write(", ");
+ }
+ );
+ this.writer.write(">");
+ }
+
this.writer.write(" ");
if (!interfaceDeclaration.permitsTypes().isEmpty()) {
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
index 8feec8e..867ae84 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
@@ -8,61 +8,79 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
public record JavaInterfaceDeclaration(
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type,
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment
) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration {
public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness.OPEN, java.util.List.of(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment());
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness.OPEN, java.util.List.of(), java.util.List.of(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment());
}
public record Builder(
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type,
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment
) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration.Builder, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration.Builder {
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration build() {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withOpenness(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withTypeParameters(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addTypeParameter(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter typeParameter) {
+ var typeParameters = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>(this.typeParameters);
+ typeParameters.add(typeParameter);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addTypeParameter(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder typeParameter) {
+ var typeParameters = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>(this.typeParameters);
+ typeParameters.add(typeParameter.build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withPermitsTypes(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addPermitsType(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef permitsType) {
var permitsTypes = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef>(this.permitsTypes);
permitsTypes.add(permitsType);
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withBody(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addBodyElement(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration bodyElement) {
var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration>(this.body);
body.add(bodyElement);
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addBodyElement(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration.Builder bodyElement) {
var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration>(this.body);
body.add(bodyElement.build());
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder body
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java
new file mode 100644
index 0000000..bb6af43
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java
@@ -0,0 +1,36 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter imports
+
+public record JavaTypeParameter(
+ org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name
+) {
+ public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.arbitrary().build());
+ }
+
+ public record Builder(
+ org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name
+ ) {
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter(name);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(name);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.Builder name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(name.build());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter body
+}