Skip to content

Commit 807ffd4

Browse files
committed
Source location for unknown class/function exceptions
1 parent 5267ff6 commit 807ffd4

File tree

5 files changed

+34
-5
lines changed

5 files changed

+34
-5
lines changed

ownlang-core/src/main/java/com/annimon/ownlang/exceptions/UnknownClassException.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.annimon.ownlang.exceptions;
22

3+
import com.annimon.ownlang.util.Range;
4+
35
public final class UnknownClassException extends OwnLangRuntimeException {
46

57
private final String className;
@@ -9,6 +11,11 @@ public UnknownClassException(String name) {
911
this.className = name;
1012
}
1113

14+
public UnknownClassException(String name, Range range) {
15+
super("Unknown class " + name, range);
16+
this.className = name;
17+
}
18+
1219
public String getClassName() {
1320
return className;
1421
}

ownlang-core/src/main/java/com/annimon/ownlang/exceptions/UnknownFunctionException.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.annimon.ownlang.exceptions;
22

3+
import com.annimon.ownlang.util.Range;
4+
35
public final class UnknownFunctionException extends OwnLangRuntimeException {
46

57
private final String functionName;
@@ -9,6 +11,11 @@ public UnknownFunctionException(String name) {
911
this.functionName = name;
1012
}
1113

14+
public UnknownFunctionException(String name, Range range) {
15+
super("Unknown function " + name, range);
16+
this.functionName = name;
17+
}
18+
1219
public String getFunctionName() {
1320
return functionName;
1421
}

ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,15 +746,18 @@ private Expression multiplicative() {
746746
}
747747

748748
private Expression objectCreation() {
749-
if (match(TokenType.NEW)) {
749+
if (match(TokenType.NEW)) {
750+
final var startTokenIndex = index - 1;
750751
final String className = consume(TokenType.WORD).text();
751752
final List<Expression> args = new ArrayList<>();
752753
consume(TokenType.LPAREN);
753754
while (!match(TokenType.RPAREN)) {
754755
args.add(expression());
755756
match(TokenType.COMMA);
756757
}
757-
return new ObjectCreationExpression(className, args);
758+
final var expr = new ObjectCreationExpression(className, args);
759+
expr.setRange(getRange(startTokenIndex, index - 1));
760+
return expr;
758761
}
759762

760763
return unary();

ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private Function getFunction(String key) {
7575
return ((FunctionValue)variable).getValue();
7676
}
7777
}
78-
throw new UnknownFunctionException(key);
78+
throw new UnknownFunctionException(key, getRange());
7979
}
8080

8181
@Override

ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/ObjectCreationExpression.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,30 @@
22

33
import com.annimon.ownlang.exceptions.UnknownClassException;
44
import com.annimon.ownlang.lib.*;
5+
import com.annimon.ownlang.util.Range;
6+
import com.annimon.ownlang.util.SourceLocation;
57
import java.util.Iterator;
68
import java.util.List;
79

8-
public final class ObjectCreationExpression implements Expression {
10+
public final class ObjectCreationExpression implements Expression, SourceLocation {
911

1012
public final String className;
1113
public final List<Expression> constructorArguments;
14+
private Range range;
1215

1316
public ObjectCreationExpression(String className, List<Expression> constructorArguments) {
1417
this.className = className;
1518
this.constructorArguments = constructorArguments;
1619
}
20+
21+
public void setRange(Range range) {
22+
this.range = range;
23+
}
24+
25+
@Override
26+
public Range getRange() {
27+
return range;
28+
}
1729

1830
@Override
1931
public Value eval() {
@@ -26,7 +38,7 @@ public Value eval() {
2638
return instantiable.newInstance(ctorArgs());
2739
}
2840
}
29-
throw new UnknownClassException(className);
41+
throw new UnknownClassException(className, getRange());
3042
}
3143

3244
// Create an instance and put evaluated fields with method declarations

0 commit comments

Comments
 (0)