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

View File

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

View File

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

View File

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

View File

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