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;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user