From a489cfe6905e6911700428afacf1081df19e2759 Mon Sep 17 00:00:00 2001 From: Jannik <72194488+JannikGM@users.noreply.github.com> Date: Tue, 11 Jul 2023 18:27:41 +0200 Subject: [PATCH] Fix preprocessor directives in GLSL beautify --- sample/js/simple.js | 11 ++++- .../sourceCode/sourceCodeComponent.ts | 43 ++++++++++++++----- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/sample/js/simple.js b/sample/js/simple.js index c31e926..ac83ab0 100644 --- a/sample/js/simple.js +++ b/sample/js/simple.js @@ -42,7 +42,16 @@ var vertexShaderSource = "attribute vec3 aVertexPosition;" + var fragmentShaderSource = "varying lowp vec4 vColor;" + -"void main(void) {" + +"void main(void) {\n" + + +"#define TEST {}\n" + +"\n" + +"\n" + +"#ifdef TEST\n" + +"{}\n" + +"#endif\n" + +"{}\n" + + " gl_FragColor = vColor;" + "}"; diff --git a/src/embeddedFrontend/resultView/sourceCode/sourceCodeComponent.ts b/src/embeddedFrontend/resultView/sourceCode/sourceCodeComponent.ts index 2160119..adc4f3d 100644 --- a/src/embeddedFrontend/resultView/sourceCode/sourceCodeComponent.ts +++ b/src/embeddedFrontend/resultView/sourceCode/sourceCodeComponent.ts @@ -142,19 +142,41 @@ export class SourceCodeComponent extends BaseComponent { * Beautify the given string : correct indentation according to brackets */ private _beautify(glsl: string, level: number = 0): string { + let spaces = ""; + for (let i = 0; i < level; i++) { + spaces += " "; // 4 spaces + } - // return condition : no brackets at all + const untrimmedGlsl = glsl; glsl = glsl.trim(); + + // If preprocessor, indent the preprocessor line and beautify the rest + if (glsl[0] === "#") { + + // Figure out if we trimmed away a newline + const preprocessorStart = untrimmedGlsl.indexOf("#"); + const newline = untrimmedGlsl.indexOf("\n"); + let preservedNewline: string = ""; + if (newline !== -1) { + if (newline < preprocessorStart) { + preservedNewline = spaces + "\n"; + } + } + + const firstLineEnd = glsl.indexOf("\n"); + const preprocessorLineEnd = (firstLineEnd !== -1) ? firstLineEnd : glsl.length; + const preprocessorLine = glsl.substr(0, preprocessorLineEnd); + const rest = glsl.substr(preprocessorLineEnd + 1); + + return preservedNewline + spaces + preprocessorLine + "\n" + this._beautify(rest, level); + } + + // return condition : no brackets at all glsl = this._adaptComments(glsl); const brackets = this._getBracket(glsl); const firstBracket = brackets.firstIteration; const lastBracket = brackets.lastIteration; - let spaces = ""; - for (let i = 0; i < level; i++) { - spaces += " "; // 4 spaces - } - let result: string; // If no brackets, return the indented string if (firstBracket === -1) { @@ -171,13 +193,14 @@ export class SourceCodeComponent extends BaseComponent { else { // if brackets, beautify the inside // let insideWithBrackets = glsl.substr(firstBracket, lastBracket-firstBracket+1); - const left = glsl.substr(0, firstBracket); - const right = glsl.substr(lastBracket + 1, glsl.length); + const left = glsl.substr(0, firstBracket).trim(); + const right = glsl.substr(lastBracket + 1, glsl.length).trim(); const inside = glsl.substr(firstBracket + 1, lastBracket - firstBracket - 1).trim(); + const prettyLeft = (left === "") ? spaces + "{" : this._beautify(left, level) + " {\n"; const prettyInside = this._beautify(inside, level + 1); - result = this._beautify(left, level) + " {\n" + prettyInside + "\n" + spaces + "}\n" + this._beautify(right, level); + const prettyRight = this._beautify(right, level); + result = prettyLeft + prettyInside + "\n" + spaces + "}\n" + prettyRight; result = result.replace(/\s*\n+\s*;/g, ";"); // Orphan ; - result = result.replace(/#endif[\t \f\v]*{/g, "\n {"); // Curly after #Endig } result = result.replace(SourceCodeComponent.semicolonReplacementKeyRegex, ";");