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 {
|
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();
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user