mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Source location for unknown class/function exceptions
This commit is contained in:
parent
5267ff6144
commit
807ffd44f8
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -747,6 +747,7 @@ public final class Parser {
|
||||
|
||||
private Expression objectCreation() {
|
||||
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();
|
||||
|
@ -75,7 +75,7 @@ public final class FunctionalExpression extends InterruptableNode
|
||||
return ((FunctionValue)variable).getValue();
|
||||
}
|
||||
}
|
||||
throw new UnknownFunctionException(key);
|
||||
throw new UnknownFunctionException(key, getRange());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user