diff --git a/langserver/java/body-parser3.js b/langserver/java/body-parser3.js index 0d8cea8..9316d6a 100644 --- a/langserver/java/body-parser3.js +++ b/langserver/java/body-parser3.js @@ -154,21 +154,27 @@ function extractSourceTypes(tokens, typemap) { */ function parse(source, typemap) { 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 { - console.time('tokenize'); + time('tokenize'); 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 const source_types = extractSourceTypes(tokens, typemap); // add them to the type map source_types.forEach(t => typemap.set(t.shortSignature, t)); - console.time('parse'); + time('parse'); parseUnit(tokens, unit, typemap); - console.timeEnd('parse'); + timeEnd('parse'); } catch(err) { + timers.forEach(timeEnd); if (tokens) { addproblem(tokens, ParseProblem.Error(tokens.current, `Parse failed: ${err.message}`)); } else { @@ -176,7 +182,10 @@ function parse(source, typemap) { } } - return unit; + return { + unit, + problems, + } } /** diff --git a/langserver/server.js b/langserver/server.js index 37dce8e..e04da90 100644 --- a/langserver/server.js +++ b/langserver/server.js @@ -43,7 +43,7 @@ let connection = createConnection(ProposedFeatures.all); ///** @type {LiveParseInfo[]} */ //const liveParsers = []; -/** @type {{content: string, uri: string, result: SourceUnit, typemap:Map, positionAt:(n) => Position, indexAt:(p:Position) => number}} */ +/** @type {{content: string, uri: string, result: {unit:SourceUnit, problems:*[]}, typemap:Map, positionAt:(n) => Position, indexAt:(p:Position) => number}} */ let parsed = null; function reparse(uri, content) { @@ -261,7 +261,7 @@ async function validateTextDocument(textDocument) { if (parsed && parsed.result) { try { - problems = validate(parsed.result, parsed.typemap); + problems = [...parsed.result.problems, ...validate(parsed.result.unit, parsed.typemap)]; } catch(err) { console.error(err); }