diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test b/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test new file mode 100644 index 00000000000..9daeafb9864 --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test @@ -0,0 +1 @@ +test diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test.out b/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test.out new file mode 100644 index 00000000000..d4638597117 --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/1.test.out @@ -0,0 +1,3 @@ + + false ~> . + diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test b/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test new file mode 100644 index 00000000000..180cf832802 --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test @@ -0,0 +1 @@ +test2 diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test.out b/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test.out new file mode 100644 index 00000000000..123601721d8 --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/2.test.out @@ -0,0 +1,3 @@ + + true ~> . + diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/Makefile b/k-distribution/tests/regression-new/issue-2315-id-quotes/Makefile new file mode 100644 index 00000000000..d48aaade4fd --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/Makefile @@ -0,0 +1,7 @@ +DEF=test +EXT=test +TESTDIR=. +KOMPILE_BACKEND=llvm +KOMPILE_FLAGS=--syntax-module TEST + +include ../../../include/kframework/ktest.mak diff --git a/k-distribution/tests/regression-new/issue-2315-id-quotes/test.k b/k-distribution/tests/regression-new/issue-2315-id-quotes/test.k new file mode 100644 index 00000000000..6895d1438d3 --- /dev/null +++ b/k-distribution/tests/regression-new/issue-2315-id-quotes/test.k @@ -0,0 +1,16 @@ +module TEST + imports ID + imports BOOL + imports K-EQUAL + imports STRING + imports INT + + syntax Bool ::= "test" [function] + | "test2" [function] + + // Evaluates to true if the Id constructed by String2Id contains extra quotes + rule test => String2Id("x") ==K #token("\"x\"", "Id") + + // Test that hooks producing a result of sort String are wrapped + rule test2 => Int2String(2) ==K "2" +endmodule diff --git a/kernel/src/main/java/org/kframework/compile/ConstantFolding.java b/kernel/src/main/java/org/kframework/compile/ConstantFolding.java index c2f599269a0..227e04056d4 100644 --- a/kernel/src/main/java/org/kframework/compile/ConstantFolding.java +++ b/kernel/src/main/java/org/kframework/compile/ConstantFolding.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import static org.kframework.Collections.*; import static org.kframework.kore.KORE.*; @@ -113,14 +114,17 @@ private Object unwrap(String token, String hook) { } } - private K wrap(Object result, Sort sort) { + private K wrap(Object result, Sort sort, Module module) { + String resultHookName = module.sortAttributesFor().apply(sort.head()).getOptional(Att.HOOK()).orElse(""); + boolean hasStringHook = resultHookName.equals("STRING.String") || resultHookName.equals("BYTES.Bytes"); + if (result instanceof Boolean) { return KToken(result.toString(), sort); } else if (result instanceof FloatBuiltin) { return KToken(((FloatBuiltin)result).value(), sort); } else if (result instanceof BigInteger) { return KToken(result.toString(), sort); - } else if (result instanceof String) { + } else if (result instanceof String && hasStringHook) { return KToken(StringUtil.enquoteKString((String)result), sort); } else { return KToken(result.toString(), sort); @@ -141,7 +145,7 @@ private K doFolding(String hook, List args, Sort resultSort, Module module) t try { Method m = ConstantFolding.class.getDeclaredMethod(renamedHook, paramTypes.toArray(new Class[args.size()])); Object result = m.invoke(this, unwrappedArgs.toArray(new Object[args.size()])); - return wrap(result, resultSort); + return wrap(result, resultSort, module); } catch (IllegalAccessException e) { throw KEMException.internalError("Error invoking constant folding function", e); } catch (InvocationTargetException e) {