From be132b1abe3ef9d1663f15799b971d5cfee3f469 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 20 Jun 2026 20:51:03 +0100 Subject: Introduce JavaPackageName --- hobgoblin/src/output/lang/java/ast.hob | 6 +- .../output/generators/java/JavaGenerator.java | 21 +++--- .../generators/java/JavaGeneratorConfig.java | 3 +- .../JavaPreciselyMatchersGenerator.java | 10 +-- .../generators/javatypes/JavaTypesGenerator.java | 20 +++--- .../compiler/output/lang/java/JavaWriter.java | 6 +- .../output/lang/java/ast/JavaCompilationUnit.java | 12 ++-- .../output/lang/java/ast/JavaPackageName.java | 33 +++++++++ .../compiler/output/lang/java/ast/JavaTypeRef.java | 18 ++--- .../output/lang/java/JavaGeneratorTests.java | 13 ++-- .../compiler/output/lang/java/JavaWriterTests.java | 80 +++++++++++----------- .../lang/java/ast/JavaCompilationUnitMatcher.java | 2 +- .../lang/java/ast/JavaPackageNameMatcher.java | 34 +++++++++ 13 files changed, 166 insertions(+), 92 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageName.java create mode 100644 src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageNameMatcher.java diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob index e77fb33..8286a96 100644 --- a/hobgoblin/src/output/lang/java/ast.hob +++ b/hobgoblin/src/output/lang/java/ast.hob @@ -3,7 +3,7 @@ import {DocComment} from ast; // == Compilation units == struct JavaCompilationUnit { - field packageName: List[JavaIdentifier]; + field packageName: JavaPackageName; field typeDeclaration: JavaTypeDeclaration; } @@ -217,6 +217,10 @@ struct JavaIdentifier { field value: String; } +struct JavaPackageName { + field parts: List[JavaIdentifier]; +} + // == Custom areas == struct JavaCustomArea { 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 namespaceToJavaPackageParts(NamespaceName namespaceName) { + public JavaPackageName namespaceToJavaPackageName(NamespaceName namespaceName) { var ancestorNamespaceName = namespaceName; var remainingNamespaceNameParts = new ArrayList(); 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 generateNamespace(TypedNamespaceNode namespace, Context context) { - var packageParts = namespaceToJavaPackageParts(namespace.namespaceName()); + var packageParts = namespaceToJavaPackageName(namespace.namespaceName()); var javaCompilationUnits = new ArrayList(); @@ -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 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 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 generateNamespace(TypedNamespaceNode namespace, Context context) { - var packageParts = namespaceToJavaPackageParts(namespace.namespaceName()); + var packageParts = namespaceToJavaPackageName(namespace.namespaceName()); var javaCompilationUnits = new ArrayList(); @@ -297,8 +297,8 @@ public class JavaTypesGenerator implements Generator { ); } - private List 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 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 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 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 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 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 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 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 packageName, List typeNames, List args) { +public record JavaTypeRef(JavaPackageName packageName, List typeNames, List 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 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 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 packageName, + JavaPackageName packageName, JavaIdentifier name, List args ) { @@ -25,7 +25,7 @@ public record JavaTypeRef(List packageName, List } public static JavaTypeRef generic( - List packageName, + JavaPackageName packageName, List typeNames, List args ) { @@ -33,9 +33,9 @@ public record JavaTypeRef(List packageName, List } private static class JavaPackages { - private static final List JAVA_LANG = List.of(JavaIdentifier.of("java"), JavaIdentifier.of("lang")); - private static final List JAVA_UTIL = List.of(JavaIdentifier.of("java"), JavaIdentifier.of("util")); - private static final List 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"); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaGeneratorTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaGeneratorTests.java index a99995b..4c7b0ff 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaGeneratorTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaGeneratorTests.java @@ -5,6 +5,7 @@ import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGenerator; import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGeneratorConfig; import org.zwobble.hobgoblin.compiler.output.generators.java.JavaNamespaceConfig; import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier; +import org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import java.util.List; @@ -23,9 +24,9 @@ public class JavaGeneratorTests { ); var generator = new JavaGenerator(config); - var result = generator.namespaceToJavaPackageParts(NamespaceName.of("a", "b")); + var result = generator.namespaceToJavaPackageName(NamespaceName.of("a", "b")); - assertThat(result, equalTo(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example"), JavaIdentifier.of("a"), JavaIdentifier.of("b")))); + assertThat(result, equalTo(JavaPackageName.of("com", "example", "a", "b"))); } @Test @@ -42,9 +43,9 @@ public class JavaGeneratorTests { ); var generator = new JavaGenerator(config); - var result = generator.namespaceToJavaPackageParts(NamespaceName.of("a", "b")); + var result = generator.namespaceToJavaPackageName(NamespaceName.of("a", "b")); - assertThat(result, equalTo(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("other")))); + assertThat(result, equalTo(JavaPackageName.of("com", "other"))); } @Test @@ -61,8 +62,8 @@ public class JavaGeneratorTests { ); var generator = new JavaGenerator(config); - var result = generator.namespaceToJavaPackageParts(NamespaceName.of("a", "b", "c", "d")); + var result = generator.namespaceToJavaPackageName(NamespaceName.of("a", "b", "c", "d")); - assertThat(result, equalTo(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("other"), JavaIdentifier.of("c"), JavaIdentifier.of("d")))); + assertThat(result, equalTo(JavaPackageName.of("com", "other", "c", "d"))); } } diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java index ec09b72..b16494f 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java @@ -19,12 +19,12 @@ public class JavaWriterTests { @Test public void compilationUnit() throws IOException { var java = new JavaCompilationUnit( - List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example"), JavaIdentifier.of("shapes")), + JavaPackageName.of("com", "example", "shapes"), new JavaClassDeclaration( JavaIdentifier.of("Rectangle"), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ) ); @@ -50,7 +50,7 @@ public class JavaWriterTests { JavaIdentifier.of("Rectangle"), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -70,12 +70,12 @@ public class JavaWriterTests { JavaIdentifier.of("Rectangle"), List.of( JavaTypeRef.topLevel( - List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), + JavaPackageName.of("com", "example"), JavaIdentifier.of("Shape") ) ), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -94,11 +94,11 @@ public class JavaWriterTests { var java = new JavaClassDeclaration( JavaIdentifier.of("Rectangle"), List.of( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), JavaIdentifier.of("Shape")), - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), JavaIdentifier.of("Drawable")) + JavaTypeRef.topLevel(JavaPackageName.of("com", "example"), JavaIdentifier.of("Shape")), + JavaTypeRef.topLevel(JavaPackageName.of("com", "example"), JavaIdentifier.of("Drawable")) ), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -135,7 +135,7 @@ public class JavaWriterTests { JavaBlock.EMPTY ) ), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -161,7 +161,7 @@ public class JavaWriterTests { JavaIdentifier.of("Point"), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Point")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Point")), "body"), new DocComment("A 2D point.") ); @@ -180,7 +180,7 @@ public class JavaWriterTests { public void emptyEnumDeclaration() throws IOException { var java = JavaEnumDeclaration.arbitrary() .withName(JavaIdentifier.of("SmallNumber")) - .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("SmallNumber")), "body")) + .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("SmallNumber")), "body")) .build(); var string = write(writer -> writer.writeTypeDeclaration(java)); @@ -197,7 +197,7 @@ public class JavaWriterTests { public void enumDeclarationWithConstants() throws IOException { var java = JavaEnumDeclaration.arbitrary() .withName(JavaIdentifier.of("SmallNumber")) - .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("SmallNumber")), "body")) + .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("SmallNumber")), "body")) .withConstants(List.of( JavaEnumConstant.arbitrary().withName(JavaIdentifier.of("ZERO")).build(), JavaEnumConstant.arbitrary().withName(JavaIdentifier.of("ONE")).build(), @@ -224,7 +224,7 @@ public class JavaWriterTests { var java = JavaEnumDeclaration.arbitrary() .withName(JavaIdentifier.of("SmallNumber")) .withDocComment(new DocComment("A small number.")) - .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("SmallNumber")), "body")) + .withCustomArea(JavaCustomArea.forType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("SmallNumber")), "body")) .build(); var string = write(writer -> writer.writeTypeDeclaration(java)); @@ -245,7 +245,7 @@ public class JavaWriterTests { JavaInterfaceOpenness.OPEN, List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Shape")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")), "body"), DocComment.EMPTY ); @@ -266,7 +266,7 @@ public class JavaWriterTests { JavaInterfaceOpenness.SEALED, List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Shape")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")), "body"), DocComment.EMPTY ); @@ -286,11 +286,11 @@ public class JavaWriterTests { JavaIdentifier.of("Shape"), JavaInterfaceOpenness.SEALED, List.of( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), JavaIdentifier.of("One")), - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), JavaIdentifier.of("Two")) + JavaTypeRef.topLevel(JavaPackageName.of("abc", "def"), JavaIdentifier.of("One")), + JavaTypeRef.topLevel(JavaPackageName.of("abc", "def"), JavaIdentifier.of("Two")) ), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Shape")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")), "body"), DocComment.EMPTY ); @@ -311,7 +311,7 @@ public class JavaWriterTests { JavaInterfaceOpenness.OPEN, List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Shape")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")), "body"), new DocComment("A 2D shape.") ); @@ -350,7 +350,7 @@ public class JavaWriterTests { JavaBlock.EMPTY ) ), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Shape")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")), "body"), DocComment.EMPTY ); @@ -377,7 +377,7 @@ public class JavaWriterTests { List.of(), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Point")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Point")), "body"), DocComment.EMPTY ); @@ -398,7 +398,7 @@ public class JavaWriterTests { List.of(), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Point")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Point")), "body"), new DocComment("A 2D point.") ); @@ -419,10 +419,10 @@ public class JavaWriterTests { JavaIdentifier.of("Rectangle"), List.of(), List.of( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), JavaIdentifier.of("Shape")) + JavaTypeRef.topLevel(JavaPackageName.of("com", "example"), JavaIdentifier.of("Shape")) ), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -442,11 +442,11 @@ public class JavaWriterTests { JavaIdentifier.of("Rectangle"), List.of(), List.of( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), JavaIdentifier.of("Shape")), - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("com"), JavaIdentifier.of("example")), JavaIdentifier.of("Drawable")) + JavaTypeRef.topLevel(JavaPackageName.of("com", "example"), JavaIdentifier.of("Shape")), + JavaTypeRef.topLevel(JavaPackageName.of("com", "example"), JavaIdentifier.of("Drawable")) ), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -484,7 +484,7 @@ public class JavaWriterTests { JavaBlock.EMPTY ) ), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Rectangle")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Rectangle")), "body"), DocComment.EMPTY ); @@ -830,7 +830,7 @@ public class JavaWriterTests { @Test public void staticFieldAccess() throws IOException { var java = new JavaStaticFieldAccess( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("one")), JavaIdentifier.of("Two")), + JavaTypeRef.topLevel(JavaPackageName.of("one"), JavaIdentifier.of("Two")), JavaIdentifier.of("three") ); @@ -842,7 +842,7 @@ public class JavaWriterTests { @Test public void referenceToMethodOnType() throws IOException { var java = new JavaMethodRef( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("one")), JavaIdentifier.of("Two")), + JavaTypeRef.topLevel(JavaPackageName.of("one"), JavaIdentifier.of("Two")), JavaIdentifier.of("three") ); @@ -854,7 +854,7 @@ public class JavaWriterTests { @Test public void newExpression() throws IOException { var java = new JavaNewExpression( - JavaTypeRef.topLevel(List.of(JavaIdentifier.of("one")), JavaIdentifier.of("Two")), + JavaTypeRef.topLevel(JavaPackageName.of("one"), JavaIdentifier.of("Two")), List.of(new JavaIntegerLiteral(1), new JavaIntegerLiteral(2)) ); @@ -875,7 +875,7 @@ public class JavaWriterTests { @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { var java = JavaTypeRef.topLevel( - List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), + JavaPackageName.of("abc", "def"), JavaIdentifier.of("One") ); @@ -887,11 +887,11 @@ public class JavaWriterTests { @Test public void typeRefWithArgsHasAngleBrackets() throws IOException { var java = JavaTypeRef.topLevelGeneric( - List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), + JavaPackageName.of("abc", "def"), JavaIdentifier.of("One"), List.of( - JavaTypeArg.invariant(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Two"))), - JavaTypeArg.invariant(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Three"))) + JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))), + JavaTypeArg.invariant(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three"))) ) ); @@ -903,11 +903,11 @@ public class JavaWriterTests { @Test public void typeRefArgCanBeSuper() throws IOException { var java = JavaTypeRef.topLevelGeneric( - List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), + JavaPackageName.of("abc", "def"), JavaIdentifier.of("One"), List.of( - JavaTypeArg.superType(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Two"))), - JavaTypeArg.superType(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Three"))) + JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Two"))), + JavaTypeArg.superType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Three"))) ) ); @@ -919,7 +919,7 @@ public class JavaWriterTests { @Test public void typeRefInnerTypeNameIsSeparatedByDot() throws IOException { var java = JavaTypeRef.inner( - List.of(JavaIdentifier.of("abc"), JavaIdentifier.of("def")), + JavaPackageName.of("abc", "def"), JavaIdentifier.of("One"), JavaIdentifier.of("Two") ); @@ -936,7 +936,7 @@ public class JavaWriterTests { List.of(), List.of(), List.of(), - new JavaCustomArea(JavaTypeRef.topLevel(List.of(), JavaIdentifier.of("Point")), "body"), + new JavaCustomArea(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Point")), "body"), DocComment.EMPTY ); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnitMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnitMatcher.java index 1c6541b..f2d516e 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnitMatcher.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaCompilationUnitMatcher.java @@ -25,7 +25,7 @@ public class JavaCompilationUnitMatcher implements org.zwobble.precisely.Matcher return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit.class, this.submatchers); } - public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnitMatcher withPackageName(org.zwobble.precisely.Matcher> packageName) { + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnitMatcher withPackageName(org.zwobble.precisely.Matcher packageName) { return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnitMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("packageName", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaCompilationUnit::packageName, packageName))).toList()); } diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageNameMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageNameMatcher.java new file mode 100644 index 0000000..aa6eda6 --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaPackageNameMatcher.java @@ -0,0 +1,34 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public class JavaPackageNameMatcher implements org.zwobble.precisely.Matcher { + public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher isJavaPackageName() { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher(java.util.List.of()); + } + + private final java.util.List> submatchers; + + private JavaPackageNameMatcher(java.util.List> submatchers) { + this.submatchers = submatchers; + } + + public org.zwobble.precisely.MatchResult match(java.lang.Object actual) { + return this.toMatcher().match(actual); + } + + public org.zwobble.precisely.TextTree describe() { + return this.toMatcher().describe(); + } + + private org.zwobble.precisely.Matcher toMatcher() { + return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName.class, this.submatchers); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher withParts(org.zwobble.precisely.Matcher> parts) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("parts", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageName::parts, parts))).toList()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaPackageNameMatcher body +} -- cgit v1.2.3