fixes an issue in the ResolveGenerics class, closes #677

This commit is contained in:
hneemann 2021-03-13 18:33:47 +01:00
parent f6f457ffa4
commit 82c1ac1190
3 changed files with 48 additions and 11 deletions

View File

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

View File

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

View File

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