UNPKG

8.01 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3/* --------------------------------------------------------------------------------------------
4 * Copyright (c) Remy Suen. All rights reserved.
5 * Licensed under the MIT License. See License.txt in the project root for license information.
6 * ------------------------------------------------------------------------------------------ */
7const vscode_languageserver_types_1 = require("vscode-languageserver-types");
8const argument_1 = require("./argument");
9const jsonArgument_1 = require("./jsonArgument");
10const modifiableInstruction_1 = require("./modifiableInstruction");
11class JSONInstruction extends modifiableInstruction_1.ModifiableInstruction {
12 constructor(document, range, dockerfile, escapeChar, instruction, instructionRange) {
13 super(document, range, dockerfile, escapeChar, instruction, instructionRange);
14 this.openingBracket = null;
15 this.closingBracket = null;
16 this.jsonStrings = [];
17 const argsContent = this.getRawArgumentsContent();
18 if (argsContent === null) {
19 return;
20 }
21 const args = this.getArguments();
22 if (args.length === 1 && args[0].getValue() === "[]") {
23 let argRange = args[0].getRange();
24 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));
25 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));
26 return;
27 }
28 else if (args.length === 2 && args[0].getValue() === '[' && args[1].getValue() === ']') {
29 this.openingBracket = args[0];
30 this.closingBracket = args[1];
31 return;
32 }
33 const argsOffset = document.offsetAt(this.getArgumentsRange().start);
34 let start = -1;
35 let last = "";
36 let quoted = false;
37 let escapedArg = "";
38 argsCheck: for (let i = 0; i < argsContent.length; i++) {
39 let char = argsContent.charAt(i);
40 switch (char) {
41 case '[':
42 if (last === "") {
43 this.openingBracket = new argument_1.Argument("[", vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + i), document.positionAt(argsOffset + i + 1)));
44 last = '[';
45 }
46 else if (quoted) {
47 escapedArg = escapedArg + char;
48 }
49 else {
50 break argsCheck;
51 }
52 break;
53 case '"':
54 if (last === '[' || last === ',') {
55 start = i;
56 quoted = true;
57 last = '"';
58 escapedArg = escapedArg + char;
59 continue;
60 }
61 else if (last === '"') {
62 if (quoted) {
63 escapedArg = escapedArg + char;
64 // quoted string done
65 quoted = false;
66 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))));
67 escapedArg = "";
68 }
69 else {
70 // should be a , or a ]
71 break argsCheck;
72 }
73 }
74 else {
75 break argsCheck;
76 }
77 break;
78 case ',':
79 if (quoted) {
80 escapedArg = escapedArg + char;
81 }
82 else {
83 if (last === '"') {
84 last = ',';
85 }
86 else {
87 break argsCheck;
88 }
89 }
90 break;
91 case ']':
92 if (quoted) {
93 escapedArg = escapedArg + char;
94 }
95 else if (last !== "") {
96 this.closingBracket = new argument_1.Argument("]", vscode_languageserver_types_1.Range.create(document.positionAt(argsOffset + i), document.positionAt(argsOffset + i + 1)));
97 break argsCheck;
98 }
99 break;
100 case ' ':
101 case '\t':
102 break;
103 case '\\':
104 if (quoted) {
105 switch (argsContent.charAt(i + 1)) {
106 case '"':
107 case '\\':
108 escapedArg = escapedArg + argsContent.charAt(i + 1);
109 i++;
110 continue;
111 case ' ':
112 case '\t':
113 escapeCheck: for (let j = i + 2; j < argsContent.length; j++) {
114 switch (argsContent.charAt(j)) {
115 case '\r':
116 // offset one more for \r\n
117 j++;
118 case '\n':
119 i = j;
120 continue argsCheck;
121 case ' ':
122 case '\t':
123 break;
124 default:
125 break escapeCheck;
126 }
127 }
128 break;
129 case '\r':
130 // offset one more for \r\n
131 i++;
132 default:
133 i++;
134 continue;
135 }
136 }
137 else {
138 escapeCheck: for (let j = i + 1; j < argsContent.length; j++) {
139 switch (argsContent.charAt(j)) {
140 case '\r':
141 // offset one more for \r\n
142 j++;
143 case '\n':
144 i = j;
145 continue argsCheck;
146 case ' ':
147 case '\t':
148 break;
149 default:
150 break escapeCheck;
151 }
152 }
153 }
154 break argsCheck;
155 default:
156 if (!quoted) {
157 break argsCheck;
158 }
159 escapedArg = escapedArg + char;
160 break;
161 }
162 }
163 }
164 stopSearchingForFlags(_value) {
165 return true;
166 }
167 getOpeningBracket() {
168 return this.openingBracket;
169 }
170 getJSONStrings() {
171 return this.jsonStrings;
172 }
173 getClosingBracket() {
174 return this.closingBracket;
175 }
176}
177exports.JSONInstruction = JSONInstruction;