Fixed server crashing if glslangValidator wasnt found

This commit is contained in:
Noah Santschi-Cooney 2018-06-29 19:31:56 +01:00
parent f93c26a59d
commit d2e58f475d
3 changed files with 46 additions and 37 deletions

View file

@ -72,7 +72,7 @@
"watch:client": "tsc -w -p ./client/tsconfig.json", "watch:client": "tsc -w -p ./client/tsconfig.json",
"watch:server": "tsc -w -p ./server/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'", "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": { "devDependencies": {
"@types/node": "^8.0.0", "@types/node": "^8.0.0",

View file

@ -1,4 +1,4 @@
import { conf, connection, documents } from './server' import { conf, connection, documents, checkBinary } from './server'
import './global' import './global'
import { TextDocument, Diagnostic, DiagnosticSeverity, Range } from 'vscode-languageserver' import { TextDocument, Diagnostic, DiagnosticSeverity, Range } from 'vscode-languageserver'
import { exec } from 'child_process' import { exec } from 'child_process'
@ -95,8 +95,8 @@ const formatURI = (uri: string) => uri.replace(/^file:\/\//, '')
//TODO not include in comments //TODO not include in comments
const getIncludes = (lines: string[]) => lines const getIncludes = (lines: string[]) => lines
.map((line, i) => ({num: i, line})) .map((line, i) => ({num: i, line}))
.filter((obj) => reInclude.test(obj.line)) .filter(obj => reInclude.test(obj.line))
.map((obj) => ({lineNum: obj.num, match: obj.line.match(reInclude)})) .map(obj => ({lineNum: obj.num, match: obj.line.match(reInclude)}))
function absPath(currFile: string, includeFile: string): string { function absPath(currFile: string, includeFile: string): string {
if (!currFile.startsWith(conf.shaderpacksPath)) { 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}[]) { function lint(uri: string, lines: string[], includes: {lineNum: number, match: RegExpMatchArray}[]) {
const child = exec(`${conf.glslangPath} --stdin -S ${ext[path.extname(uri)]}`, (error, out) => { checkBinary(
const diagnostics: {[uri: string]: Diagnostic[]} = {} () => {
diagnostics[uri] = [] const child = exec(`${conf.glslangPath} --stdin -S ${ext[path.extname(uri)]}`, (error, out) => {
includes.forEach(obj => { const diagnostics: {[uri: string]: Diagnostic[]} = {}
diagnostics[absPath(uri, obj.match[1])] = [] diagnostics[uri] = []
}) includes.forEach(obj => {
diagnostics[absPath(uri, obj.match[1])] = []
})
const matches = filterMatches(out) as RegExpMatchArray[] const matches = filterMatches(out) as RegExpMatchArray[]
matches.forEach((match) => { matches.forEach((match) => {
const [whole, type, file, line, msg] = match const [whole, type, file, line, msg] = match
const diag = { const diag = {
severity: type === 'ERROR' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, severity: type === 'ERROR' ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning,
range: calcRange(parseInt(line) - 1, uri), range: calcRange(parseInt(line) - 1, uri),
message: replaceWord(msg), message: replaceWord(msg),
source: 'mc-glsl' source: 'mc-glsl'
} }
diagnostics[file].push(diag) diagnostics[file].push(diag)
}) })
daigsArray(diagnostics).forEach((d) => { daigsArray(diagnostics).forEach(d => {
connection.sendDiagnostics({uri: 'file://' + d.uri, diagnostics: d.diag}) connection.sendDiagnostics({uri: 'file://' + d.uri, diagnostics: d.diag})
}) })
}) })
lines.forEach(line => child.stdin.write(line)) lines.forEach(line => child.stdin.write(line))
child.stdin.end() child.stdin.end()
}
)
} }
const daigsArray = (diags: {[uri: string]: Diagnostic[]}) => Object.keys(diags).map(uri => ({uri, diag: diags[uri]})) const daigsArray = (diags: {[uri: string]: Diagnostic[]}) => Object.keys(diags).map(uri => ({uri, diag: diags[uri]}))

View file

@ -24,9 +24,7 @@ connection.onInitialize((params): vsclang.InitializeResult => {
} }
}) })
connection.onExit(() => { connection.onExit(() => {})
})
documents.onDidOpen(onEvent) documents.onDidOpen(onEvent)
@ -38,16 +36,23 @@ function onEvent(event: TextDocumentChangeEvent) {
preprocess(event.document, true, [event.document.uri.replace(/^file:\/\//, '')]) 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) => { connection.onDidChangeConfiguration((change) => {
const temp = change.settings.mcglsl as Config const temp = change.settings.mcglsl as Config
conf = new Config(temp['shaderpacksPath'], temp['glslangValidatorPath']) conf = new Config(temp['shaderpacksPath'], temp['glslangValidatorPath'])
exec(conf.glslangPath, (error) => { checkBinary(
if (error['code'] !== 1) { () => {documents.all().forEach(document => preprocess(document, true, [document.uri.replace(/^file:\/\//, '')]))},
connection.window.showErrorMessage(`[mc-glsl] glslangValidator not found at: ${conf.glslangPath}`) () => {connection.window.showErrorMessage(`[mc-glsl] glslangValidator not found at: ${conf.glslangPath}`)}
return )
}
documents.all().forEach((document) => preprocess(document, true, [document.uri.replace(/^file:\/\//, '')]))
})
}) })
connection.onCompletion((textDocumentPosition: vsclang.TextDocumentPositionParams) => completions) connection.onCompletion((textDocumentPosition: vsclang.TextDocumentPositionParams) => completions)