More logging, more try catches, and updated README. 0.8.2 released!

This commit is contained in:
Noah Santschi-Cooney 2018-08-05 20:56:53 +01:00
parent 2421aeb32c
commit 27334114e3
7 changed files with 88 additions and 52 deletions

View file

@ -1,14 +1,14 @@
import { connection, documents, onEvent } from './server'
import fetch from 'node-fetch'
import { platform } from 'os'
import { createWriteStream, chmodSync, createReadStream, unlinkSync, read } from 'fs'
import { createWriteStream, chmodSync, createReadStream, unlinkSync, read, WriteStream } from 'fs'
import * as unzip from 'unzip'
import { postError } from './utils'
import { execSync } from 'child_process'
import { serverLog } from './logging'
import { dirname } from 'path'
import { DidChangeConfigurationParams } from 'vscode-languageserver/lib/main'
import { win } from './linter';
import { DidChangeConfigurationParams } from 'vscode-languageserver'
import { win } from './linter'
const url = {
'win32': 'https://github.com/KhronosGroup/glslang/releases/download/master-tot/glslang-master-windows-x64-Release.zip',
@ -36,8 +36,10 @@ export async function onConfigChange(change: DidChangeConfigurationParams) {
if (conf.shaderpacksPath === '' || conf.shaderpacksPath.replace(dirname(conf.shaderpacksPath), '') !== '/shaderpacks') {
if (supress) return
serverLog.error(() => 'shaderpack path not set or doesn\'t end in \'shaderpacks\'', null)
supress = true
const clicked = await connection.window.showErrorMessage(
'mcglsl.shaderpacksPath is not set or doesn\'t end in \'shaderpacks\'. Please set it in your settings.',
{title: 'Supress'}
@ -78,29 +80,47 @@ async function promptDownloadGlslang() {
async function downloadGlslang() {
connection.window.showInformationMessage('Downloading. Your settings will be updated automatically and you\'ll be notified when its done.')
serverLog.info(() => 'downloading glslangValidator...')
const res = await fetch(url[platform()])
serverLog.info(() => 'glslangValidator downloaded. Extracting...')
try {
const zip = createWriteStream(conf.shaderpacksPath + '/glslangValidator.zip')
res.body.pipe(zip)
const glslang = '/glslangValidator' + (win ? '.exe' : '')
zip.on('finish', async () => {
createReadStream(conf.shaderpacksPath + '/glslangValidator.zip')
.pipe(unzip.Parse())
.on('entry', entry => {
if (entry.path === 'bin/glslangValidator' + win ? '.exe' : '') {
entry.pipe(createWriteStream(conf.shaderpacksPath + '/glslangValidator' + win ? '.exe' : ''))
return
}
entry.autodrain()
})
.on('close', () => {
chmodSync(conf.shaderpacksPath + '/glslangValidator' + win ? '.exe' : '', 0o775)
unlinkSync(conf.shaderpacksPath + '/glslangValidator.zip')
connection.sendNotification('update-config', conf.shaderpacksPath + '/glslangValidator' + win ? '.exe' : '')
connection.window.showInformationMessage('glslangValidator has been downloaded to ' + conf.shaderpacksPath + '/glslangValidator. Your config should be updated automatically.')
glslangReady = true
})
try {
createReadStream(conf.shaderpacksPath + '/glslangValidator.zip')
.pipe(unzip.Parse())
.on('entry', entry => {
try {
if (entry.path === 'bin' + glslang) {
entry.pipe(createWriteStream(conf.shaderpacksPath + glslang))
return
}
entry.autodrain()
} catch (e) {
postError(e)
}
})
.on('close', () => {
try {
chmodSync(conf.shaderpacksPath + glslang, 0o775)
unlinkSync(conf.shaderpacksPath + '/glslangValidator.zip')
connection.sendNotification('update-config', conf.shaderpacksPath + glslang)
connection.window.showInformationMessage('glslangValidator has been downloaded to ' + conf.shaderpacksPath + '/glslangValidator. Your config should be updated automatically.')
glslangReady = true
} catch (e) {
postError(e)
}
})
} catch (e) {
postError(e)
}
})
} catch (e) {
postError(e)

View file

@ -82,19 +82,18 @@ const tokens = new Map([
])
export function preprocess(lines: string[], docURI: string) {
const hasDirective = includeDirective(lines, docURI)
const hasDirective = includeDirective(lines)
const allIncludes = new Set<IncludeObj>()
const diagnostics = new Map<string, Diagnostic[]>()
processIncludes(lines, [docURI], allIncludes, diagnostics, hasDirective)
processIncludes(lines, [docURI], new Set<IncludeObj>(), diagnostics, hasDirective)
const includeMap = new Map<string, IncludeObj>(Array.from(allIncludes).map(obj => [obj.path, obj]) as [string, IncludeObj][])
//const includeMap = new Map<string, IncludeObj>(Array.from(allIncludes).map(obj => [obj.path, obj]) as [string, IncludeObj][])
lint(docURI, lines, includeMap, diagnostics, hasDirective)
lint(docURI, lines, diagnostics, hasDirective)
}
function includeDirective(lines: string[], docURI: string): boolean {
function includeDirective(lines: string[]): boolean {
if (lines.findIndex(x => reIncludeExt.test(x)) > -1) {
linterLog.info(() => 'include directive found')
return true
@ -259,7 +258,7 @@ function mergeInclude(inc: IncludeObj, lines: string[], incStack: string[], diag
lines.splice(inc.lineNumTopLevel + 1 + dataLines.length, 0, `#line ${inc.lineNum + 1} "${inc.parent}"`)
}
function lint(docURI: string, lines: string[], includes: Map<string, IncludeObj>, diagnostics: Map<string, Diagnostic[]>, hasDirective: boolean) {
function lint(docURI: string, lines: string[], diagnostics: Map<string, Diagnostic[]>, hasDirective: boolean) {
let out: string = ''
try {
execSync(`${conf.glslangPath} --stdin -S ${ext.get(path.extname(docURI))}`, {input: lines.join('\n')})
@ -274,7 +273,16 @@ function lint(docURI: string, lines: string[], includes: Map<string, IncludeObj>
processErrors(out, docURI, diagnostics, hasDirective)
daigsArray(diagnostics).forEach(d => {
diagnostics.forEach((diags, uri) => {
if (diags.length === 0) return
linterLog.info(() => `found ${diags.length} error(s) for ${trimPath(uri)}`)
})
const diagsList = daigsArray(diagnostics)
if (diagsList.filter(d => d.diag.length > 0).length === 0) linterLog.info(() => 'no errors found')
diagsList.forEach(d => {
if (win) d.uri = d.uri.replace('file://C:', 'file:///c%3A')
connection.sendDiagnostics({uri: d.uri, diagnostics: d.diag})
})
@ -293,7 +301,8 @@ function processErrors(out: string, docURI: string, diagnostics: Map<string, Dia
const diag: Diagnostic = {
severity: error.type,
range: calcRange(error.line - ((!hasDirective && includeGraph.get(fileName).parents.size === 0) ? 2 : 1), fileName),
range: calcRange(error.line - 1, fileName),
//range: calcRange(error.line - ((!hasDirective && includeGraph.get(fileName).parents.size === 0) ? 2 : 1), fileName),
message: `Line ${error.line + 1} ${replaceWords(error.msg)}`,
source: 'mc-glsl'
}
@ -337,7 +346,7 @@ const filterMatches = (output: string) => output
.filter(match => match && match.length === 5)
function calcRange(lineNum: number, uri: string): Range {
linterLog.debug(() => `calculating range for ${trimPath(uri)} at L${lineNum}`)
linterLog.debug(() => `calculating range for ${trimPath(uri)} at L${lineNum + 1}`)
const lines = getDocumentContents(uri).split('\n')
const line = lines[lineNum]