Skip to content

Commit 6a35f6e

Browse files
committed
Source located error in linter for include statement
1 parent 35971e8 commit 6a35f6e

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ private Statement statement() {
147147
return useStatement();
148148
}
149149
if (match(TokenType.INCLUDE)) {
150-
return new IncludeStatement(expression());
150+
return includeStatement();
151151
}
152152
if (match(TokenType.FOR)) {
153153
return forStatement();
@@ -167,6 +167,13 @@ private Statement statement() {
167167
return assignmentStatement();
168168
}
169169

170+
private IncludeStatement includeStatement() {
171+
final var startTokenIndex = index - 1;
172+
final var include = new IncludeStatement(expression());
173+
include.setRange(getRange(startTokenIndex, index));
174+
return include;
175+
}
176+
170177
private UseStatement useStatement() {
171178
final var modules = new HashSet<String>();
172179
do {

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,33 @@
66
import com.annimon.ownlang.lib.Value;
77
import com.annimon.ownlang.parser.error.ParseErrorsFormatterStage;
88
import com.annimon.ownlang.stages.*;
9+
import com.annimon.ownlang.util.Range;
10+
import com.annimon.ownlang.util.SourceLocation;
911
import com.annimon.ownlang.util.input.InputSourceFile;
1012
import com.annimon.ownlang.util.input.SourceLoaderStage;
1113

1214
/**
1315
*
1416
* @author aNNiMON
1517
*/
16-
public final class IncludeStatement extends InterruptableNode implements Statement {
18+
public final class IncludeStatement extends InterruptableNode implements Statement, SourceLocation {
1719

1820
public final Node expression;
21+
private Range range;
1922

2023
public IncludeStatement(Node expression) {
2124
this.expression = expression;
2225
}
2326

27+
public void setRange(Range range) {
28+
this.range = range;
29+
}
30+
31+
@Override
32+
public Range getRange() {
33+
return range;
34+
}
35+
2436
@Override
2537
public Value eval() {
2638
super.interruptionCheck();
@@ -31,6 +43,7 @@ public Value eval() {
3143
new SourceLoaderStage()
3244
.then(new LexerStage())
3345
.then(new ParserStage())
46+
// TODO LinterStage based on main context
3447
.then(new FunctionAddingStage())
3548
.then(new ExecutionStage())
3649
.perform(stagesData, new InputSourceFile(path));

ownlang-parser/src/main/java/com/annimon/ownlang/parser/linters/IncludeSourceValidator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ public void visit(IncludeStatement s) {
2323
final String path = expr.eval().asString();
2424
if (!detector.isReadable(path)) {
2525
results.add(LinterResult.error(
26-
"Include statement path \"%s\" is not readable".formatted(path)));
26+
"Include statement path \"%s\" is not readable".formatted(path),
27+
s.getRange()));
2728
}
2829
} else {
2930
results.add(LinterResult.warning(
30-
"Include statement path \"%s\" is not a constant string".formatted(s.expression)));
31+
"Include statement path \"%s\" is not a constant string".formatted(s.expression),
32+
s.getRange()));
3133
}
3234
}
3335
}

ownlang-parser/src/main/java/com/annimon/ownlang/parser/linters/LinterResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,18 @@ static LinterResult warning(String message) {
1111
return new LinterResult(Severity.WARNING, message);
1212
}
1313

14+
static LinterResult warning(String message, Range range) {
15+
return new LinterResult(Severity.WARNING, message, range);
16+
}
17+
1418
static LinterResult error(String message) {
1519
return new LinterResult(Severity.ERROR, message);
1620
}
1721

22+
static LinterResult error(String message, Range range) {
23+
return new LinterResult(Severity.ERROR, message, range);
24+
}
25+
1826
LinterResult(Severity severity, String message) {
1927
this(severity, message, null);
2028
}

0 commit comments

Comments
 (0)