report errors from unit parsing

This commit is contained in:
Dave Holoway
2020-06-15 16:58:45 +01:00
parent a8653f26df
commit 4af183e4e1
2 changed files with 17 additions and 8 deletions

View File

@@ -154,21 +154,27 @@ function extractSourceTypes(tokens, typemap) {
*/ */
function parse(source, typemap) { function parse(source, typemap) {
const unit = new SourceUnit(); const unit = new SourceUnit();
let tokens; /** @type {ParseProblem[]} */
let problems = [];
let tokens, timers = new Set();
const time = name => (timers.add(name), console.time(name));
const timeEnd = name => (timers.delete(name), console.timeEnd(name));
try { try {
console.time('tokenize'); time('tokenize');
tokens = new TokenList(tokenize(source)); tokens = new TokenList(tokenize(source));
console.timeEnd('tokenize'); problems = tokens.problems;
timeEnd('tokenize');
// in order to resolve types as we parse, we must extract the set of source types first // in order to resolve types as we parse, we must extract the set of source types first
const source_types = extractSourceTypes(tokens, typemap); const source_types = extractSourceTypes(tokens, typemap);
// add them to the type map // add them to the type map
source_types.forEach(t => typemap.set(t.shortSignature, t)); source_types.forEach(t => typemap.set(t.shortSignature, t));
console.time('parse'); time('parse');
parseUnit(tokens, unit, typemap); parseUnit(tokens, unit, typemap);
console.timeEnd('parse'); timeEnd('parse');
} catch(err) { } catch(err) {
timers.forEach(timeEnd);
if (tokens) { if (tokens) {
addproblem(tokens, ParseProblem.Error(tokens.current, `Parse failed: ${err.message}`)); addproblem(tokens, ParseProblem.Error(tokens.current, `Parse failed: ${err.message}`));
} else { } else {
@@ -176,7 +182,10 @@ function parse(source, typemap) {
} }
} }
return unit; return {
unit,
problems,
}
} }
/** /**

View File

@@ -43,7 +43,7 @@ let connection = createConnection(ProposedFeatures.all);
///** @type {LiveParseInfo[]} */ ///** @type {LiveParseInfo[]} */
//const liveParsers = []; //const liveParsers = [];
/** @type {{content: string, uri: string, result: SourceUnit, typemap:Map<string,JavaType>, positionAt:(n) => Position, indexAt:(p:Position) => number}} */ /** @type {{content: string, uri: string, result: {unit:SourceUnit, problems:*[]}, typemap:Map<string,JavaType>, positionAt:(n) => Position, indexAt:(p:Position) => number}} */
let parsed = null; let parsed = null;
function reparse(uri, content) { function reparse(uri, content) {
@@ -261,7 +261,7 @@ async function validateTextDocument(textDocument) {
if (parsed && parsed.result) { if (parsed && parsed.result) {
try { try {
problems = validate(parsed.result, parsed.typemap); problems = [...parsed.result.problems, ...validate(parsed.result.unit, parsed.typemap)];
} catch(err) { } catch(err) {
console.error(err); console.error(err);
} }