Source location for unknown class/function exceptions

This commit is contained in:
aNNiMON 2023-10-04 19:39:13 +03:00 committed by Victor Melnik
parent 5267ff6144
commit 807ffd44f8
5 changed files with 34 additions and 5 deletions

View File

@ -1,5 +1,7 @@
package com.annimon.ownlang.exceptions;
import com.annimon.ownlang.util.Range;
public final class UnknownClassException extends OwnLangRuntimeException {
private final String className;
@ -9,6 +11,11 @@ public final class UnknownClassException extends OwnLangRuntimeException {
this.className = name;
}
public UnknownClassException(String name, Range range) {
super("Unknown class " + name, range);
this.className = name;
}
public String getClassName() {
return className;
}

View File

@ -1,5 +1,7 @@
package com.annimon.ownlang.exceptions;
import com.annimon.ownlang.util.Range;
public final class UnknownFunctionException extends OwnLangRuntimeException {
private final String functionName;
@ -9,6 +11,11 @@ public final class UnknownFunctionException extends OwnLangRuntimeException {
this.functionName = name;
}
public UnknownFunctionException(String name, Range range) {
super("Unknown function " + name, range);
this.functionName = name;
}
public String getFunctionName() {
return functionName;
}

View File

@ -746,7 +746,8 @@ public final class Parser {
}
private Expression objectCreation() {
if (match(TokenType.NEW)) {
if (match(TokenType.NEW)) {
final var startTokenIndex = index - 1;
final String className = consume(TokenType.WORD).text();
final List<Expression> args = new ArrayList<>();
consume(TokenType.LPAREN);
@ -754,7 +755,9 @@ public final class Parser {
args.add(expression());
match(TokenType.COMMA);
}
return new ObjectCreationExpression(className, args);
final var expr = new ObjectCreationExpression(className, args);
expr.setRange(getRange(startTokenIndex, index - 1));
return expr;
}
return unary();

View File

@ -75,7 +75,7 @@ public final class FunctionalExpression extends InterruptableNode
return ((FunctionValue)variable).getValue();
}
}
throw new UnknownFunctionException(key);
throw new UnknownFunctionException(key, getRange());
}
@Override

View File

@ -2,19 +2,31 @@ package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.exceptions.UnknownClassException;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.util.Range;
import com.annimon.ownlang.util.SourceLocation;
import java.util.Iterator;
import java.util.List;
public final class ObjectCreationExpression implements Expression {
public final class ObjectCreationExpression implements Expression, SourceLocation {
public final String className;
public final List<Expression> constructorArguments;
private Range range;
public ObjectCreationExpression(String className, List<Expression> constructorArguments) {
this.className = className;
this.constructorArguments = constructorArguments;
}
public void setRange(Range range) {
this.range = range;
}
@Override
public Range getRange() {
return range;
}
@Override
public Value eval() {
final ClassDeclarationStatement cd = ClassDeclarations.get(className);
@ -26,7 +38,7 @@ public final class ObjectCreationExpression implements Expression {
return instantiable.newInstance(ctorArgs());
}
}
throw new UnknownClassException(className);
throw new UnknownClassException(className, getRange());
}
// Create an instance and put evaluated fields with method declarations