mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-24 04:42:51 -04:00
fixes an issue in the ResolveGenerics class, closes #677
This commit is contained in:
parent
f6f457ffa4
commit
82c1ac1190
@ -326,18 +326,46 @@ public class ResolveGenerics {
|
||||
if (!key.equals(Context.BASE_FILE_KEY) && !key.equals(SETTINGS_KEY) && !key.equals(GLOBALS_KEY) && !key.equals(THIS_KEY)) {
|
||||
contentSet.add(key);
|
||||
sb.append(key).append(":=");
|
||||
if (val instanceof String) {
|
||||
sb.append("\"");
|
||||
escapeString(sb, (String) val);
|
||||
sb.append("\"");
|
||||
} else if (val instanceof Integer)
|
||||
sb.append("int(").append(val).append(")");
|
||||
else
|
||||
sb.append(val);
|
||||
addToStringBuilder(sb, val);
|
||||
sb.append(";\n");
|
||||
}
|
||||
}
|
||||
|
||||
private static void addToStringBuilder(StringBuilder sb, Object val) {
|
||||
if (val instanceof String) {
|
||||
sb.append("\"");
|
||||
escapeString(sb, (String) val);
|
||||
sb.append("\"");
|
||||
} else if (val instanceof Integer)
|
||||
sb.append("int(").append(val).append(")");
|
||||
else if (val instanceof List) {
|
||||
sb.append("newList(");
|
||||
boolean first = true;
|
||||
for (Object o : (List<?>) val) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
sb.append(",");
|
||||
addToStringBuilder(sb, o);
|
||||
}
|
||||
sb.append(")");
|
||||
} else if (val instanceof Map) {
|
||||
sb.append("{");
|
||||
boolean first = true;
|
||||
for (Map.Entry<?, ?> e : ((Map<?, ?>) val).entrySet()) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
sb.append(",");
|
||||
sb.append(e.getKey().toString());
|
||||
sb.append(":");
|
||||
addToStringBuilder(sb, e.getValue());
|
||||
}
|
||||
sb.append("}");
|
||||
} else
|
||||
sb.append(val);
|
||||
}
|
||||
|
||||
static void escapeString(StringBuilder sb, String str) {
|
||||
for (int i = 0; i < str.length(); i++) {
|
||||
char c = str.charAt(i);
|
||||
|
@ -56,7 +56,6 @@ public class Context implements HGSMap {
|
||||
BUILT_IN.put("identifier", new FunctionIdentifier());
|
||||
BUILT_IN.put("loadHex", new FunctionLoadHex());
|
||||
BUILT_IN.put("sizeOf", new Func(1, args -> Value.toArray(args[0]).hgsArraySize()));
|
||||
BUILT_IN.put("newMap", new Func(0, args -> new HashMap()));
|
||||
BUILT_IN.put("newList", new Func(-1, args -> new ArrayList<>(Arrays.asList(args))));
|
||||
}
|
||||
|
||||
|
@ -343,7 +343,17 @@ public class ParserTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testParseTemplateMap() throws IOException, ParserException, HGSEvalException {
|
||||
Context c = exec("<? m:=newMap(); m.test:=newMap(); m.test.val:=7; print(m.test.val); ?>;");
|
||||
Context c = exec("<? m:={}; m.test:={}; m.test.val:=7; print(m.test.val); ?>;");
|
||||
assertEquals("7;", c.toString());
|
||||
Object mo = c.getVar("m");
|
||||
assertTrue(mo instanceof Map);
|
||||
mo = ((Map) mo).get("test");
|
||||
assertTrue(mo instanceof Map);
|
||||
assertEquals(7L, ((Map) mo).get("val"));
|
||||
}
|
||||
|
||||
public void testParseTemplateMap2() throws IOException, ParserException, HGSEvalException {
|
||||
Context c = exec("<? m:={test:{val:7}}; print(m.test.val); ?>;");
|
||||
assertEquals("7;", c.toString());
|
||||
Object mo = c.getVar("m");
|
||||
assertTrue(mo instanceof Map);
|
||||
@ -442,7 +452,7 @@ public class ParserTest extends TestCase {
|
||||
assertEquals("13", exec("<? f:=func(a,b){return a+2*b;}; print(f(1,a*2));?>",
|
||||
new Context().declareVar("a", 3)).toString());
|
||||
|
||||
assertEquals("18", exec("<? m:=newMap(); m.f:=func(a){m:=newMap(); m.v:=a*a+2; return m;}; print(m.f(4).v);?>").toString());
|
||||
assertEquals("18", exec("<? m:={f:func(a){return {v:a*a+2};}}; print(m.f(4).v);?>").toString());
|
||||
assertEquals("18", exec("<? m:=newList(); m[0]:=func(a){ l:=newList(); l[0]:=a*a+2; return l;}; print(m[0](4)[0]);?>").toString());
|
||||
|
||||
failToEval("<? return 1; ?>", new Context());
|
||||
|
Loading…
x
Reference in New Issue
Block a user