1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | const vscode_languageserver_types_1 = require("vscode-languageserver-types");
|
8 | const argument_1 = require("./argument");
|
9 | const jsonArgument_1 = require("./jsonArgument");
|
10 | const modifiableInstruction_1 = require("./modifiableInstruction");
|
11 | class 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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | }
|
177 | exports.JSONInstruction = JSONInstruction;
|