mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Source located VariableDoesNotExistsException
This commit is contained in:
parent
6a35f6e66a
commit
bcce978341
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<Node> 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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user