From 8bf9b17efcc813d1e058d25ccca499ed15c061e5 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Tue, 10 Jul 2018 01:22:18 +0100 Subject: [PATCH] SHE WORKS!!!!11!1! A glorious day indeed. Now all thats left to do is to do a big cleanup of the codebase and have proper error and comment handling. Info about current commit: 1) Reason the wrong outro parent file was added was due to the change at (now) line 82. Self explanatory. 2) Using maps now for diagnostics as well instead of indexable types. 3) Fixed the ternary operator. Forgot that '0' is truthy.. 4) using readFileSync to load files that arent loaded into documents. TODO: The todos listed in the code as well as file caching --- server/src/linter.ts | 52 ++++++++++++++++++++------------------------ server/src/server.ts | 2 +- server/tsconfig.json | 2 +- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/server/src/linter.ts b/server/src/linter.ts index da5095b..d15d930 100644 --- a/server/src/linter.ts +++ b/server/src/linter.ts @@ -73,41 +73,30 @@ export function preprocess(lines: string[], docURI: string, topLevel: boolean, i const includes = getIncludes(incStack[0], lines) if (includes.length > 0) { - // TODO only parse from the start of the merged section to the end of it - // problem: end of it changes if theres more merges - //console.log(JSON.stringify(includes, null, 2)) includes.reverse().forEach(inc => { const incPath = absPath(inc.parent, inc.match[1]) + incStack.push(incPath) const dataLines = readFileSync(incPath).toString().split('\n') lines[inc.lineNumParent] = `#line 0 "${incPath}"` lines.splice(inc.lineNumParent + 1, 0, ...dataLines) - lines.splice(inc.lineNumParent + 1 + dataLines.length, 0, `#line ${inc.lineNum} "${docURI}"`) + lines.splice(inc.lineNumParent + 1 + dataLines.length, 0, `#line ${inc.lineNum} "${inc.parent}"`) }) - //if (!topLevel) return - console.log(lines.join('\n') + '------------------------------------------------------') - console.log(num) - if (num === 4) return - num++ preprocess(lines, docURI, false, incStack, num) } if (!topLevel) return try { - //lint(docURI, lines, includes) + lint(docURI, lines, incStack) } catch (e) { + console.log(e) } } export const formatURI = (uri: string) => uri.replace(/^file:\/\//, '') -//TODO not include in comments -/* const getIncludes = (lines: string[]) => lines - .map((line, i) => ({num: i, line})) - .filter(obj => reInclude.test(obj.line)) - .map(obj => ({lineNum: obj.num, match: obj.line.match(reInclude)})) - */ +// TODO no function getIncludes(uri: string, lines: string[]) { const out: {lineNum: number, lineNumParent: number, parent: string, match: RegExpMatchArray}[] = [] const count = [0] // for each file we need to track the line number @@ -117,8 +106,6 @@ function getIncludes(uri: string, lines: string[]) { const match = line.match(reInclude) if (line.startsWith('#line')) { const inc = line.slice(line.indexOf('"') + 1, line.lastIndexOf('"')) - //console.log(`${parStack[parStack.length - 1]}\n\t${count[count.length - 1]} | ${inc}`) - console.log(inc) if (inc === parStack[parStack.length - 2]) { count.pop() parStack.pop() @@ -154,38 +141,39 @@ function absPath(currFile: string, includeFile: string): string { return path.join(path.dirname(currFile), includeFile) } -function lint(uri: string, lines: string[], includes: {lineNum: number, match: RegExpMatchArray}[]) { - console.log(lines.join('\n')) +function lint(uri: string, lines: string[], includes: string[]) { let out: string = '' try { - execSync(`${conf.glslangPath} --stdin -S ${ext[path.extname(uri)]}`, {input: lines.join('\n')}) + execSync(`${conf.glslangPath} --stdin -S ${ext.get(path.extname(uri))}`, {input: lines.join('\n')}) } catch (e) { out = e.stdout.toString() } - const diagnostics: {[uri: string]: Diagnostic[]} = {uri: []} + const diagnostics = new Map([[uri, Array()]]) includes.forEach(obj => { - diagnostics[absPath(uri, obj.match[1])] = [] + diagnostics.set(obj, []) }) const matches = filterMatches(out) matches.forEach((match) => { const [whole, type, file, line, msg] = match - const diag = { + const diag: Diagnostic = { severity: type === 'ERROR' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, - range: calcRange(parseInt(line) - 1, uri), + range: calcRange(parseInt(line) - 1, file.length - 1 ? file : uri), message: replaceWord(msg), source: 'mc-glsl' } - diagnostics[file ? uri : file].push(diag) + diagnostics.get(file.length - 1 ? file : uri).push(diag) }) - daigsArray(diagnostics).forEach(d => connection.sendDiagnostics({uri: d.uri, diagnostics: d.diag})) + daigsArray(diagnostics).forEach(d => { + connection.sendDiagnostics({uri: d.uri, diagnostics: d.diag}) + }) } const replaceWord = (msg: string) => Object.entries(tokens).reduce((acc, [key, value]) => acc.replace(key, value), msg) -const daigsArray = (diags: {[uri: string]: Diagnostic[]}) => Object.keys(diags).map(uri => ({uri: 'file://' + uri, diag: diags[uri]})) +const daigsArray = (diags: Map) => Array.from(diags).map(kv => ({uri: 'file://' + kv[0], diag: kv[1]})) const filterMatches = (output: string) => output .split('\n') @@ -194,7 +182,13 @@ const filterMatches = (output: string) => output .filter(match => match && match.length === 5) function calcRange(lineNum: number, uri: string): Range { - const lines = documents.get('file://' + uri).getText().split('\n') + let lines = [] + // TODO better error handling maybe? + if (documents.keys().includes('file://' + uri)) { + lines = documents.get('file://' + uri).getText().split('\n') + } else { + lines = readFileSync(uri).toString().split('\n') + } const line = lines[lineNum] const startOfLine = line.length - line.trimLeft().length const endOfLine = line.slice(0, line.indexOf('//')).trimRight().length + 1 diff --git a/server/src/server.ts b/server/src/server.ts index 988f506..5fd22f5 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -42,7 +42,7 @@ connection.onDidChangeConfiguration((change) => { conf = new Config(temp['shaderpacksPath'], temp['glslangValidatorPath']) try { execSync(conf.glslangPath) - documents.all().forEach(document => onEvent(document)) + documents.all().forEach(document => onEvent) } catch (e) { if (e.status !== 1) { connection.window.showErrorMessage(`[mc-glsl] glslangValidator not found at: '${conf.glslangPath}' or returned non-0 code`) diff --git a/server/tsconfig.json b/server/tsconfig.json index d4959b4..fa74049 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -6,7 +6,7 @@ "sourceMap": true, "outDir": "out", "rootDir": "src", - "lib": [ "es6", "es2017" ] + "lib": [ "es6", "es2017" ] }, "include": [ "src"