Skip to content

Commit 9fb6fa4

Browse files
committed
Fix Alias Argument Mismatch & Not Found
- Add ArgumentMismatchError - Check argument count and types of aliases - Add not found error for aliases as well - Add locations to LJErrors after catching them in the places they don't include positions
1 parent e1eecc6 commit 9fb6fa4

File tree

16 files changed

+149
-60
lines changed

16 files changed

+149
-60
lines changed

liquidjava-example/src/main/java/testSuite/ErrorAliasArgumentSize.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Not Found Error
1+
// Argument Mismatch Error
22
package testSuite;
33

44
import liquidjava.specification.Refinement;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Argument Mismatch Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
import liquidjava.specification.RefinementAlias;
6+
7+
@SuppressWarnings("unused")
8+
@RefinementAlias("InRange(int val, int low, int up) {low < val && val < up}")
9+
public class ErrorAliasEmptyArguments {
10+
11+
public static void main(String[] args) {
12+
@Refinement("InRange()")
13+
int j = 15;
14+
}
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Not Found Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
public class ErrorAliasNotFound {
7+
8+
public static void main(String[] args) {
9+
@Refinement("UndefinedAlias(x)")
10+
int x = 5;
11+
}
12+
}

liquidjava-example/src/main/java/testSuite/ErrorAliasTypeMismatch.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Refinement Error
1+
// Argument Mismatch Error
22
package testSuite;
33

44
import liquidjava.specification.Refinement;
@@ -15,6 +15,5 @@ public static void main(String[] args) {
1515

1616
@Refinement("Positive(_)")
1717
double positive = positiveGrade2;
18-
// Positive(_) fica positive > 0
1918
}
2019
}

liquidjava-example/src/main/java/testSuite/ErrorGhostArgsTypes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Error
1+
// Argument Mismatch Error
22
package testSuite;
33

44
import liquidjava.specification.Refinement;

liquidjava-example/src/main/java/testSuite/ErrorGhostNumberArgs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Error
1+
// Argument Mismatch Error
22
package testSuite;
33

44
import liquidjava.specification.Refinement;

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

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

1111
private final String title;
1212
private final String message;
13-
private final String file;
14-
private final ErrorPosition position;
1513
private final String accentColor;
14+
private String file;
15+
private ErrorPosition position;
1616

