Skip to content

Commit bcce978

Browse files
committed
Source located VariableDoesNotExistsException
1 parent 6a35f6e commit bcce978

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

ownlang-core/src/main/java/com/annimon/ownlang/exceptions/VariableDoesNotExistsException.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.annimon.ownlang.exceptions;
22

3+
import com.annimon.ownlang.util.Range;
4+
35
public final class VariableDoesNotExistsException extends OwnLangRuntimeException {
46

57
private final String variable;
68

7-
public VariableDoesNotExistsException(String variable) {
8-
super("Variable " + variable + " does not exists");
9+
public VariableDoesNotExistsException(String variable, Range range) {
10+
super("Variable " + variable + " does not exists", range);
911
this.variable = variable;
1012
}
1113

ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,12 +853,15 @@ private Node variable() {
853853

854854
private Node qualifiedName() {
855855
// var || var.key[index].key2
856+
final var startTokenIndex = index;
856857
final Token current = get(0);
857858
if (!match(TokenType.WORD)) return null;
858859

859860
final List<Node> indices = variableSuffix();
860861
if (indices == null || indices.isEmpty()) {
861-
return new VariableExpression(current.text());
862+
final var variable = new VariableExpression(current.text());
863+
variable.setRange(getRange(startTokenIndex, index - 1));
864+
return variable;
862865
}
863866
return new ContainerAccessExpression(current.text(), indices);
864867
}

ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/VariableExpression.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,31 @@
33
import com.annimon.ownlang.exceptions.VariableDoesNotExistsException;
44
import com.annimon.ownlang.lib.ScopeHandler;
55
import com.annimon.ownlang.lib.Value;
6+
import com.annimon.ownlang.util.Range;
7+
import com.annimon.ownlang.util.SourceLocation;
68

79
/**
810
*
911
* @author aNNiMON
1012
*/
11-
public final class VariableExpression extends InterruptableNode implements Accessible {
13+
public final class VariableExpression extends InterruptableNode implements Accessible, SourceLocation {
1214

1315
public final String name;
16+
private Range range;
1417

1518
public VariableExpression(String name) {
1619
this.name = name;
1720
}
1821

22+
public void setRange(Range range) {
23+
this.range = range;
24+
}
25+
26+
@Override
27+
public Range getRange() {
28+
return range;
29+
}
30+
1931
@Override
2032
public Value eval() {
2133
super.interruptionCheck();
@@ -25,7 +37,7 @@ public Value eval() {
2537
@Override
2638
public Value get() {
2739
if (!ScopeHandler.isVariableOrConstantExists(name)) {
28-
throw new VariableDoesNotExistsException(name);
40+
throw new VariableDoesNotExistsException(name, getRange());
2941
}
3042
return ScopeHandler.getVariableOrConstant(name);
3143
}

0 commit comments

Comments
 (0)