Fix regression where parse errors are not correctly reported
This commit is contained in:
parent
0019f37749
commit
9c5a8b9e59
3 changed files with 14 additions and 8 deletions
|
@ -2,7 +2,7 @@
|
|||
import * as fs from "fs"
|
||||
import chalk from "chalk"
|
||||
import { Syntax } from "./ast";
|
||||
import {format, MapLike, FormatArg, countDigits, mapValues, prettyPrint, assert} from "./util";
|
||||
import {format, MapLike, FormatArg, countDigits, mapValues, prettyPrint, assert, isPlainObject, isPrimitive, JsonObject, Json} from "./util";
|
||||
import { BOLT_DIAG_NUM_EXTRA_LINES } from "./constants";
|
||||
import { TextPos, TextFile, TextSpan } from "./text";
|
||||
|
||||
|
@ -125,7 +125,7 @@ export class DiagnosticPrinter {
|
|||
out += chalk.bold.yellow(`${span.file.origPath}:${span.start.line}:${span.start.column}: `);
|
||||
}
|
||||
if (diagnostic.args !== undefined) {
|
||||
out += format(diagnostic.message, mapValues(diagnostic.args, prettyPrint)) + '\n';
|
||||
out += format(diagnostic.message, diagnostic.args) + '\n';
|
||||
} else {
|
||||
out += diagnostic.message + '\n';
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ import { TypeChecker } from "./types"
|
|||
import { CheckInvalidFilePaths, CheckTypeAssignments, CheckReferences } from "./checks"
|
||||
import { SymbolResolver, BoltSymbolResolutionStrategy } from "./resolver"
|
||||
import { Evaluator } from "./evaluator"
|
||||
import { getNodeLanguage, ParseError, ScanError } from "./common"
|
||||
import { getNodeLanguage, ParseError, ScanError, describeKind } from "./common"
|
||||
import { Package, loadPackageMetadata } from "./package"
|
||||
import { TextFile } from "./text"
|
||||
import { Scanner } from "./scanner"
|
||||
|
@ -191,7 +191,7 @@ export class Frontend {
|
|||
} else if (e instanceof ParseError) {
|
||||
this.diagnostics.add({
|
||||
message: E_PARSE_ERROR,
|
||||
args: { actual: kindToString(e.actual.kind), expected: e.expected.map(kindToString) },
|
||||
args: { actual: describeKind(e.actual.kind), expected: e.expected.map(describeKind) },
|
||||
node: e.actual,
|
||||
severity: 'fatal',
|
||||
});
|
||||
|
|
14
src/util.ts
14
src/util.ts
|
@ -627,6 +627,9 @@ type FormatModifierFn = (value: any) => any;
|
|||
const FORMAT_MODIFIERS: MapLike<FormatModifierFn> = {
|
||||
enum(elements) {
|
||||
return enumOr(elements);
|
||||
},
|
||||
pretty(value) {
|
||||
return value.map(prettyPrint);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -643,17 +646,20 @@ export function format(message: string, data: MapLike<FormatArg>) {
|
|||
switch (mode) {
|
||||
case FormatScanMode.ScanningParamModifier:
|
||||
if (ch === '}') {
|
||||
modifiers.push(modifierName);
|
||||
push();
|
||||
} else if (ch === ':') {
|
||||
if (modifierName.length === 0) {
|
||||
throw new Error(`Parameter modfifier name in format string is empty.`)
|
||||
}
|
||||
modifiers.push(modifierName);
|
||||
modifierName = '';
|
||||
push();
|
||||
} else if (ch === ':') {
|
||||
if (modifierName.length > 0) {
|
||||
modifiers.push(modifierName);
|
||||
modifierName = '';
|
||||
}
|
||||
} else {
|
||||
modifierName += ch;
|
||||
}
|
||||
break;
|
||||
case FormatScanMode.ScanningParamName:
|
||||
if (ch === '}') {
|
||||
push();
|
||||
|
|
Loading…
Reference in a new issue