Skip to content

Commit e820ec7

Browse files
Prefixing TypeScript keywords in namespaces (refs #135)
1 parent 4a21cec commit e820ec7

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/SymbolTable.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
import cz.habarta.typescript.generator.Settings;
55
import cz.habarta.typescript.generator.util.Pair;
6+
import cz.habarta.typescript.generator.util.Utils;
67
import java.util.*;
8+
import java.util.regex.Pattern;
79
import javax.script.Invocable;
810
import javax.script.ScriptEngine;
911
import javax.script.ScriptEngineFactory;
@@ -140,17 +142,39 @@ public String getMappedFullName(Class<?> cls) {
140142

141143
if (settings.mapPackagesToNamespaces) {
142144
final String classNameDotted = cls.getName().replace('$', '.');
143-
final int index = classNameDotted.lastIndexOf('.');
144-
if (index == -1) {
145-
return simpleName;
146-
} else {
147-
return classNameDotted.substring(0, index) + "." + simpleName;
145+
final String[] parts = classNameDotted.split(Pattern.quote("."));
146+
final List<String> safeParts = new ArrayList<>();
147+
for (String part : Arrays.asList(parts).subList(0, parts.length - 1)) {
148+
safeParts.add(isReservedWord(part) ? "_" + part : part);
148149
}
150+
safeParts.add(simpleName);
151+
return Utils.join(safeParts, ".");
149152
} else {
150153
return simpleName;
151154
}
152155
}
153156

157+
// https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#221-reserved-words
158+
private static final Set<String> Keywords = new LinkedHashSet<>(Arrays.asList(
159+
"break", "case", "catch", "class",
160+
"const", "continue", "debugger", "default",
161+
"delete", "do", "else", "enum",
162+
"export", "extends", "false", "finally",
163+
"for", "function", "if", "import",
164+
"in", "instanceof", "new", "null",
165+
"return", "super", "switch", "this",
166+
"throw", "true", "try", "typeof",
167+
"var", "void", "while", "with",
168+
169+
"implements", "interface", "let", "package",
170+
"private", "protected", "public", "static",
171+
"yield"
172+
));
173+
174+
private static boolean isReservedWord(String word) {
175+
return Keywords.contains(word);
176+
}
177+
154178
private static boolean isUndefined(Object variable) {
155179
// Java 8
156180
// return ScriptObjectMirror.isUndefined(variable);

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/NamingTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.compiler.SymbolTable;
5+
import cz.habarta.typescript.generator.yield.KeywordInPackage;
56
import java.util.LinkedHashMap;
67
import org.junit.Assert;
78
import org.junit.Test;
@@ -65,4 +66,24 @@ public void testTypeNamingFunctionReturnsUndefined() {
6566
Assert.assertEquals("A", name);
6667
}
6768

69+
@Test
70+
public void testCombinations() {
71+
final Settings settings = TestUtils.settings();
72+
settings.customTypeNamingFunction = "function(name, simpleName) { if (name.indexOf('cz.') === 0) return 'Func' + simpleName; }";
73+
settings.addTypeNamePrefix = "Conf";
74+
settings.mapPackagesToNamespaces = true;
75+
final SymbolTable symbolTable = new SymbolTable(settings);
76+
Assert.assertEquals("FuncA", symbolTable.getMappedFullName(A.class));
77+
Assert.assertEquals("java.lang.ConfObject", symbolTable.getMappedFullName(Object.class));
78+
}
79+
80+
@Test
81+
public void testTypeScriptKeywords() {
82+
final Settings settings = TestUtils.settings();
83+
settings.mapPackagesToNamespaces = true;
84+
final SymbolTable symbolTable = new SymbolTable(settings);
85+
final String name = symbolTable.getMappedFullName(KeywordInPackage.class);
86+
Assert.assertEquals("cz.habarta.typescript.generator._yield.KeywordInPackage", name);
87+
}
88+
6889
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
package cz.habarta.typescript.generator.yield;
3+
4+
5+
public class KeywordInPackage {
6+
}

0 commit comments

Comments
 (0)