Skip to content

Commit 0294c7d

Browse files
committed
Fix Scope Positions
1 parent 5f5c148 commit 0294c7d

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@
66
import java.util.Set;
77

88
import liquidjava.utils.Utils;
9+
import spoon.reflect.code.CtBlock;
10+
import spoon.reflect.code.CtFor;
11+
import spoon.reflect.code.CtForEach;
12+
import spoon.reflect.code.CtIf;
13+
import spoon.reflect.code.CtTry;
14+
import spoon.reflect.code.CtWhile;
915
import spoon.reflect.cu.SourcePosition;
16+
import spoon.reflect.declaration.CtConstructor;
1017
import spoon.reflect.declaration.CtElement;
11-
import spoon.reflect.declaration.CtParameter;
18+
import spoon.reflect.declaration.CtMethod;
1219

1320
public class ContextHistory {
1421
private static ContextHistory instance;
@@ -60,11 +67,10 @@ public void saveContext(CtElement element, Context context) {
6067
}
6168

6269
private String getScopePosition(CtElement element) {
63-
CtElement startElement = element instanceof CtParameter<?> ? element.getParent() : element;
64-
SourcePosition annPosition = Utils.getFirstLJAnnotationPosition(startElement);
65-
SourcePosition pos = element.getPosition();
66-
return String.format("%d:%d-%d:%d", annPosition.getLine(), annPosition.getColumn(), pos.getEndLine(),
67-
pos.getEndColumn());
70+
SourcePosition startPos = Utils.getRealPosition(element);
71+
SourcePosition endPos = element.getPosition();
72+
return String.format("%d:%d-%d:%d", startPos.getLine(), startPos.getColumn(), endPos.getEndLine(),
73+
endPos.getEndColumn() - 1);
6874
}
6975

7076
public Set<RefinedVariable> getLocalVars() {

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55
import java.util.stream.Stream;
66

77
import liquidjava.utils.constants.Types;
8+
import spoon.reflect.code.CtBlock;
9+
import spoon.reflect.code.CtFor;
10+
import spoon.reflect.code.CtForEach;
11+
import spoon.reflect.code.CtIf;
12+
import spoon.reflect.code.CtTry;
13+
import spoon.reflect.code.CtWhile;
814
import spoon.reflect.cu.SourcePosition;
915
import spoon.reflect.declaration.CtAnnotation;
16+
import spoon.reflect.declaration.CtConstructor;
1017
import spoon.reflect.declaration.CtElement;
18+
import spoon.reflect.declaration.CtMethod;
1119
import spoon.reflect.factory.Factory;
1220
import spoon.reflect.reference.CtTypeReference;
1321

@@ -69,4 +77,19 @@ private static boolean hasRefinementValue(CtAnnotation<?> annotation, String ref
6977
Map<String, ?> values = annotation.getValues();
7078
return Stream.of("value", "to", "from").anyMatch(key -> refinement.equals(String.valueOf(values.get(key))));
7179
}
80+
81+
public static SourcePosition getRealPosition(CtElement element) {
82+
if (element instanceof CtBlock<?> block) {
83+
CtElement parent = block.getParent();
84+
if (parent instanceof CtIf ctIf) {
85+
if (ctIf.getThenStatement() == element) {
86+
return ctIf.getPosition();
87+
}
88+
} else if (parent instanceof CtFor || parent instanceof CtForEach || parent instanceof CtWhile
89+
|| parent instanceof CtTry || parent instanceof CtMethod<?> || parent instanceof CtConstructor<?>) {
90+
return parent.getPosition();
91+
}
92+
}
93+
return element.getPosition();
94+
}
7295
}

0 commit comments

Comments
 (0)