Skip to content

Commit 7548022

Browse files
authored
Fix unbalanced block exception when pretty printing heap terms (#3726)
2 parents 16a6357 + fcd0a2f commit 7548022

File tree

4 files changed

+58
-19
lines changed

4 files changed

+58
-19
lines changed

key.core/src/main/java/de/uka/ilkd/key/pp/LogicPrinter.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,9 @@ public static String quickPrintTerm(JTerm t, Services services) {
169169
public static String quickPrintTerm(JTerm t, Services services, boolean usePrettyPrinting,
170170
boolean useUnicodeSymbols) {
171171
var p = quickPrinter(services, usePrettyPrinting, useUnicodeSymbols);
172+
p.layouter().beginC();
172173
p.printTerm(t);
174+
p.layouter().end();
173175
return p.result();
174176
}
175177

@@ -780,6 +782,7 @@ public void printConstrainedFormula(SequentFormula cfma) {
780782
* @param t the Term to be printed
781783
*/
782784
public void printTerm(JTerm t) {
785+
layouter.beginC();
783786
if (notationInfo.getAbbrevMap().isEnabled(t)) {
784787
layouter.startTerm(0);
785788
layouter.print(notationInfo.getAbbrevMap().getAbbrev(t));
@@ -797,6 +800,7 @@ public void printTerm(JTerm t) {
797800
if (t.hasLabels()) {
798801
printLabels(t);
799802
}
803+
layouter.end();
800804
}
801805

802806
/**
@@ -989,7 +993,7 @@ protected boolean printEmbeddedHeapConstructorTerm(JTerm t) {
989993

990994
Notation notation = notationInfo.getNotation(t.op());
991995
if (notation instanceof HeapConstructorNotation heapNotation) {
992-
heapNotation.printEmbeddedHeap(t, this);
996+
heapNotation.print(t, this);
993997
return true;
994998
} else {
995999
printTerm(t);
@@ -1001,7 +1005,7 @@ public void printClassName(String className) {
10011005
layouter.print(className);
10021006
}
10031007

1004-
public void printHeapConstructor(JTerm t, boolean closingBrace) {
1008+
public void printHeapConstructor(JTerm t) {
10051009
assert t.boundVars().isEmpty();
10061010

10071011
final HeapLDT heapLDT = getHeapLDT();
@@ -1045,10 +1049,9 @@ public void printHeapConstructor(JTerm t, boolean closingBrace) {
10451049

10461050
layouter.print(")]").end();
10471051

1048-
if (closingBrace) {
1052+
if (!hasEmbedded) {
10491053
layouter.end();
10501054
}
1051-
10521055
} else {
10531056
printFunctionTerm(t);
10541057
}
@@ -1753,7 +1756,7 @@ public String result() {
17531756
protected void maybeParens(JTerm t, int ass) {
17541757
if (t.op() instanceof SchemaVariable && instantiations != null
17551758
&& instantiations.getInstantiation((SchemaVariable) t.op()) instanceof JTerm) {
1756-
t = (JTerm) instantiations.getInstantiation((SchemaVariable) t.op());
1759+
t = instantiations.getInstantiation((SchemaVariable) t.op());
17571760
}
17581761

17591762
if (notationInfo.getNotation(t.op()).getPriority() < ass) {

key.core/src/main/java/de/uka/ilkd/key/pp/Notation.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,7 @@ public HeapConstructorNotation() {
392392
}
393393

394394
public void print(JTerm t, LogicPrinter sp) {
395-
sp.printHeapConstructor(t, true);
396-
}
397-
398-
public void printEmbeddedHeap(JTerm t, LogicPrinter sp) {
399-
sp.printHeapConstructor(t, false);
395+
sp.printHeapConstructor(t);
400396
}
401397
}
402398

key.core/src/main/java/de/uka/ilkd/key/pp/StorePrinter.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class StorePrinter extends FieldPrinter {
2525
* Common code for all pretty-printed store variants. This section is executed at the beginning
2626
* of pretty-printing.
2727
*/
28-
private void initPrettyPrint(LogicPrinter lp, final JTerm heapTerm) {
28+
private boolean initPrettyPrint(LogicPrinter lp, final JTerm heapTerm) {
2929
lp.layouter.startTerm(4);
3030

3131
lp.layouter.markStartSub();
@@ -39,6 +39,8 @@ private void initPrettyPrint(LogicPrinter lp, final JTerm heapTerm) {
3939
}
4040

4141
lp.layouter.print("[");
42+
43+
return hasEmbedded;
4244
}
4345

4446
/*
@@ -96,7 +98,7 @@ void printStore(LogicPrinter lp, JTerm t, boolean closingBrace) {
9698
private void printStoreOnArrayElement(LogicPrinter lp, final JTerm heapTerm,
9799
final JTerm objectTerm,
98100
final JTerm fieldTerm, final JTerm valueTerm, boolean closingBrace) {
99-
initPrettyPrint(lp, heapTerm);
101+
boolean embedded = initPrettyPrint(lp, heapTerm);
100102

101103
PosTableLayouter layouter = lp.layouter();
102104
layouter.markStartSub();
@@ -114,7 +116,7 @@ private void printStoreOnArrayElement(LogicPrinter lp, final JTerm heapTerm,
114116

115117
layouter.print("]");
116118

117-
finishPrettyPrint(lp, valueTerm, closingBrace);
119+
finishPrettyPrint(lp, valueTerm, !embedded);
118120
}
119121

120122
/*
@@ -123,7 +125,7 @@ private void printStoreOnArrayElement(LogicPrinter lp, final JTerm heapTerm,
123125
private void printStoreOnJavaFieldConstant(LogicPrinter lp, final JTerm heapTerm,
124126
final JTerm objectTerm,
125127
final JTerm fieldTerm, final JTerm valueTerm, boolean closingBrace) {
126-
initPrettyPrint(lp, heapTerm);
128+
boolean embedded = initPrettyPrint(lp, heapTerm);
127129

128130
lp.layouter.markStartSub();
129131
lp.printTerm(objectTerm);
@@ -137,13 +139,13 @@ private void printStoreOnJavaFieldConstant(LogicPrinter lp, final JTerm heapTerm
137139
lp.printLabels(fieldTerm);
138140
lp.layouter.markEndSub();
139141

140-
finishPrettyPrint(lp, valueTerm, closingBrace);
142+
finishPrettyPrint(lp, valueTerm, !embedded);
141143
}
142144

143145
private void printStoreOnGenericFieldConstant(LogicPrinter lp, final JTerm heapTerm,
144146
final JTerm objectTerm,
145147
final JTerm fieldTerm, final JTerm valueTerm, boolean closingBrace) {
146-
initPrettyPrint(lp, heapTerm);
148+
boolean embedded = initPrettyPrint(lp, heapTerm);
147149

148150
lp.layouter.markStartSub();
149151
lp.printTerm(objectTerm);
@@ -156,7 +158,7 @@ private void printStoreOnGenericFieldConstant(LogicPrinter lp, final JTerm heapT
156158
lp.layouter.print(HeapLDT.getPrettyFieldName(fieldTerm.op()));
157159
lp.layouter.markEndSub();
158160

159-
finishPrettyPrint(lp, valueTerm, closingBrace);
161+
finishPrettyPrint(lp, valueTerm, !embedded);
160162
}
161163

162164
/*
@@ -165,7 +167,7 @@ private void printStoreOnGenericFieldConstant(LogicPrinter lp, final JTerm heapT
165167
private void printStoreOnStaticField(LogicPrinter lp, final JTerm heapTerm,
166168
final JTerm fieldTerm,
167169
final JTerm valueTerm, boolean closingBrace) {
168-
initPrettyPrint(lp, heapTerm);
170+
boolean embedded = initPrettyPrint(lp, heapTerm);
169171

170172
String className = HeapLDT.getClassName((Function) fieldTerm.op());
171173

@@ -187,7 +189,7 @@ private void printStoreOnStaticField(LogicPrinter lp, final JTerm heapTerm,
187189
lp.layouter.print(HeapLDT.getPrettyFieldName(fieldTerm.op()));
188190
lp.layouter.markEndSub();
189191

190-
finishPrettyPrint(lp, valueTerm, closingBrace);
192+
finishPrettyPrint(lp, valueTerm, !embedded);
191193
}
192194

193195
}

key.core/src/test/java/de/uka/ilkd/key/pp/LogicPrinterTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.io.IOException;
77

88
import de.uka.ilkd.key.java.Services;
9+
import de.uka.ilkd.key.logic.JTerm;
910
import de.uka.ilkd.key.logic.NamespaceSet;
1011
import de.uka.ilkd.key.logic.op.JModality;
1112
import de.uka.ilkd.key.nparser.KeyIO;
@@ -52,4 +53,41 @@ void printModalityTerm() {
5253
lp.printTaclet(taclet, inst, true, false);
5354
assertTrue(true);
5455
}
56+
57+
@Test
58+
void printAnonUpdateTerm1() {
59+
Services services = TacletForTests.services().copy(false);
60+
KeyIO io = new KeyIO(services, services.getNamespaces());
61+
JTerm problem = null;
62+
try {
63+
problem = (JTerm) io
64+
.load(
65+
"""
66+
\\functions {
67+
Heap h1;
68+
Heap h2;
69+
Heap h3;
70+
Field fld;
71+
}
72+
73+
\\programVariables { Object o; }
74+
75+
\\problem {
76+
anon(store(h1, o, fld, null), union(union(allFields(o), singleton(o,fld)), allObjects(fld)), h2) = h3
77+
}
78+
""")
79+
.loadCompleteProblem().getProblem().succedent().getFirst().formula();
80+
} catch (IOException e) {
81+
throw new RuntimeException(e);
82+
}
83+
try {
84+
LogicPrinter.quickPrintTerm(problem, services);
85+
} catch (Exception e) {
86+
fail(e.getMessage());
87+
return;
88+
}
89+
assertTrue(true);
90+
}
91+
92+
5593
}

0 commit comments

Comments
 (0)