diff --git a/ownlang-core/src/main/java/com/annimon/ownlang/exceptions/VariableDoesNotExistsException.java b/ownlang-core/src/main/java/com/annimon/ownlang/exceptions/VariableDoesNotExistsException.java index 419807e..8ed000d 100644 --- a/ownlang-core/src/main/java/com/annimon/ownlang/exceptions/VariableDoesNotExistsException.java +++ b/ownlang-core/src/main/java/com/annimon/ownlang/exceptions/VariableDoesNotExistsException.java @@ -1,11 +1,13 @@ package com.annimon.ownlang.exceptions; +import com.annimon.ownlang.util.Range; + public final class VariableDoesNotExistsException extends OwnLangRuntimeException { private final String variable; - public VariableDoesNotExistsException(String variable) { - super("Variable " + variable + " does not exists"); + public VariableDoesNotExistsException(String variable, Range range) { + super("Variable " + variable + " does not exists", range); this.variable = variable; } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java index 0c2ca9e..278dee5 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java @@ -853,12 +853,15 @@ public final class Parser { private Node qualifiedName() { // var || var.key[index].key2 + final var startTokenIndex = index; final Token current = get(0); if (!match(TokenType.WORD)) return null; final List indices = variableSuffix(); if (indices == null || indices.isEmpty()) { - return new VariableExpression(current.text()); + final var variable = new VariableExpression(current.text()); + variable.setRange(getRange(startTokenIndex, index - 1)); + return variable; } return new ContainerAccessExpression(current.text(), indices); } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/VariableExpression.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/VariableExpression.java index b997f04..fa04ab7 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/VariableExpression.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/VariableExpression.java @@ -3,19 +3,31 @@ package com.annimon.ownlang.parser.ast; import com.annimon.ownlang.exceptions.VariableDoesNotExistsException; import com.annimon.ownlang.lib.ScopeHandler; import com.annimon.ownlang.lib.Value; +import com.annimon.ownlang.util.Range; +import com.annimon.ownlang.util.SourceLocation; /** * * @author aNNiMON */ -public final class VariableExpression extends InterruptableNode implements Accessible { +public final class VariableExpression extends InterruptableNode implements Accessible, SourceLocation { public final String name; + private Range range; public VariableExpression(String name) { this.name = name; } + public void setRange(Range range) { + this.range = range; + } + + @Override + public Range getRange() { + return range; + } + @Override public Value eval() { super.interruptionCheck(); @@ -25,7 +37,7 @@ public final class VariableExpression extends InterruptableNode implements Acces @Override public Value get() { if (!ScopeHandler.isVariableOrConstantExists(name)) { - throw new VariableDoesNotExistsException(name); + throw new VariableDoesNotExistsException(name, getRange()); } return ScopeHandler.getVariableOrConstant(name); }