UNPKG

dockerfile-ast

Version:

Parse a Dockerfile into an array of instructions and comments.

175 lines (174 loc) 7.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JSONInstruction = void 0; const vscode_languageserver_types_1 = require("vscode-languageserver-types"); const argument_1 = require("./argument"); const jsonArgument_1 = require("./jsonArgument"); const modifiableInstruction_1 = require("./modifiableInstruction"); class JSONInstruction extends modifiableInstruction_1.ModifiableInstruction { constructor(document, range, dockerfile, escapeChar, instruction, instructionRange) { super(document, range, dockerfile, escapeChar, instruction, instructionRange); this.openingBracket = null; this.closingBracket = null; this.jsonStrings = []; const argsContent = this.getRawArgumentsContent(); if (argsContent === null) { return; } const args = this.getArguments(); if (args.length === 1 && args[0].getValue() === "[]") { let argRange = args[0].getRange(); this.openingBracket = new argument_1.Argument("[", vscode_languageserver_types_1.Range.create(argRange.start.line, argRange.start.character, argRange.start.line, argRange.start.character + 1)); this.closingBracket = new argument_1.Argument("]", vscode_languageserver_types_1.Range.create(argRange.start.line, argRange.start.character + 1, argRange.end.line, argRange.end.character)); return; } else if (args.length === 2 && args[0].getValue() === '[' && args[1].getValue() === ']') { this.openingBracket = args[0]; this.closingBracket = args[1]; return; } const argsOffset = document.offsetAt(this.getArgumentsRange().start); let start = -1; let last = ""; let quoted = false; let escapedArg = ""; argsCheck: for (let i = 0; i < argsContent.length; i++) { let char = argsContent.charAt(i); switch (char) { case '[': if (last === "") { this.openingBracket = new argument_1.Argument("[", vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + i), document.positionAt(argsOffset + i + 1))); last = '['; } else if (quoted) { escapedArg = escapedArg + char; } else { break argsCheck; } break; case '"': if (last === '[' || last === ',') { start = i; quoted = true; last = '"'; escapedArg = escapedArg + char; continue; } else if (last === '"') { if (quoted) { escapedArg = escapedArg + char; // quoted string done quoted = false; this.jsonStrings.push(new jsonArgument_1.JSONArgument(escapedArg, vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + start), document.positionAt(argsOffset + i + 1)), vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + start + 1), document.positionAt(argsOffset + i)))); escapedArg = ""; } else { // should be a , or a ] break argsCheck; } } else { break argsCheck; } break; case ',': if (quoted) { escapedArg = escapedArg + char; } else { if (last === '"') { last = ','; } else { break argsCheck; } } break; case ']': if (quoted) { escapedArg = escapedArg + char; } else if (last !== "") { this.closingBracket = new argument_1.Argument("]", vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + i), document.positionAt(argsOffset + i + 1))); break argsCheck; } break; case ' ': case '\t': break; case '\\': if (quoted) { switch (argsContent.charAt(i + 1)) { case '"': case '\\': escapedArg = escapedArg + argsContent.charAt(i + 1); i++; continue; case ' ': case '\t': escapeCheck: for (let j = i + 2; j < argsContent.length; j++) { switch (argsContent.charAt(j)) { case '\r': // offset one more for \r\n j++; case '\n': i = j; continue argsCheck; case ' ': case '\t': break; default: break escapeCheck; } } break; case '\r': // offset one more for \r\n i++; default: i++; continue; } } else { escapeCheck: for (let j = i + 1; j < argsContent.length; j++) { switch (argsContent.charAt(j)) { case '\r': // offset one more for \r\n j++; case '\n': i = j; continue argsCheck; case ' ': case '\t': break; default: break escapeCheck; } } } break argsCheck; default: if (!quoted) { break argsCheck; } escapedArg = escapedArg + char; break; } } } stopSearchingForFlags(_value) { return true; } getOpeningBracket() { return this.openingBracket; } getJSONStrings() { return this.jsonStrings; } getClosingBracket() { return this.closingBracket; } } exports.JSONInstruction = JSONInstruction;