Skip to content

Commit 08af804

Browse files
authored
Error Refactoring (#123)
1 parent 308ad81 commit 08af804

24 files changed

+173
-176
lines changed

liquidjava-verifier/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<groupId>io.github.liquid-java</groupId>
1313
<artifactId>liquidjava-verifier</artifactId>
14-
<version>0.0.2</version>
14+
<version>0.0.4</version>
1515
<name>liquidjava-verifier</name>
1616
<description>LiquidJava Verifier</description>
1717
<url>https://github.com/liquid-java/liquidjava</url>

liquidjava-verifier/src/main/java/liquidjava/diagnostics/LJDiagnostic.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@ public class LJDiagnostic extends RuntimeException {
1010

1111
private final String title;
1212
private final String message;
13-
private final String details;
1413
private final String file;
1514
private final ErrorPosition position;
1615
private final String accentColor;
1716

18-
public LJDiagnostic(String title, String message, String details, SourcePosition pos, String accentColor) {
17+
public LJDiagnostic(String title, String message, SourcePosition pos, String accentColor) {
1918
this.title = title;
2019
this.message = message;
21-
this.details = details;
22-
this.file = pos != null ? pos.getFile().getPath() : null;
20+
this.file = (pos != null && pos.getFile() != null) ? pos.getFile().getPath() : null;
2321
this.position = ErrorPosition.fromSpoonPosition(pos);
2422
this.accentColor = accentColor;
2523
}
@@ -33,7 +31,7 @@ public String getMessage() {
3331
}
3432

3533
public String getDetails() {
36-
return details;
34+
return ""; // to be overridden by subclasses
3735
}
3836

3937
public ErrorPosition getPosition() {
@@ -44,13 +42,17 @@ public String getFile() {
4442
return file;
4543
}
4644

45+
public String getAccentColor() {
46+
return accentColor;
47+
}
48+
4749
@Override
4850
public String toString() {
4951
StringBuilder sb = new StringBuilder();
5052

5153
// title
52-
sb.append("\n").append(accentColor).append(title).append(": ").append(Colors.RESET)
53-
.append(message.toLowerCase()).append("\n");
54+
sb.append("\n").append(accentColor).append(title).append(": ").append(Colors.RESET).append(message)
55+
.append("\n");
5456

5557
// snippet
5658
String snippet = getSnippet();
@@ -59,7 +61,8 @@ public String toString() {
5961
}
6062

6163
// details
62-
if (details != null && !details.isEmpty()) {
64+
String details = getDetails();
65+
if (!details.isEmpty()) {
6366
sb.append(" --> ").append(String.join("\n ", details.split("\n"))).append("\n");
6467
}
6568

@@ -124,7 +127,6 @@ public boolean equals(Object obj) {
124127
return false;
125128
LJDiagnostic other = (LJDiagnostic) obj;
126129
return title.equals(other.title) && message.equals(other.message)
127-
&& ((details == null && other.details == null) || (details != null && details.equals(other.details)))
128130
&& ((file == null && other.file == null) || (file != null && file.equals(other.file)))
129131
&& ((position == null && other.position == null)
130132
|| (position != null && position.equals(other.position)));
@@ -134,7 +136,6 @@ public boolean equals(Object obj) {
134136
public int hashCode() {
135137
int result = title.hashCode();
136138
result = 31 * result + message.hashCode();
137-
result = 31 * result + (details != null ? details.hashCode() : 0);
138139
result = 31 * result + (file != null ? file.hashCode() : 0);
139140
result = 31 * result + (position != null ? position.hashCode() : 0);
140141
return result;
Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package liquidjava.diagnostics.errors;
22

33
import spoon.reflect.cu.SourcePosition;
4-
import spoon.reflect.declaration.CtElement;
54

65
/**
76
* Custom error with an arbitrary message
@@ -11,18 +10,10 @@
1110
public class CustomError extends LJError {
1211

1312
public CustomError(String message) {
14-
super("Error", message, null, null, null);
13+
super("Error", message, null, null);
1514
}
1615

17-
public CustomError(String message, SourcePosition pos) {
18-
super("Error", message, null, pos, null);
19-
}
20-
21-
public CustomError(String message, String detail, CtElement element) {
22-
super("Error", message, detail, element.getPosition(), null);
23-
}
24-
25-
public CustomError(String message, CtElement element) {
26-
super("Error", message, null, element.getPosition(), null);
16+
public CustomError(String message, SourcePosition position) {
17+
super("Error", message, position, null);
2718
}
2819
}

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/GhostInvocationError.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/IllegalConstructorTransitionError.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
public class IllegalConstructorTransitionError extends LJError {
1111

1212
public IllegalConstructorTransitionError(CtElement element) {
13-
super("Illegal Constructor Transition Error", "Found constructor with 'from' state",
14-
"Constructor methods should only have a 'to' state", element.getPosition(), null);
13+
super("Illegal Constructor Transition Error",
14+
"Found constructor with 'from' state: constructors should only have a 'to' state",
15+
element.getPosition(), null);
1516
}
1617
}

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/InvalidRefinementError.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package liquidjava.diagnostics.errors;
22

3-
import spoon.reflect.declaration.CtElement;
3+
import spoon.reflect.cu.SourcePosition;
44

55
/**
66
* Error indicating that a refinement is invalid (e.g., not a boolean expression)
@@ -11,8 +11,8 @@ public class InvalidRefinementError extends LJError {
1111

1212
private final String refinement;
1313

14-
public InvalidRefinementError(CtElement element, String message, String refinement) {
15-
super("Invalid Refinement", message, "", element.getPosition(), null);
14+
public InvalidRefinementError(SourcePosition position, String message, String refinement) {
15+
super("Invalid Refinement", message, position, null);
1616
this.refinement = refinement;
1717
}
1818

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/LJError.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ public abstract class LJError extends LJDiagnostic {
1212

1313
private final TranslationTable translationTable;
1414

15-
public LJError(String title, String message, String details, SourcePosition pos,
16-
TranslationTable translationTable) {
17-
super(title, message, details, pos, Colors.BOLD_RED);
15+
public LJError(String title, String message, SourcePosition pos, TranslationTable translationTable) {
16+
super(title, message, pos, Colors.BOLD_RED);
1817
this.translationTable = translationTable != null ? translationTable : new TranslationTable();
1918
}
2019

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package liquidjava.diagnostics.errors;
22

33
import liquidjava.diagnostics.TranslationTable;
4-
import spoon.reflect.declaration.CtElement;
4+
import liquidjava.utils.Utils;
5+
import spoon.reflect.cu.SourcePosition;
56

67
/**
78
* Error indicating that an element referenced in a refinement was not found
@@ -10,7 +11,21 @@
1011
*/
1112
public class NotFoundError extends LJError {
1213

13-
public NotFoundError(CtElement element, String message, TranslationTable translationTable) {
14-
super("Not Found Error", message, "", element.getPosition(), translationTable);
14+
private final String name;
15+
private final String kind; // "Variable" or "Ghost"
16+
17+
public NotFoundError(SourcePosition position, String message, String name, String kind,
18+
TranslationTable translationTable) {
19+
super("Not Found Error", message, position, translationTable);
20+
this.name = Utils.getSimpleName(name);
21+
this.kind = kind;
22+
}
23+
24+
public String getName() {
25+
return name;
26+
}
27+
28+
public String getKind() {
29+
return kind;
1530
}
1631
}

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/RefinementError.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import liquidjava.diagnostics.TranslationTable;
44
import liquidjava.rj_language.ast.Expression;
55
import liquidjava.rj_language.opt.derivation_node.ValDerivationNode;
6-
import spoon.reflect.declaration.CtElement;
6+
import spoon.reflect.cu.SourcePosition;
77

88
/**
99
* Error indicating that a refinement constraint either was violated or cannot be proven
@@ -15,11 +15,11 @@ public class RefinementError extends LJError {
1515
private final String expected;
1616
private final ValDerivationNode found;
1717

18-
public RefinementError(CtElement element, Expression expected, ValDerivationNode found,
18+
public RefinementError(SourcePosition position, Expression expected, ValDerivationNode found,
1919
TranslationTable translationTable) {
2020
super("Refinement Error",
21-
String.format("%s is not a subtype of %s", found.getValue(), expected.toSimplifiedString()), "",
22-
element.getPosition(), translationTable);
21+
String.format("%s is not a subtype of %s", found.getValue(), expected.toSimplifiedString()), position,
22+
translationTable);
2323
this.expected = expected.toSimplifiedString();
2424
this.found = found;
2525
}

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/StateConflictError.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import liquidjava.diagnostics.TranslationTable;
44
import liquidjava.rj_language.ast.Expression;
5-
import spoon.reflect.declaration.CtElement;
5+
import spoon.reflect.cu.SourcePosition;
66

77
/**
88
* Error indicating that two disjoint states were found in a state refinement
@@ -11,22 +11,16 @@
1111
*/
1212
public class StateConflictError extends LJError {
1313

14-
private final String state;
15-
private final String className;
14+
private final String state;;
1615

17-
public StateConflictError(CtElement element, Expression state, String className,
18-
TranslationTable translationTable) {
19-
super("State Conflict Error", "Found multiple disjoint states in state transition",
20-
"State transition can only go to one state of each state set", element.getPosition(), translationTable);
16+
public StateConflictError(SourcePosition position, Expression state, TranslationTable translationTable) {
17+
super("State Conflict Error",
18+
"Found multiple disjoint states in state transition: state transition can only go to one state of each state set",
19+
position, translationTable);
2120
this.state = state.toSimplifiedString();
22-
this.className = className;
2321
}
2422

2523
public String getState() {
2624
return state;
2725
}
28-
29-
public String getClassName() {
30-
return className;
31-
}
3226
}

0 commit comments

Comments
 (0)