From d2e58f475d540d58b07307c4378d76cd914c1daa Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Fri, 29 Jun 2018 19:31:56 +0100 Subject: [PATCH] Fixed server crashing if glslangValidator wasnt found --- package.json | 2 +- server/src/linter.ts | 56 ++++++++++++++++++++++++-------------------- server/src/server.ts | 25 ++++++++++++-------- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 555192c..46a8a7a 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "watch:client": "tsc -w -p ./client/tsconfig.json", "watch:server": "tsc -w -p ./server/tsconfig.json", "lint": "tslint -c tslint.json 'server/src/**/*.ts' && tslint -c tslint.json 'client/src/**/*.ts'", - "fix": "tslint -c server/tslint.json --fix server/src/**/*.ts && tslint -c client/tslint.json --fix client/src/**/*.ts" + "fix": "tslint -c tslint.json --fix server/src/**/*.ts && tslint -c tslint.json --fix client/src/**/*.ts" }, "devDependencies": { "@types/node": "^8.0.0", diff --git a/server/src/linter.ts b/server/src/linter.ts index 89ce85b..78c1853 100644 --- a/server/src/linter.ts +++ b/server/src/linter.ts @@ -1,4 +1,4 @@ -import { conf, connection, documents } from './server' +import { conf, connection, documents, checkBinary } from './server' import './global' import { TextDocument, Diagnostic, DiagnosticSeverity, Range } from 'vscode-languageserver' import { exec } from 'child_process' @@ -95,8 +95,8 @@ 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)})) + .filter(obj => reInclude.test(obj.line)) + .map(obj => ({lineNum: obj.num, match: obj.line.match(reInclude)})) function absPath(currFile: string, includeFile: string): string { if (!currFile.startsWith(conf.shaderpacksPath)) { @@ -114,31 +114,35 @@ function absPath(currFile: string, includeFile: string): string { } function lint(uri: string, lines: string[], includes: {lineNum: number, match: RegExpMatchArray}[]) { - const child = exec(`${conf.glslangPath} --stdin -S ${ext[path.extname(uri)]}`, (error, out) => { - const diagnostics: {[uri: string]: Diagnostic[]} = {} - diagnostics[uri] = [] - includes.forEach(obj => { - diagnostics[absPath(uri, obj.match[1])] = [] - }) + checkBinary( + () => { + const child = exec(`${conf.glslangPath} --stdin -S ${ext[path.extname(uri)]}`, (error, out) => { + const diagnostics: {[uri: string]: Diagnostic[]} = {} + diagnostics[uri] = [] + includes.forEach(obj => { + diagnostics[absPath(uri, obj.match[1])] = [] + }) - const matches = filterMatches(out) as RegExpMatchArray[] - matches.forEach((match) => { - const [whole, type, file, line, msg] = match - const diag = { - severity: type === 'ERROR' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, - range: calcRange(parseInt(line) - 1, uri), - message: replaceWord(msg), - source: 'mc-glsl' - } - diagnostics[file].push(diag) - }) + const matches = filterMatches(out) as RegExpMatchArray[] + matches.forEach((match) => { + const [whole, type, file, line, msg] = match + const diag = { + severity: type === 'ERROR' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, + range: calcRange(parseInt(line) - 1, uri), + message: replaceWord(msg), + source: 'mc-glsl' + } + diagnostics[file].push(diag) + }) - daigsArray(diagnostics).forEach((d) => { - connection.sendDiagnostics({uri: 'file://' + d.uri, diagnostics: d.diag}) - }) - }) - lines.forEach(line => child.stdin.write(line)) - child.stdin.end() + daigsArray(diagnostics).forEach(d => { + connection.sendDiagnostics({uri: 'file://' + d.uri, diagnostics: d.diag}) + }) + }) + lines.forEach(line => child.stdin.write(line)) + child.stdin.end() + } + ) } const daigsArray = (diags: {[uri: string]: Diagnostic[]}) => Object.keys(diags).map(uri => ({uri, diag: diags[uri]})) diff --git a/server/src/server.ts b/server/src/server.ts index 35f4b2d..6ea74e0 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -24,9 +24,7 @@ connection.onInitialize((params): vsclang.InitializeResult => { } }) -connection.onExit(() => { - -}) +connection.onExit(() => {}) documents.onDidOpen(onEvent) @@ -38,16 +36,23 @@ function onEvent(event: TextDocumentChangeEvent) { preprocess(event.document, true, [event.document.uri.replace(/^file:\/\//, '')]) } +export function checkBinary(ok: () => void, fail?: () => any) { + exec(conf.glslangPath, (error) => { + if (error['code'] !== 1) { + if (fail) fail() + return + } + ok() + }) +} + connection.onDidChangeConfiguration((change) => { const temp = change.settings.mcglsl as Config conf = new Config(temp['shaderpacksPath'], temp['glslangValidatorPath']) - exec(conf.glslangPath, (error) => { - if (error['code'] !== 1) { - connection.window.showErrorMessage(`[mc-glsl] glslangValidator not found at: ${conf.glslangPath}`) - return - } - documents.all().forEach((document) => preprocess(document, true, [document.uri.replace(/^file:\/\//, '')])) - }) + checkBinary( + () => {documents.all().forEach(document => preprocess(document, true, [document.uri.replace(/^file:\/\//, '')]))}, + () => {connection.window.showErrorMessage(`[mc-glsl] glslangValidator not found at: ${conf.glslangPath}`)} + ) }) connection.onCompletion((textDocumentPosition: vsclang.TextDocumentPositionParams) => completions)