From bf1d5239ea0b6a2017e8f82049446bfc3de2beda Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 May 2026 09:11:46 +0100 Subject: Split writing of Java nodes from generation --- .../generators/javatypes/JavaTypesGenerator.java | 30 ++++++++++++++-------- .../output/java/ast/JavaTypeDeclaration.java | 1 + 2 files changed, 20 insertions(+), 11 deletions(-) (limited to 'src/main') 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 2f024be..6e876f2 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 @@ -32,13 +32,27 @@ public class JavaTypesGenerator implements Generator { @Override public void generate(List namespaces) throws IOException { for (var namespace : namespaces) { - generateNamespace(namespace); + var javaCompilationUnits = generateNamespace(namespace); + + for (var javaCompilationUnit : javaCompilationUnits) { + var javaCompilationUnitPath = this.sourceRootDirectory + .resolve(String.join(File.separator, javaCompilationUnit.packageName())) + .resolve(javaCompilationUnit.typeDeclaration().name() + ".java"); + try (var writer = new JavaWriter(CodeWriter.file(javaCompilationUnitPath))) { + writer.writeCompilationUnit(javaCompilationUnit); + } catch (Exception e) { + // TODO: better handling + throw new RuntimeException(e); + } + } } } - private void generateNamespace(TypedNamespaceNode namespace) throws IOException { + private List generateNamespace(TypedNamespaceNode namespace) { var packageParts = namespaceToJavaPackageParts(namespace.namespaceName()); + var javaCompilationUnits = new ArrayList(); + for (var statement : namespace.body()) { switch (statement) { case TypedStructDefinitionNode structDefinition -> { @@ -55,15 +69,7 @@ public class JavaTypesGenerator implements Generator { ) ); - var javaCompilationUnitPath = this.sourceRootDirectory - .resolve(String.join(File.separator, packageParts)) - .resolve(structDefinition.name() + ".java"); - try (var writer = new JavaWriter(CodeWriter.file(javaCompilationUnitPath))) { - writer.writeCompilationUnit(javaCompilationUnit); - } catch (Exception e) { - // TODO: better handling - throw new RuntimeException(e); - } + javaCompilationUnits.add(javaCompilationUnit); } case TypedSumDefinitionNode sumDefinition -> { @@ -71,6 +77,8 @@ public class JavaTypesGenerator implements Generator { } } } + + return javaCompilationUnits; } private ArrayList namespaceToJavaPackageParts(NamespaceName namespaceName) { diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java index 5f0a3a5..cffb58b 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/java/ast/JavaTypeDeclaration.java @@ -1,4 +1,5 @@ package org.zwobble.hobgoblin.compiler.output.java.ast; public sealed interface JavaTypeDeclaration permits JavaRecordDeclaration { + String name(); } -- cgit v1.2.3