summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-09-27 10:55:38 +0100
committerMichael Williamson <mike@zwobble.org>2026-09-27 10:55:38 +0100
commit416a876e17a6ea6b2d2440726b81343b0d6c0c2c (patch)
treee30b45fba85b9b96641001c6514a71805884e2fa
parentbfc98eb886211cbe7be00cee8db8e7ca1e6e13f5 (diff)
Generate single import statement for each module in typescript-types
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java27
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
);
})