Start of proper line numbers for includes

This commit is contained in:
Noah Santschi-Cooney 2018-07-04 00:58:06 +01:00
parent dbad626af9
commit a3d1cd0a0e
No known key found for this signature in database
GPG key ID: 3B22282472C8AE48
2 changed files with 21 additions and 5 deletions

View file

@ -71,16 +71,16 @@ export function preprocess(lines: string[], docURI: string, topLevel: boolean, i
} }
} }
const includes = getIncludes(lines) const includes = getIncludes(incStack[0], lines)
let addedLines = 0 let addedLines = 0
if (includes.length > 0) { if (includes.length > 0) {
includes.forEach((inc, i) => { includes.forEach((inc, i) => {
const incPath = absPath(docURI, inc.match[1]) const incPath = absPath(docURI, inc.match[1])
const dataLines = readFileSync(incPath).toString().split('\n') const dataLines = readFileSync(incPath).toString().split('\n')
lines[inc.lineNum + addedLines + i] = `#line 0 "${incPath}"` lines[inc.lineNum + addedLines + i] = `#line 0 "${incPath}"`
lines.splice(inc.lineNum + 1 + addedLines + i, 0, ...dataLines) lines.splice(inc.lineNum + addedLines + i, 0, ...dataLines)
addedLines += dataLines.length addedLines += dataLines.length
lines.splice(inc.lineNum + 1 + addedLines + i, 0, `#line ${inc.lineNum} "${docURI}"`) lines.splice(inc.lineNum + addedLines + i, 0, `#line ${inc.lineNum} "${docURI}"`)
preprocess(lines, incPath, false, incStack) preprocess(lines, incPath, false, incStack)
}) })
} }
@ -96,10 +96,24 @@ export function preprocess(lines: string[], docURI: string, topLevel: boolean, i
export const formatURI = (uri: string) => uri.replace(/^file:\/\//, '') export 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 getIncludes(uri: string, lines: string[]) {
const out: {lineNum: number, parent: string, match: RegExpMatchArray}[] = []
let count = [1] // for each file we need to track the line number
let parStack = [uri] // for each include we need to track its parent
lines.forEach(line => {
count[count.length - 1]++
const match = line.match(reInclude)
if (line.startsWith('#line')) {
parStack.push(line.slice(line.indexOf('"') + 1, line.lastIndexOf('"')))
} else if (match.length === 0) return
})
return out
}
function absPath(currFile: string, includeFile: string): string { function absPath(currFile: string, includeFile: string): string {
if (!currFile.startsWith(conf.shaderpacksPath)) { if (!currFile.startsWith(conf.shaderpacksPath)) {
@ -107,6 +121,7 @@ function absPath(currFile: string, includeFile: string): string {
return return
} }
// TODO add explanation comment
if (includeFile.charAt(0) === '/') { if (includeFile.charAt(0) === '/') {
const shaderPath = currFile.replace(conf.shaderpacksPath, '').split('/').slice(0, 3).join('/') const shaderPath = currFile.replace(conf.shaderpacksPath, '').split('/').slice(0, 3).join('/')
return path.join(conf.shaderpacksPath, shaderPath, includeFile) return path.join(conf.shaderpacksPath, shaderPath, includeFile)

View file

@ -5,6 +5,7 @@
"quotemark": [true, "single"], "quotemark": [true, "single"],
"comment-format": false, "comment-format": false,
"semicolon": [true, "never"], "semicolon": [true, "never"],
"no-conditional-assignment": false,
"ordered-imports": false, "ordered-imports": false,
"object-literal-sort-keys": false, "object-literal-sort-keys": false,
"no-string-literal": false, "no-string-literal": false,