1717
public LJDiagnostic(String title, String message, SourcePosition pos, String accentColor) {
1818
this.title = title;
@@ -38,6 +38,13 @@ public ErrorPosition getPosition() {
3838
return position;
3939
}
4040

41+
public void setPosition(SourcePosition pos) {
42+
if (pos == null)
43+
return;
44+
this.position = ErrorPosition.fromSpoonPosition(pos);
45+
this.file = pos.getFile().getPath();
46+
}
47+
4148
public String getFile() {
4249
return file;
4350
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package liquidjava.diagnostics.errors;
2+
3+
import liquidjava.diagnostics.TranslationTable;
4+
import spoon.reflect.cu.SourcePosition;
5+
6+
/**
7+
* Error indicating that the arguments provided to a function or method do not match the expected parameters either in
8+
* number or type of arguments
9+
*
10+
* @see LJError
11+
*/
12+
public class ArgumentMismatchError extends LJError {
13+
14+
public ArgumentMismatchError(String message) {
15+
super("Argument Mismatch Error", message, null, null);
16+
}
17+
18+
public ArgumentMismatchError(String message, SourcePosition position, TranslationTable translationTable) {
19+
super("Argument Mismatch Error", message, position, translationTable);
20+
}
21+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ public class NotFoundError extends LJError {
1414
private final String name;
1515
private final String kind; // "Variable" or "Ghost"
1616

17-
public NotFoundError(SourcePosition position, String message, String name, String kind,
17+
public NotFoundError(String message, String name, String kind) {
18+
this(message, null, name, kind, null);
19+
}
20+
21+
public NotFoundError(String message, SourcePosition position, String name, String kind,
1822
TranslationTable translationTable) {
1923
super("Not Found Error", message, position, translationTable);
2024
this.name = Utils.getSimpleName(name);

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/TypeChecker.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import java.util.List;
66
import java.util.Optional;
77

8-
import liquidjava.diagnostics.errors.CustomError;
9-
import liquidjava.diagnostics.errors.InvalidRefinementError;
10-
import liquidjava.diagnostics.errors.LJError;
11-
import liquidjava.diagnostics.errors.SyntaxError;
8+
import liquidjava.diagnostics.errors.*;
129
import liquidjava.processor.context.AliasWrapper;
1310
import liquidjava.processor.context.Context;
1411
import liquidjava.processor.context.GhostFunction;
@@ -34,6 +31,8 @@
3431
import spoon.reflect.reference.CtTypeReference;
3532
import spoon.reflect.visitor.CtScanner;
3633

34+
import static liquidjava.processor.refinement_checker.TypeCheckingUtils.*;
35+
3736
public abstract class TypeChecker extends CtScanner {
3837

3938
Context context;
@@ -65,15 +64,15 @@ public Optional<Predicate> getRefinementFromAnnotation(CtElement element) throws
6564
for (CtAnnotation<? extends Annotation> ann : element.getAnnotations()) {
6665
String an = ann.getActualAnnotation().annotationType().getCanonicalName();
6766
if (an.contentEquals("liquidjava.specification.Refinement")) {
68-
String st = TypeCheckingUtils.getStringFromAnnotation(ann.getValue("value"));
67+
String st = getStringFromAnnotation(ann.getValue("value"));
6968
ref = Optional.of(st);
7069

7170
} else if (an.contentEquals("liquidjava.specification.RefinementPredicate")) {
72-
String st = TypeCheckingUtils.getStringFromAnnotation(ann.getValue("value"));
71+
String st = getStringFromAnnotation(ann.getValue("value"));
7372
getGhostFunction(st, element);
7473

7574
} else if (an.contentEquals("liquidjava.specification.RefinementAlias")) {
76-
String st = TypeCheckingUtils.getStringFromAnnotation(ann.getValue("value"));
75+
String st = getStringFromAnnotation(ann.getValue("value"));
7776
handleAlias(st, element);
7877
}
7978
}
@@ -209,9 +208,9 @@ protected void getGhostFunction(String value, CtElement element) throws LJError
209208
}
210209
}
211210

212-
protected void handleAlias(String value, CtElement element) throws LJError {
211+
protected void handleAlias(String ref, CtElement element) throws LJError {
213212
try {
214-
AliasDTO a = RefinementsParser.getAliasDeclaration(value);
213+
AliasDTO a = RefinementsParser.getAliasDeclaration(ref);
215214
String klass = null;
216215
String path = null;
217216
if (element instanceof CtClass) {
@@ -226,15 +225,16 @@ protected void handleAlias(String value, CtElement element) throws LJError {
226225
// refinement alias must return a boolean expression
227226
if (a.getExpression() != null && !a.getExpression().isBooleanExpression()) {
228227
throw new InvalidRefinementError(element.getPosition(),
229-
"Refinement alias must return a boolean expression", value);
228+
"Refinement alias must return a boolean expression", ref);
230229
}
231230
AliasWrapper aw = new AliasWrapper(a, factory, klass, path);
232231
context.addAlias(aw);
233232
}
234-
} catch (SyntaxError e) {
233+
} catch (LJError e) {
235234
// add location info to error
236-
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, value);
237-
throw new SyntaxError(e.getMessage(), pos, value);
235+
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, ref);
236+
e.setPosition(pos);
237+
throw e;
238238
}
239239
}
240240

@@ -301,11 +301,11 @@ public void createError(SourcePosition position, Predicate expectedType, Predica
301301
}
302302

303303
public void createSameStateError(SourcePosition position, Predicate expectedType, String klass) throws LJError {
304-
vcChecker.raiseSameStateError(position, expectedType, klass);
304+
vcChecker.raiseSameStateError(position, expectedType);
305305
}
306306

307307
public void createStateMismatchError(SourcePosition position, String method, Predicate found, Predicate expected)
308308
throws LJError {
309-
vcChecker.raiseStateMismatchError(position, method, found, expected);
309+
vcChecker.raiseStateMismatchError(position, found, expected);
310310
}
311311
}

0 commit comments

Comments
 (0)