UNPKG

4.38 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 flag_1 = require("./flag");
9const instruction_1 = require("./instruction");
10class 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}
84exports.ModifiableInstruction = ModifiableInstruction;