mirror of
https://github.com/cincheo/jsweet.git
synced 2025-12-15 15:29:22 +00:00
fix iteration over Set + support Map.entrySet + enable Set methods fallback
This commit is contained in:
parent
cff9a49dc1
commit
3113e63f7d
@ -127,7 +127,7 @@ import com.sun.tools.javac.tree.JCTree.Tag;
|
||||
*/
|
||||
public class Java2TypeScriptAdapter extends PrinterAdapter {
|
||||
|
||||
private final static String VAR_DECL_KEYWORD = Java2TypeScriptTranslator.VAR_DECL_KEYWORD;
|
||||
protected final static String VAR_DECL_KEYWORD = Java2TypeScriptTranslator.VAR_DECL_KEYWORD;
|
||||
|
||||
public Java2TypeScriptTranslator getPrinter() {
|
||||
return (Java2TypeScriptTranslator) super.getPrinter();
|
||||
|
||||
@ -36,8 +36,12 @@ import javax.lang.model.type.TypeMirror;
|
||||
|
||||
import org.jsweet.transpiler.JSweetProblem;
|
||||
import org.jsweet.transpiler.model.ExtendedElement;
|
||||
import org.jsweet.transpiler.model.ForeachLoopElement;
|
||||
import org.jsweet.transpiler.model.MethodInvocationElement;
|
||||
import org.jsweet.transpiler.model.NewClassElement;
|
||||
import org.jsweet.transpiler.model.support.ForeachLoopElementSupport;
|
||||
|
||||
import com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;
|
||||
|
||||
/**
|
||||
* An adapter that removes many uses of Java APIs and replace them with
|
||||
@ -62,6 +66,19 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
|
||||
super.initTypesMapping();
|
||||
SET_CLASS_NAMES.forEach(name -> extTypesMapping.put(name, "Set"));
|
||||
MAP_CLASS_NAMES.forEach(name -> extTypesMapping.put(name, "Map"));
|
||||
extTypesMapping.put(Map.class.getName() + ".Entry", "any");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean substituteForEachLoop(ForeachLoopElement foreachLoop, boolean targetHasLength, String indexVarName) {
|
||||
JCEnhancedForLoop loop = ((ForeachLoopElementSupport) foreachLoop).getTree();
|
||||
if (!targetHasLength && SET_CLASS_NAMES.contains(context.types.erasure(loop.expr.type).toString())) {
|
||||
getPrinter().print(loop.expr).print(".forEach((" + loop.var.name.toString() + ")=>");
|
||||
getPrinter().printIndent().print(loop.body);
|
||||
endIndent().println().printIndent().print(")");
|
||||
return true;
|
||||
}
|
||||
return super.substituteForEachLoop(foreachLoop, targetHasLength, indexVarName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -196,7 +213,7 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
|
||||
print("(").print("Array.from(").print(targetExpression).print(")").print(")");
|
||||
break;
|
||||
default:
|
||||
report(invocation, JSweetProblem.USER_ERROR, targetMethodName + " is not supported.");
|
||||
printCallToEponymMethod(invocation);
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,9 +246,9 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
|
||||
print(")");
|
||||
break;
|
||||
|
||||
case "entries":
|
||||
case "entrySet":
|
||||
printMacroName(targetMethodName);
|
||||
print("((m) => new Set(m.entries()))(");
|
||||
print("((m) => new Set(Array.from(m.entries()).map(entry => ({ getKey: () => entry[0], getValue: () => entry[1] }) ) ))(");
|
||||
print(targetExpression);
|
||||
print(")");
|
||||
break;
|
||||
|
||||
@ -2,6 +2,8 @@ package source.nativestructures;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
public class ES6Maps {
|
||||
public static void main(String[] args) {
|
||||
@ -44,6 +46,22 @@ public class ES6Maps {
|
||||
assert m1.get("1") == 2;
|
||||
assert m1.get("2") == 4;
|
||||
|
||||
// entrySet
|
||||
Set<Entry<String, Integer>> entrySet = m2.entrySet();
|
||||
assert entrySet.size() == 2;
|
||||
boolean firstFound = false;
|
||||
boolean secondFound = false;
|
||||
for (Entry<String, Integer> e : entrySet) {
|
||||
if (e.getKey() == "1" && e.getValue() == 2) {
|
||||
firstFound = true;
|
||||
} else if (e.getKey() == "2" && e.getValue() == 4) {
|
||||
secondFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
assert firstFound;
|
||||
assert secondFound;
|
||||
|
||||
// new HashMap(Collection<>);
|
||||
Map<String, Integer> m3 = new HashMap<>(m2);
|
||||
assert m3.size() == 2;
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
package source.nativestructures;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class ES6Sets {
|
||||
@ -137,5 +139,12 @@ public class ES6Sets {
|
||||
assert "1".equals(ar[0]) || "2".equals(ar[0]);
|
||||
assert "1".equals(ar[1]) || "2".equals(ar[1]);
|
||||
assert !ar[0].equals(ar[1]);
|
||||
|
||||
// forEach
|
||||
List<String> iterated = new ArrayList<>();
|
||||
s11.forEach(str -> iterated.add(str));
|
||||
assert iterated.size() == 2;
|
||||
assert iterated.get(0) == "1";
|
||||
assert iterated.get(1) == "2";
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user