Skip to content

Commit eff7067

Browse files
committed
Use Annotation Position & Mark Parameters
This is needed to suggest parameters in method and parameter refinements
1 parent dd127c6 commit eff7067

File tree

5 files changed

+25
-7
lines changed

5 files changed

+25
-7
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public String getSnippet() {
129129

130130
// line number padding + pipe + column offset
131131
String indent = " ".repeat(padding) + Colors.GREY + PIPE + Colors.RESET
132-
+ " ".repeat(visualColStart - 1);
132+
+ " ".repeat(visualColStart - 1);
133133
String markers = accentColor + "^".repeat(Math.max(1, visualColEnd - visualColStart + 1));
134134
sb.append(indent).append(markers);
135135

liquidjava-verifier/src/main/java/liquidjava/processor/context/ContextHistory.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.Map;
66
import java.util.Set;
77

8+
import liquidjava.utils.Utils;
89
import spoon.reflect.cu.SourcePosition;
910
import spoon.reflect.declaration.CtElement;
1011
import spoon.reflect.declaration.CtExecutable;
@@ -76,12 +77,8 @@ private String getFile(CtElement element) {
7677

7778
public String getScopePosition(CtElement element) {
7879
SourcePosition pos = element.getPosition();
79-
SourcePosition innerPosition = pos;
80-
if (element instanceof CtExecutable<?> executable) {
81-
if (executable.getBody() != null)
82-
innerPosition = executable.getBody().getPosition();
83-
}
84-
return String.format("%d:%d-%d:%d", innerPosition.getLine(), innerPosition.getColumn() + 1, pos.getEndLine(),
80+
SourcePosition annPosition = Utils.getFirstAnnotationPosition(element);
81+
return String.format("%d:%d-%d:%d", annPosition.getLine(), annPosition.getColumn() + 1, pos.getEndLine(),
8582
pos.getEndColumn());
8683
}
8784

liquidjava-verifier/src/main/java/liquidjava/processor/context/RefinedVariable.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
public abstract class RefinedVariable extends Refined {
1010
private final List<CtTypeReference<?>> supertypes;
1111
private PlacementInCode placementInCode;
12+
private boolean isParameter;
1213

1314
public RefinedVariable(String name, CtTypeReference<?> type, Predicate c) {
1415
super(name, type, c);
1516
supertypes = new ArrayList<>();
17+
isParameter = false;
1618
}
1719

1820
public abstract Predicate getMainRefinement();
@@ -65,4 +67,12 @@ public boolean equals(Object obj) {
6567
return supertypes.equals(other.supertypes);
6668
}
6769
}
70+
71+
public void setIsParameter(boolean b) {
72+
isParameter = b;
73+
}
74+
75+
public boolean isParameter() {
76+
return isParameter;
77+
}
6878
}

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ private Predicate handleFunctionRefinements(RefinedFunction f, CtElement method,
154154
c = oc.get().substituteVariable(Keys.WILDCARD, paramName);
155155
param.putMetadata(Keys.REFINEMENT, c);
156156
RefinedVariable v = rtc.getContext().addVarToContext(param.getSimpleName(), param.getType(), c, param);
157+
v.setIsParameter(true);
157158
rtc.getMessageFromAnnotation(param).ifPresent(v::setMessage);
158159
if (v instanceof Variable)
159160
f.addArgRefinements((Variable) v);

liquidjava-verifier/src/main/java/liquidjava/utils/Utils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ public static SourcePosition getAnnotationPosition(CtElement element, String ref
4444
.map(CtElement::getPosition).orElse(element.getPosition());
4545
}
4646

47+
public static SourcePosition getFirstAnnotationPosition(CtElement element) {
48+
CtElement target = element.getParent() != null ? element.getParent() : element;
49+
return target.getAnnotations().stream().filter(Utils::isLiquidJavaAnnotation).map(CtElement::getPosition)
50+
.min((p1, p2) -> {
51+
if (p1.getLine() != p2.getLine())
52+
return Integer.compare(p1.getLine(), p2.getLine());
53+
return Integer.compare(p1.getColumn(), p2.getColumn());
54+
}).orElse(target.getPosition());
55+
}
56+
4757
private static boolean isLiquidJavaAnnotation(CtAnnotation<?> annotation) {
4858
return annotation.getAnnotationType().getQualifiedName().startsWith("liquidjava.specification");
4959
}

0 commit comments

Comments
 (0)