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 flag_1 = require("./flag");
|
9 | const instruction_1 = require("./instruction");
|
10 | class ModifiableInstruction extends instruction_1.Instruction {
|
11 | constructor(document, range, dockerfile, escapeChar, instruction, instructionRange) {
|
12 | super(document, range, dockerfile, escapeChar, instruction, instructionRange);
|
13 | }
|
14 | getFlags() {
|
15 | if (!this.flags) {
|
16 | this.flags = [];
|
17 | for (let arg of this.getArguments()) {
|
18 | let value = arg.getValue();
|
19 | if (this.stopSearchingForFlags(value)) {
|
20 | return this.flags;
|
21 | }
|
22 | else if (value.indexOf("--") === 0) {
|
23 | let range = arg.getRange();
|
24 | let rawValue = this.document.getText().substring(this.document.offsetAt(range.start), this.document.offsetAt(range.end));
|
25 | let nameIndex = value.indexOf('=');
|
26 | let index = rawValue.indexOf('=');
|
27 | let firstMatch = false;
|
28 | let secondMatch = false;
|
29 | let startIndex = -1;
|
30 | nameSearchLoop: for (let i = 0; i < rawValue.length; i++) {
|
31 | switch (rawValue.charAt(i)) {
|
32 | case '\\':
|
33 | case ' ':
|
34 | case '\t':
|
35 | case '\r':
|
36 | case '\n':
|
37 | break;
|
38 | case '-':
|
39 | if (secondMatch) {
|
40 | startIndex = i;
|
41 | break nameSearchLoop;
|
42 | }
|
43 | else if (firstMatch) {
|
44 | secondMatch = true;
|
45 | }
|
46 | else {
|
47 | firstMatch = true;
|
48 | }
|
49 | break;
|
50 | default:
|
51 | startIndex = i;
|
52 | break nameSearchLoop;
|
53 | }
|
54 | }
|
55 | let nameStart = this.document.positionAt(this.document.offsetAt(range.start) + startIndex);
|
56 | if (index === -1) {
|
57 | this.flags.push(new flag_1.Flag(this.document, range, value.substring(2), vscode_languageserver_types_1.Range.create(nameStart, range.end), null, null));
|
58 | }
|
59 | else if (index === value.length - 1) {
|
60 | let nameEnd = this.document.positionAt(this.document.offsetAt(range.start) + index);
|
61 | this.flags.push(new flag_1.Flag(this.document, range, value.substring(2, index), vscode_languageserver_types_1.Range.create(nameStart, nameEnd), "", vscode_languageserver_types_1.Range.create(range.end, range.end)));
|
62 | }
|
63 | else {
|
64 | let nameEnd = this.document.positionAt(this.document.offsetAt(range.start) + index);
|
65 | this.flags.push(new flag_1.Flag(this.document, range, value.substring(2, nameIndex), vscode_languageserver_types_1.Range.create(nameStart, nameEnd), value.substring(nameIndex + 1), vscode_languageserver_types_1.Range.create(this.document.positionAt(this.document.offsetAt(range.start) + index + 1), range.end)));
|
66 | }
|
67 | }
|
68 | }
|
69 | }
|
70 | return this.flags;
|
71 | }
|
72 | getArguments() {
|
73 | const args = super.getArguments();
|
74 | const flags = this.getFlags();
|
75 | if (flags.length === 0) {
|
76 | return args;
|
77 | }
|
78 | for (let i = 0; i < flags.length; i++) {
|
79 | args.shift();
|
80 | }
|
81 | return args;
|
82 | }
|
83 | }
|
84 | exports.ModifiableInstruction = ModifiableInstruction;
|