diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-09-27 10:55:38 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-09-27 10:55:38 +0100 |
| commit | 416a876e17a6ea6b2d2440726b81343b0d6c0c2c (patch) | |
| tree | e30b45fba85b9b96641001c6514a71805884e2fa | |
| parent | bfc98eb886211cbe7be00cee8db8e7ca1e6e13f5 (diff) | |
Generate single import statement for each module in typescript-types
2 files changed, 22 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java index 44bad46..68d1610 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java @@ -11,9 +11,7 @@ import org.zwobble.hobgoblin.compiler.util.Casing; import java.io.File; import java.io.IOException; import java.nio.file.Path; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.SequencedSet; +import java.util.*; import java.util.stream.Collectors; public class TypescriptGenerator { @@ -38,7 +36,7 @@ public class TypescriptGenerator { public record RequiredType(SimpleType type, TypescriptIdentifier importName) {} public static class Context { - private final SequencedSet<RequiredType> requiredTypes = new LinkedHashSet<>(); + private final SequencedMap<NamespaceName, SequencedSet<RequiredType>> requiredTypes = new LinkedHashMap<>(); private final NamespaceName namespaceName; private final TypesInfo typesInfo; @@ -52,10 +50,13 @@ public class TypescriptGenerator { } public void requireType(SimpleType type, TypescriptIdentifier importName) { - this.requiredTypes.add(new RequiredType(type, importName)); + this.requiredTypes.putIfAbsent(type.namespaceName(), new LinkedHashSet<>()); + this.requiredTypes + .get(type.namespaceName()) + .add(new RequiredType(type, importName)); } - public SequencedSet<RequiredType> requiredTypes() { + public SequencedMap<NamespaceName, SequencedSet<RequiredType>> requiredTypes() { return requiredTypes; } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java index ede1587..353f07b 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java @@ -101,25 +101,28 @@ public class TypescriptTypesGenerator implements Generator { .flatMap(statement -> generateNamespaceStatement(statement, context).stream()) .toList(); - // TODO: combine imports from same module - - var imports = context.requiredTypes().stream() - .map(requiredType -> { - var exportName = this.typescriptGenerator.generateTypeName(requiredType.type().name()); + var imports = context.requiredTypes().entrySet().stream() + .map(requiredTypesFromNamespace -> { + var namespaceName = requiredTypesFromNamespace.getKey(); + var requiredTypes = requiredTypesFromNamespace.getValue(); var moduleRoot = "./" + "../".repeat(namespace.namespaceName().parts().size() - 1); - var fromModule = moduleRoot + requiredType.type().namespaceName().parts().stream() + var fromModule = moduleRoot + namespaceName.parts().stream() .map(part -> this.typescriptGenerator.generateModuleName(part).value()) // TODO: handle extensions .collect(Collectors.joining("/")) + ".ts"; return new TypescriptImportDeclaration( - List.of( - new TypescriptNamedImport( - exportName, - requiredType.importName() - ) - ), + requiredTypes.stream() + .map(requiredType -> { + var exportName = this.typescriptGenerator.generateTypeName(requiredType.type().name()); + + return new TypescriptNamedImport( + exportName, + requiredType.importName() + ); + }) + .toList(), fromModule ); }) |
