From e820ec780dbd52b164857055b5a2a1cc79602bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Habarta?= Date: Fri, 21 Apr 2017 21:53:18 +0200 Subject: [PATCH] Prefixing TypeScript keywords in namespaces (refs #135) --- .../generator/compiler/SymbolTable.java | 34 ++++++++++++++++--- .../typescript/generator/NamingTest.java | 21 ++++++++++++ .../generator/yield/KeywordInPackage.java | 6 ++++ 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 typescript-generator-core/src/test/java/cz/habarta/typescript/generator/yield/KeywordInPackage.java diff --git a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/SymbolTable.java b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/SymbolTable.java index fbe9c2d6d..4017e88f3 100644 --- a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/SymbolTable.java +++ b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/compiler/SymbolTable.java @@ -3,7 +3,9 @@ import cz.habarta.typescript.generator.Settings; import cz.habarta.typescript.generator.util.Pair; +import cz.habarta.typescript.generator.util.Utils; import java.util.*; +import java.util.regex.Pattern; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; @@ -140,17 +142,39 @@ public String getMappedFullName(Class cls) { if (settings.mapPackagesToNamespaces) { final String classNameDotted = cls.getName().replace('$', '.'); - final int index = classNameDotted.lastIndexOf('.'); - if (index == -1) { - return simpleName; - } else { - return classNameDotted.substring(0, index) + "." + simpleName; + final String[] parts = classNameDotted.split(Pattern.quote(".")); + final List safeParts = new ArrayList<>(); + for (String part : Arrays.asList(parts).subList(0, parts.length - 1)) { + safeParts.add(isReservedWord(part) ? "_" + part : part); } + safeParts.add(simpleName); + return Utils.join(safeParts, "."); } else { return simpleName; } } + // https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#221-reserved-words + private static final Set Keywords = new LinkedHashSet<>(Arrays.asList( + "break", "case", "catch", "class", + "const", "continue", "debugger", "default", + "delete", "do", "else", "enum", + "export", "extends", "false", "finally", + "for", "function", "if", "import", + "in", "instanceof", "new", "null", + "return", "super", "switch", "this", + "throw", "true", "try", "typeof", + "var", "void", "while", "with", + + "implements", "interface", "let", "package", + "private", "protected", "public", "static", + "yield" + )); + + private static boolean isReservedWord(String word) { + return Keywords.contains(word); + } + private static boolean isUndefined(Object variable) { // Java 8 // return ScriptObjectMirror.isUndefined(variable); diff --git a/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/NamingTest.java b/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/NamingTest.java index e61f54190..05dadafbb 100644 --- a/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/NamingTest.java +++ b/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/NamingTest.java @@ -2,6 +2,7 @@ package cz.habarta.typescript.generator; import cz.habarta.typescript.generator.compiler.SymbolTable; +import cz.habarta.typescript.generator.yield.KeywordInPackage; import java.util.LinkedHashMap; import org.junit.Assert; import org.junit.Test; @@ -65,4 +66,24 @@ public void testTypeNamingFunctionReturnsUndefined() { Assert.assertEquals("A", name); } + @Test + public void testCombinations() { + final Settings settings = TestUtils.settings(); + settings.customTypeNamingFunction = "function(name, simpleName) { if (name.indexOf('cz.') === 0) return 'Func' + simpleName; }"; + settings.addTypeNamePrefix = "Conf"; + settings.mapPackagesToNamespaces = true; + final SymbolTable symbolTable = new SymbolTable(settings); + Assert.assertEquals("FuncA", symbolTable.getMappedFullName(A.class)); + Assert.assertEquals("java.lang.ConfObject", symbolTable.getMappedFullName(Object.class)); + } + + @Test + public void testTypeScriptKeywords() { + final Settings settings = TestUtils.settings(); + settings.mapPackagesToNamespaces = true; + final SymbolTable symbolTable = new SymbolTable(settings); + final String name = symbolTable.getMappedFullName(KeywordInPackage.class); + Assert.assertEquals("cz.habarta.typescript.generator._yield.KeywordInPackage", name); + } + } diff --git a/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/yield/KeywordInPackage.java b/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/yield/KeywordInPackage.java new file mode 100644 index 000000000..f23fc483a --- /dev/null +++ b/typescript-generator-core/src/test/java/cz/habarta/typescript/generator/yield/KeywordInPackage.java @@ -0,0 +1,6 @@ + +package cz.habarta.typescript.generator.yield; + + +public class KeywordInPackage { +}