diff --git a/src/main/java/io/github/bensku/tsbind/binding/BindingUtil.java b/src/main/java/io/github/bensku/tsbind/binding/BindingUtil.java new file mode 100644 index 0000000..9c969a6 --- /dev/null +++ b/src/main/java/io/github/bensku/tsbind/binding/BindingUtil.java @@ -0,0 +1,22 @@ +package io.github.bensku.tsbind.binding; + +public class BindingUtil { + private static boolean allUpper(String input) { + for (char c : input.toCharArray()) { + // don't write in this way: if (!Character.isUpperCase(c)) + if (Character.isLowerCase(c)) { + return false; + } + } + return true; + } + + public static boolean isGenericType(String name) { + if (name.length() <= 3 && allUpper(name)) { + return true; + } + + // Like TCommand + return name.length() >= 2 && name.startsWith("T") && Character.isUpperCase(name.toCharArray()[1]); + } +} diff --git a/src/main/java/io/github/bensku/tsbind/binding/TsClass.java b/src/main/java/io/github/bensku/tsbind/binding/TsClass.java index 8dc9267..2ce6c65 100644 --- a/src/main/java/io/github/bensku/tsbind/binding/TsClass.java +++ b/src/main/java/io/github/bensku/tsbind/binding/TsClass.java @@ -283,7 +283,12 @@ private void emitName(String name, TypeRef type, TsEmitter out) { // Needs specialized handling, because we DON'T (always) want package name here out.print(name); if (type instanceof TypeRef.Parametrized) { - out.print("<").print(((TypeRef.Parametrized) type).typeParams(), ", ").print(">"); + List ref = ((TypeRef.Parametrized) type).typeParams(); + if (ref.get(0).name().startsWith("T")) { + out.print("<").print(ref.get(0).name()).print(">"); + } else { + out.print("<").print(ref, ", ").print(">"); + } } } diff --git a/src/main/java/io/github/bensku/tsbind/binding/TsMembers.java b/src/main/java/io/github/bensku/tsbind/binding/TsMembers.java index 17622a3..e134055 100644 --- a/src/main/java/io/github/bensku/tsbind/binding/TsMembers.java +++ b/src/main/java/io/github/bensku/tsbind/binding/TsMembers.java @@ -48,7 +48,7 @@ public class TsMembers { out.print("%s: %s", name, node.type); } }; - + public static final TsGenerator METHOD = (node, out) -> { node.javadoc.ifPresent(out::javadoc); out.indent(); @@ -61,10 +61,10 @@ public class TsMembers { if (!node.typeParams.isEmpty()) { out.print("<"); TypeRef ref = node.typeParams.get(0); - if (ref.name().length() > 1) { - out.print(ref); - } else { + if (BindingUtil.isGenericType(ref.name())) { out.print(ref.name()); + } else { + out.print(ref); } out.print(">"); } diff --git a/src/main/java/io/github/bensku/tsbind/binding/TsTypes.java b/src/main/java/io/github/bensku/tsbind/binding/TsTypes.java index a09ff87..d3a2c66 100644 --- a/src/main/java/io/github/bensku/tsbind/binding/TsTypes.java +++ b/src/main/java/io/github/bensku/tsbind/binding/TsTypes.java @@ -47,10 +47,13 @@ public static Optional primitiveName(TypeRef node) { return; } out.print(base); - if (base.name().length() > 1) { - // TypeScript doesn't support nested generics - out.print("<").print(params, ",").print(">"); + + // TypeScript doesn't support nested generics + if (BindingUtil.isGenericType(base.name())) { + return; } + + out.print("<").print(params, ",").print(">"); }; public static final TsGenerator ARRAY = (node, out) -> {