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 { 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() { public Java2TypeScriptTranslator getPrinter() {
return (Java2TypeScriptTranslator) super.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.JSweetProblem;
import org.jsweet.transpiler.model.ExtendedElement; import org.jsweet.transpiler.model.ExtendedElement;
import org.jsweet.transpiler.model.ForeachLoopElement;
import org.jsweet.transpiler.model.MethodInvocationElement; import org.jsweet.transpiler.model.MethodInvocationElement;
import org.jsweet.transpiler.model.NewClassElement; 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 * An adapter that removes many uses of Java APIs and replace them with
@ -62,6 +66,19 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
super.initTypesMapping(); super.initTypesMapping();
SET_CLASS_NAMES.forEach(name -> extTypesMapping.put(name, "Set")); SET_CLASS_NAMES.forEach(name -> extTypesMapping.put(name, "Set"));
MAP_CLASS_NAMES.forEach(name -> extTypesMapping.put(name, "Map")); 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 @Override
@ -196,7 +213,7 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
print("(").print("Array.from(").print(targetExpression).print(")").print(")"); print("(").print("Array.from(").print(targetExpression).print(")").print(")");
break; break;
default: default:
report(invocation, JSweetProblem.USER_ERROR, targetMethodName + " is not supported."); printCallToEponymMethod(invocation);
} }
} }
@ -229,9 +246,9 @@ public class RemoveJavaDependenciesES6Adapter extends RemoveJavaDependenciesAdap
print(")"); print(")");
break; break;
case "entries": case "entrySet":
printMacroName(targetMethodName); 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(targetExpression);
print(")"); print(")");
break; break;

View File

