mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Source located error in linter for include statement
This commit is contained in:
parent
35971e874b
commit
6a35f6e66a
@ -147,7 +147,7 @@ public final class Parser {
|
||||
return useStatement();
|
||||
}
|
||||
if (match(TokenType.INCLUDE)) {
|
||||
return new IncludeStatement(expression());
|
||||
return includeStatement();
|
||||
}
|
||||
if (match(TokenType.FOR)) {
|
||||
return forStatement();
|
||||
@ -167,6 +167,13 @@ public final class Parser {
|
||||
return assignmentStatement();
|
||||
}
|
||||
|
||||
private IncludeStatement includeStatement() {
|
||||
final var startTokenIndex = index - 1;
|
||||
final var include = new IncludeStatement(expression());
|
||||
include.setRange(getRange(startTokenIndex, index));
|
||||
return include;
|
||||
}
|
||||
|
||||
private UseStatement useStatement() {
|
||||
final var modules = new HashSet<String>();
|
||||
do {
|
||||
|
@ -6,6 +6,8 @@ import com.annimon.ownlang.lib.NumberValue;
|
||||
import com.annimon.ownlang.lib.Value;
|
||||
import com.annimon.ownlang.parser.error.ParseErrorsFormatterStage;
|
||||
import com.annimon.ownlang.stages.*;
|
||||
import com.annimon.ownlang.util.Range;
|
||||
import com.annimon.ownlang.util.SourceLocation;
|
||||
import com.annimon.ownlang.util.input.InputSourceFile;
|
||||
import com.annimon.ownlang.util.input.SourceLoaderStage;
|
||||
|
||||
@ -13,14 +15,24 @@ import com.annimon.ownlang.util.input.SourceLoaderStage;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public final class IncludeStatement extends InterruptableNode implements Statement {
|
||||
public final class IncludeStatement extends InterruptableNode implements Statement, SourceLocation {
|
||||
|
||||
public final Node expression;
|
||||
private Range range;
|
||||
|
||||
public IncludeStatement(Node expression) {
|
||||
this.expression = expression;
|
||||
}
|
||||
|
||||
public void setRange(Range range) {
|
||||
this.range = range;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Range getRange() {
|
||||
return range;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Value eval() {
|
||||
super.interruptionCheck();
|
||||
@ -31,6 +43,7 @@ public final class IncludeStatement extends InterruptableNode implements Stateme
|
||||
new SourceLoaderStage()
|
||||
.then(new LexerStage())
|
||||
.then(new ParserStage())
|
||||
// TODO LinterStage based on main context
|
||||
.then(new FunctionAddingStage())
|
||||
.then(new ExecutionStage())
|
||||
.perform(stagesData, new InputSourceFile(path));
|
||||
|
@ -23,11 +23,13 @@ final class IncludeSourceValidator extends LintVisitor {
|
||||
final String path = expr.eval().asString();
|
||||
if (!detector.isReadable(path)) {
|
||||
results.add(LinterResult.error(
|
||||
"Include statement path \"%s\" is not readable".formatted(path)));
|
||||
"Include statement path \"%s\" is not readable".formatted(path),
|
||||
s.getRange()));
|
||||
}
|
||||
} else {
|
||||
results.add(LinterResult.warning(
|
||||
"Include statement path \"%s\" is not a constant string".formatted(s.expression)));
|
||||
"Include statement path \"%s\" is not a constant string".formatted(s.expression),
|
||||
s.getRange()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,10 +11,18 @@ record LinterResult(Severity severity, String message, Range range) implements S
|
||||
return new LinterResult(Severity.WARNING, message);
|
||||
}
|
||||
|
||||
static LinterResult warning(String message, Range range) {
|
||||
return new LinterResult(Severity.WARNING, message, range);
|
||||
}
|
||||
|
||||
static LinterResult error(String message) {
|
||||
return new LinterResult(Severity.ERROR, message);
|
||||
}
|
||||
|
||||
static LinterResult error(String message, Range range) {
|
||||
return new LinterResult(Severity.ERROR, message, range);
|
||||
}
|
||||
|
||||
LinterResult(Severity severity, String message) {
|
||||
this(severity, message, null);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user