From bcce9783415dfff5673cc2bfbbaae1d872a39029 Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Sun, 15 Oct 2023 23:09:36 +0300 Subject: [PATCH] Source located VariableDoesNotExistsException --- .../VariableDoesNotExistsException.java | 6 ++++-- .../java/com/annimon/ownlang/parser/Parser.java | 5 ++++- .../ownlang/parser/ast/VariableExpression.java | 16 ++++++++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) 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); }