@ -2,62 +2,80 @@ package source.nativestructures;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class ES6Maps { public class ES6Maps {
public static void main(String[] args) { public static void main(String[] args) {
// put / clear // put / clear
Map<String, Integer> m1 = new HashMap<>(); Map<String, Integer> m1 = new HashMap<>();
assert m1.size() == 0; assert m1.size() == 0;
Integer prev = m1.put("1", 1); Integer prev = m1.put("1", 1);
assert prev == null; assert prev == null;
assert !m1.isEmpty(); assert !m1.isEmpty();
Integer prev2 = m1.put("1", 2);
assert prev2 == 1;
assert m1.size() == 1;
// clear
m1.clear();
assert m1.size() == 0;
assert m1.isEmpty();
// containsKey / containsValue / remove Integer prev2 = m1.put("1", 2);
m1.put("1", 2); assert prev2 == 1;
boolean containsKey1 = m1.containsKey("1"); assert m1.size() == 1;
assert containsKey1;
boolean containsValue1 = m1.containsValue(2);
assert containsValue1;
Integer removed = m1.remove("1");
assert removed == 2;
boolean containsKey2 = m1.containsKey("1"); // clear
assert !containsKey2; m1.clear();
boolean containsValue2 = m1.containsValue(2); assert m1.size() == 0;
assert !containsValue2; assert m1.isEmpty();
// putAll // containsKey / containsValue / remove
Map<String, Integer> m2 = new HashMap<>(); m1.put("1", 2);
m2.put("1", 2); boolean containsKey1 = m1.containsKey("1");
m2.put("2", 4); assert containsKey1;
m1.putAll(m2); boolean containsValue1 = m1.containsValue(2);
assert m1.size() == 2; assert containsValue1;
assert m1.get("1") == 2; Integer removed = m1.remove("1");
assert m1.get("2") == 4; assert removed == 2;
// new HashMap(Collection<>); boolean containsKey2 = m1.containsKey("1");
Map<String, Integer> m3 = new HashMap<>(m2); assert !containsKey2;
assert m3.size() == 2; boolean containsValue2 = m1.containsValue(2);
assert m3.get("1") == 2; assert !containsValue2;
assert m3.get("2") == 4;
// new HashMap(int initialCapacity); // putAll
Map<String, Integer> m4 = new HashMap<>(15); Map<String, Integer> m2 = new HashMap<>();
assert m4.size() == 0; m2.put("1", 2);
assert m4.isEmpty(); m2.put("2", 4);
m1.putAll(m2);
assert m1.size() == 2;
assert m1.get("1") == 2;
assert m1.get("2") == 4;
// new HashMap(int initialCapacity, float loadFactor); // entrySet
m4 = new HashMap<>(15, 89); Set<Entry<String, Integer>> entrySet = m2.entrySet();
assert m4.size() == 0; assert entrySet.size() == 2;
assert m4.isEmpty(); 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;
assert m3.get("1") == 2;
assert m3.get("2") == 4;
// new HashMap(int initialCapacity);
Map<String, Integer> m4 = new HashMap<>(15);
assert m4.size() == 0;
assert m4.isEmpty();
// new HashMap(int initialCapacity, float loadFactor);
m4 = new HashMap<>(15, 89);
assert m4.size() == 0;
assert m4.isEmpty();
}
} }

View File

@ -1,141 +1,150 @@
package source.nativestructures; package source.nativestructures;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class ES6Sets { public class ES6Sets {
public static void main(String[] args) { public static void main(String[] args) {
// add // add
Set s1 = new HashSet(); Set s1 = new HashSet();
assert s1.size() == 0; assert s1.size() == 0;
boolean added = s1.add("1"); boolean added = s1.add("1");
assert added; assert added;
s1.add("2"); s1.add("2");
boolean added2 = s1.add("2"); boolean added2 = s1.add("2");
assert !added2; assert !added2;
assert s1.size() == 2; assert s1.size() == 2;
s1.clear(); s1.clear();
assert s1.size() == 0; assert s1.size() == 0;
// remove // remove
Set<String> s2 = new HashSet<>(); Set<String> s2 = new HashSet<>();
s2.add("1"); s2.add("1");
assert s2.size() == 1; assert s2.size() == 1;
assert s2.remove("1"); assert s2.remove("1");
assert s2.size() == 0; assert s2.size() == 0;
s2.add("2"); s2.add("2");
assert !s2.remove("1"); assert !s2.remove("1");
assert s2.size() == 1; assert s2.size() == 1;
assert !s2.isEmpty(); assert !s2.isEmpty();
Set<Integer> s3 = new HashSet<>(); Set<Integer> s3 = new HashSet<>();
s3.add(1); s3.add(1);
assert s3.size() == 1; assert s3.size() == 1;
assert s3.remove(1); assert s3.remove(1);
assert s3.size() == 0; assert s3.size() == 0;
s3.add(2); s3.add(2);
assert !s3.remove(1); assert !s3.remove(1);
assert s3.size() == 1; assert s3.size() == 1;
// contains // contains
Set<String> s4A = new HashSet<>(); Set<String> s4A = new HashSet<>();
Set<String> s4B = new HashSet<>(); Set<String> s4B = new HashSet<>();
Set<String> s4C = new HashSet<>(); Set<String> s4C = new HashSet<>();
Set<Set<String>> s4 = new HashSet<>(); Set<Set<String>> s4 = new HashSet<>();
s4.add(s4A); s4.add(s4A);
s4.add(s4B); s4.add(s4B);
assert s4.size() == 2; assert s4.size() == 2;
assert s4.contains(s4A); assert s4.contains(s4A);
assert s4.contains(s4B); assert s4.contains(s4B);
assert !s4.contains(s4C); assert !s4.contains(s4C);
// addAll // addAll
Set<String> s5A = new HashSet<>(); Set<String> s5A = new HashSet<>();
s5A.add("1"); s5A.add("1");
s5A.add("2"); s5A.add("2");
Set<String> s5B = new HashSet<>(); Set<String> s5B = new HashSet<>();
s5B.add("3"); s5B.add("3");
s5B.add("4"); s5B.add("4");
Set<String> s5Merged = new HashSet<>(); Set<String> s5Merged = new HashSet<>();
boolean addedAll = s5Merged.addAll(s5A); boolean addedAll = s5Merged.addAll(s5A);
assert addedAll; assert addedAll;
s5Merged.addAll(s5B); s5Merged.addAll(s5B);
assert s5Merged.size() == 4; assert s5Merged.size() == 4;
for (int i = 1; i <= 4; i++) { for (int i = 1; i <= 4; i++) {
assert s5Merged.contains("" + i); assert s5Merged.contains("" + i);
} }
// new HashSet(Collection<>); // new HashSet(Collection<>);
Set<String> s6A = new HashSet<>(); Set<String> s6A = new HashSet<>();
s6A.add("1"); s6A.add("1");
s6A.add("2"); s6A.add("2");
Set<String> s6 = new HashSet<>(s6A); Set<String> s6 = new HashSet<>(s6A);
assert s6.size() == 2; assert s6.size() == 2;
for (int i = 1; i <= 2; i++) { for (int i = 1; i <= 2; i++) {
assert s6.contains("" + i); assert s6.contains("" + i);
} }
// new HashSet(int initialCapacity); // new HashSet(int initialCapacity);
Set<String> s7 = new HashSet<>(10); Set<String> s7 = new HashSet<>(10);
assert s7.size() == 0; assert s7.size() == 0;
assert s7.isEmpty(); assert s7.isEmpty();
// new HashSet(int initialCapacity, float loadFactor); // new HashSet(int initialCapacity, float loadFactor);
Set<String> s8 = new HashSet<>(10, 11); Set<String> s8 = new HashSet<>(10, 11);
assert s8.size() == 0; assert s8.size() == 0;
assert s8.isEmpty(); assert s8.isEmpty();
// removeAll // removeAll
Set<String> s9A = new HashSet<>(); Set<String> s9A = new HashSet<>();
s9A.add("1"); s9A.add("1");
s9A.add("3"); s9A.add("3");
s9A.add("5"); s9A.add("5");
s9A.add("7"); s9A.add("7");
Set<String> s9 = new HashSet<>(); Set<String> s9 = new HashSet<>();
s9.add("1"); s9.add("1");
s9.add("2"); s9.add("2");
s9.add("3"); s9.add("3");
s9.add("4"); s9.add("4");
s9.add("5"); s9.add("5");
assert s9.size() == 5; assert s9.size() == 5;
boolean removedAll = s9.removeAll(s9A); boolean removedAll = s9.removeAll(s9A);
assert removedAll; assert removedAll;
assert s9.size() == 2; assert s9.size() == 2;
assert s9.contains("2"); assert s9.contains("2");
assert !s9.contains("3"); assert !s9.contains("3");
assert s9.contains("4"); assert s9.contains("4");
// retainAll // retainAll
Set<String> s10A = new HashSet<>(); Set<String> s10A = new HashSet<>();
s10A.add("1"); s10A.add("1");
s10A.add("3"); s10A.add("3");
s10A.add("5"); s10A.add("5");
s10A.add("7"); s10A.add("7");
Set<String> s10 = new HashSet<>(); Set<String> s10 = new HashSet<>();
s10.add("1"); s10.add("1");
s10.add("2"); s10.add("2");
s10.add("3"); s10.add("3");
s10.add("4"); s10.add("4");
s10.add("5"); s10.add("5");
assert s10.size() == 5; assert s10.size() == 5;
boolean retainedAll = s10.retainAll(s10A); boolean retainedAll = s10.retainAll(s10A);
assert retainedAll; assert retainedAll;
assert s10.size() == 3; assert s10.size() == 3;
assert s10.contains("1"); assert s10.contains("1");
assert !s10.contains("2"); assert !s10.contains("2");
assert s10.contains("3"); assert s10.contains("3");
assert !s10.contains("4"); assert !s10.contains("4");
assert s10.contains("5"); assert s10.contains("5");
assert !s10.contains("7"); assert !s10.contains("7");
// toArray // toArray
Set<String> s11 = new HashSet<>(); Set<String> s11 = new HashSet<>();
s11.add("1"); s11.add("1");
s11.add("2"); s11.add("2");
String[] ar = (String[]) s11.toArray(); String[] ar = (String[]) s11.toArray();
assert ar.length == 2; assert ar.length == 2;
assert "1".equals(ar[0]) || "2".equals(ar[0]); assert "1".equals(ar[0]) || "2".equals(ar[0]);
assert "1".equals(ar[1]) || "2".equals(ar[1]); assert "1".equals(ar[1]) || "2".equals(ar[1]);
assert !ar[0].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";
}
} }