diff options
Diffstat (limited to 'src/main')
8 files changed, 79 insertions, 44 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java index ae9a81d..ccbb27c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java @@ -1,10 +1,7 @@ package org.zwobble.hobgoblin.compiler.output.generators.java; import org.zwobble.hobgoblin.compiler.output.lang.java.JavaWriter; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeArg; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; import org.zwobble.hobgoblin.compiler.util.Casing; @@ -28,7 +25,7 @@ public class JavaGenerator { ) throws IOException { for (var javaCompilationUnit : javaCompilationUnits) { var javaCompilationUnitPath = sourceRootDirectory - .resolve(javaCompilationUnit.packageName().stream().map(JavaIdentifier::value).collect(Collectors.joining(File.separator))) + .resolve(javaCompilationUnit.packageName().parts().stream().map(JavaIdentifier::value).collect(Collectors.joining(File.separator))) .resolve(javaCompilationUnit.typeDeclaration().name().value() + ".java"); try (var writer = JavaWriter.file(javaCompilationUnitPath)) { writer.writeCompilationUnit(javaCompilationUnit); @@ -36,7 +33,7 @@ public class JavaGenerator { } } - public List<JavaIdentifier> namespaceToJavaPackageParts(NamespaceName namespaceName) { + public JavaPackageName namespaceToJavaPackageName(NamespaceName namespaceName) { var ancestorNamespaceName = namespaceName; var remainingNamespaceNameParts = new ArrayList<String>(); while (!ancestorNamespaceName.isRoot()) { @@ -46,7 +43,7 @@ public class JavaGenerator { for (var namespaceNamePart : remainingNamespaceNameParts.reversed()) { packageParts.add(generatePackageNamePart(namespaceNamePart)); } - return packageParts; + return new JavaPackageName(packageParts); } remainingNamespaceNameParts.add(ancestorNamespaceName.parts().getLast()); ancestorNamespaceName = ancestorNamespaceName.parent(); @@ -56,7 +53,7 @@ public class JavaGenerator { for (var namespaceNamePart : namespaceName.parts()) { packageParts.add(generatePackageNamePart(namespaceNamePart)); } - return packageParts; + return new JavaPackageName(packageParts); } public JavaIdentifier generateEnumConstantName(String name) { @@ -100,7 +97,7 @@ public class JavaGenerator { case EnumType enumType -> JavaTypeRef.topLevel( - namespaceToJavaPackageParts(enumType.namespaceName()), + namespaceToJavaPackageName(enumType.namespaceName()), generateTypeName(enumType.name()) ); @@ -115,7 +112,7 @@ public class JavaGenerator { } } else { yield JavaTypeRef.topLevel( - namespaceToJavaPackageParts(simpleNativeType.namespaceName()), + namespaceToJavaPackageName(simpleNativeType.namespaceName()), generateTypeName(simpleNativeType.name()) ); } @@ -123,13 +120,13 @@ public class JavaGenerator { case StructType structType -> JavaTypeRef.topLevel( - namespaceToJavaPackageParts(structType.namespaceName()), + namespaceToJavaPackageName(structType.namespaceName()), generateTypeName(structType.name()) ); case SumType sumType -> JavaTypeRef.topLevel( - namespaceToJavaPackageParts(sumType.namespaceName()), + namespaceToJavaPackageName(sumType.namespaceName()), generateTypeName(sumType.name()) ); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java index 7eb2c32..4b216a3 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java @@ -58,7 +58,8 @@ public record JavaGeneratorConfig( var javaTypeParts = Arrays.stream(javaTypeString.split("\\.")) .map(JavaIdentifier::of) .toList(); - var javaTypeRef = JavaTypeRef.topLevel(javaTypeParts.subList(0, javaTypeParts.size() - 1), javaTypeParts.getLast()); + var javaPackageName = new JavaPackageName(javaTypeParts.subList(0, javaTypeParts.size() - 1)); + var javaTypeRef = JavaTypeRef.topLevel(javaPackageName, javaTypeParts.getLast()); nativeTypeConfigs.put(hobgoblinType, new JavaNativeTypeConfig(javaTypeRef, Optional.empty(), Optional.empty())); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java index b8a634c..c5300b1 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java @@ -52,7 +52,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { } private List<JavaCompilationUnit> generateNamespace(TypedNamespaceNode namespace, Context context) { - var packageParts = namespaceToJavaPackageParts(namespace.namespaceName()); + var packageParts = namespaceToJavaPackageName(namespace.namespaceName()); var javaCompilationUnits = new ArrayList<JavaCompilationUnit>(); @@ -91,7 +91,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { var javaStructTypeRef = this.javaGenerator.generateTypeRef(structType); var javaMatcherTypeRef = JavaTypeRef.topLevel( - namespaceToJavaPackageParts(structType.namespaceName()), + namespaceToJavaPackageName(structType.namespaceName()), matcherTypeName ); @@ -250,8 +250,8 @@ public class JavaPreciselyMatchersGenerator implements Generator { ); } - private List<JavaIdentifier> namespaceToJavaPackageParts(NamespaceName namespaceName) { - return this.javaGenerator.namespaceToJavaPackageParts(namespaceName); + private JavaPackageName namespaceToJavaPackageName(NamespaceName namespaceName) { + return this.javaGenerator.namespaceToJavaPackageName(namespaceName); } private static class Context { @@ -275,7 +275,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { } - private static final List<JavaIdentifier> PRECISELY_PACKAGE_NAME = List.of(JavaIdentifier.of("org"), JavaIdentifier.of("zwobble"), JavaIdentifier.of("precisely")); + private static final JavaPackageName PRECISELY_PACKAGE_NAME = JavaPackageName.of("org", "zwobble", "precisely"); private static final JavaTypeRef MATCH_RESULT_REF = JavaTypeRef.topLevel(PRECISELY_PACKAGE_NAME, JavaIdentifier.of("MatchResult")); private static final JavaTypeRef MATCHERS_REF = JavaTypeRef.topLevel(PRECISELY_PACKAGE_NAME, JavaIdentifier.of("Matchers")); private static final JavaTypeRef TEXT_TREE_REF = JavaTypeRef.topLevel(PRECISELY_PACKAGE_NAME, JavaIdentifier.of("TextTree")); 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 c85ff5d..82585c6 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 @@ -20,9 +20,9 @@ import static org.zwobble.hobgoblin.compiler.util.Casing.lowerCamelCaseToUpperCa public class JavaTypesGenerator implements Generator { public static final String NAME = "java-types"; - private static final JavaIdentifier ARBITRARY_METHOD_NAME = new JavaIdentifier("arbitrary"); - private static final JavaIdentifier BUILDER_TYPE_NAME = new JavaIdentifier("Builder"); - private static final JavaIdentifier BUILD_METHOD_NAME = new JavaIdentifier("build"); + private static final JavaIdentifier ARBITRARY_METHOD_NAME = JavaIdentifier.of("arbitrary"); + private static final JavaIdentifier BUILDER_TYPE_NAME = JavaIdentifier.of("Builder"); + private static final JavaIdentifier BUILD_METHOD_NAME = JavaIdentifier.of("build"); public static OutputConfig parseOutputConfig(Path projectRoot, Json5ObjectReader output) { return () -> { @@ -61,7 +61,7 @@ public class JavaTypesGenerator implements Generator { } private List<JavaCompilationUnit> generateNamespace(TypedNamespaceNode namespace, Context context) { - var packageParts = namespaceToJavaPackageParts(namespace.namespaceName()); + var packageParts = namespaceToJavaPackageName(namespace.namespaceName()); var javaCompilationUnits = new ArrayList<JavaCompilationUnit>(); @@ -297,8 +297,8 @@ public class JavaTypesGenerator implements Generator { ); } - private List<JavaIdentifier> namespaceToJavaPackageParts(NamespaceName namespaceName) { - return this.javaGenerator.namespaceToJavaPackageParts(namespaceName); + private JavaPackageName namespaceToJavaPackageName(NamespaceName namespaceName) { + return this.javaGenerator.namespaceToJavaPackageName(namespaceName); } private JavaTypeRef generateTypeRef( @@ -330,8 +330,8 @@ public class JavaTypesGenerator implements Generator { } private JavaTypeRef generateBuilderTypeRef(NamespaceName namespaceName, String name) { - var javaPackage = namespaceToJavaPackageParts(namespaceName); - return JavaTypeRef.inner(javaPackage, generateTypeName(name), BUILDER_TYPE_NAME); + var javaPackageName = namespaceToJavaPackageName(namespaceName); + return JavaTypeRef.inner(javaPackageName, generateTypeName(name), BUILDER_TYPE_NAME); } private JavaExpression arbitraryValue( @@ -358,8 +358,8 @@ public class JavaTypesGenerator implements Generator { yield nativeTypeConfig(simpleNativeType) .flatMap(nativeTypeConfig -> nativeTypeConfig.arbitraryValue()) .orElseGet(() -> { - var javaPackageName = namespaceToJavaPackageParts(simpleNativeType.namespaceName()); - var javaClassName = JavaIdentifier.of("HobgoblinNative" + lowerCamelCaseToUpperCamelCase(javaPackageName.getLast().value())); + var javaPackageName = namespaceToJavaPackageName(simpleNativeType.namespaceName()); + var javaClassName = generateTypeName("HobgoblinNative" + lowerCamelCaseToUpperCamelCase(javaPackageName.parts().getLast().value())); return new JavaStaticMethodCall( JavaTypeRef.topLevel(javaPackageName, javaClassName), generateFieldName("arbitrary" + simpleNativeType.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 5814998..3f7481d 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 @@ -422,9 +422,9 @@ public class JavaWriter implements AutoCloseable { this.writer.write("null"); } - private void writePackageName(List<JavaIdentifier> packageName) throws IOException { + private void writePackageName(JavaPackageName packageName) throws IOException { writeWithSeparator( - packageName, + packageName.parts(), this::writeIdentifier, () -> this.writer.write(".") ); @@ -520,7 +520,7 @@ public class JavaWriter implements AutoCloseable { } private static void writeTypeRef(JavaTypeRef type, WriteString writer) throws IOException { - for (var part : type.packageName()) { + for (var part : type.packageName().parts()) { writeIdentifier(part, writer); writer.write("."); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java index 42a58d0..dd034c9 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnit.java @@ -2,20 +2,24 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public record JavaCompilationUnit(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> packageName, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration typeDeclaration) { +public record JavaCompilationUnit(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName packageName, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration typeDeclaration) { public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder arbitrary() { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder(java.util.List.of(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassDeclaration.arbitrary().build()); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassDeclaration.arbitrary().build()); } - public record Builder(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> packageName, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration typeDeclaration) { + public record Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName packageName, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration typeDeclaration) { public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit build() { return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit(packageName, typeDeclaration); } - public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder withPackageName(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> packageName) { + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder withPackageName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName packageName) { return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder(packageName, typeDeclaration); } + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder withPackageName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder packageName) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder(packageName.build(), typeDeclaration); + } + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder withTypeDeclaration(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration typeDeclaration) { return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.Builder(packageName, typeDeclaration); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageName.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageName.java new file mode 100644 index 0000000..00a3101 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageName.java @@ -0,0 +1,33 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.Arrays; +import java.util.List; + +public record JavaPackageName(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> parts) { + public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder(java.util.List.of()); + } + + public record Builder(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> parts) { + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName build() { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName(parts); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder withParts(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> parts) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder(parts); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName body + public static final JavaPackageName EMPTY = new JavaPackageName(List.of()); + + public static JavaPackageName of(String... parts) { + return new JavaPackageName(Arrays.stream(parts).map(JavaIdentifier::of).toList()); + } + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName 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 39edb73..0050eb8 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 @@ -3,21 +3,21 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; import java.util.Arrays; import java.util.List; -public record JavaTypeRef(List<JavaIdentifier> packageName, List<JavaIdentifier> typeNames, List<JavaTypeArg> args) { +public record JavaTypeRef(JavaPackageName packageName, List<JavaIdentifier> typeNames, List<JavaTypeArg> args) { private static JavaTypeRef primitive(String name) { - return new JavaTypeRef(List.of(), List.of(new JavaIdentifier(name)), List.of()); + return new JavaTypeRef(JavaPackageName.EMPTY, List.of(new JavaIdentifier(name)), List.of()); } - public static JavaTypeRef topLevel(List<JavaIdentifier> packageName, JavaIdentifier name) { + public static JavaTypeRef topLevel(JavaPackageName packageName, JavaIdentifier name) { return new JavaTypeRef(packageName, List.of(name), List.of()); } - public static JavaTypeRef inner(List<JavaIdentifier> packageName, JavaIdentifier... typeNames) { + public static JavaTypeRef inner(JavaPackageName packageName, JavaIdentifier... typeNames) { return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of()); } public static JavaTypeRef topLevelGeneric( - List<JavaIdentifier> packageName, + JavaPackageName packageName, JavaIdentifier name, List<JavaTypeArg> args ) { @@ -25,7 +25,7 @@ public record JavaTypeRef(List<JavaIdentifier> packageName, List<JavaIdentifier> } public static JavaTypeRef generic( - List<JavaIdentifier> packageName, + JavaPackageName packageName, List<JavaIdentifier> typeNames, List<JavaTypeArg> args ) { @@ -33,9 +33,9 @@ public record JavaTypeRef(List<JavaIdentifier> packageName, List<JavaIdentifier> } private static class JavaPackages { - private static final List<JavaIdentifier> JAVA_LANG = List.of(JavaIdentifier.of("java"), JavaIdentifier.of("lang")); - private static final List<JavaIdentifier> JAVA_UTIL = List.of(JavaIdentifier.of("java"), JavaIdentifier.of("util")); - private static final List<JavaIdentifier> JAVA_UTIL_STREAM = List.of(JavaIdentifier.of("java"), JavaIdentifier.of("util"), JavaIdentifier.of("stream")); + private static final JavaPackageName JAVA_LANG = JavaPackageName.of("java", "lang"); + private static final JavaPackageName JAVA_UTIL = JavaPackageName.of("java", "util"); + private static final JavaPackageName JAVA_UTIL_STREAM = JavaPackageName.of("java", "util", "stream"); } public static final JavaTypeRef INT = primitive("int"); |
