Skip to content

Commit

Permalink
Prefixing TypeScript keywords in namespaces (refs #135)
Browse files Browse the repository at this point in the history
  • Loading branch information
vojtechhabarta committed Apr 21, 2017
1 parent 4a21cec commit e820ec7
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String> 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<String> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

package cz.habarta.typescript.generator.yield;


public class KeywordInPackage {
}

0 comments on commit e820ec7

Please sign in to comment.