fix iteration over Set + support Map.entrySet + enable Set methods fallback

This commit is contained in:
Louis Grignon 2020-07-16 01:33:15 +02:00
parent cff9a49dc1
commit 3113e63f7d
4 changed files with 222 additions and 178 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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;

View File

@ -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";
}
}