UNPKG

dockerfile-language-service

Version:

A language service for Dockerfiles to enable the creation of feature-rich Dockerfile editors.

194 lines (193 loc) 12.5 kB
(function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "vscode-languageserver-textdocument", "vscode-languageserver-types", "dockerfile-ast", "./dockerDefinition", "./docker"], factory); } })(function (require, exports) { /* -------------------------------------------------------------------------------------------- * Copyright (c) Remy Suen. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. * ------------------------------------------------------------------------------------------ */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.DockerHighlight = void 0; var vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument"); var vscode_languageserver_types_1 = require("vscode-languageserver-types"); var dockerfile_ast_1 = require("dockerfile-ast"); var dockerDefinition_1 = require("./dockerDefinition"); var docker_1 = require("./docker"); var DockerHighlight = /** @class */ (function () { function DockerHighlight() { } DockerHighlight.prototype.computeHighlightRanges = function (content, position) { var dockerfile = dockerfile_ast_1.DockerfileParser.parse(content); var provider = new dockerDefinition_1.DockerDefinition(); var definitionRange = provider.computeDefinitionRange(content, position); var image = definitionRange === null ? dockerfile.getContainingImage(position) : dockerfile.getContainingImage(definitionRange.start); var highlights = []; if (definitionRange === null) { for (var _i = 0, _a = dockerfile.getCOPYs(); _i < _a.length; _i++) { var instruction = _a[_i]; var flag = instruction.getFromFlag(); if (flag) { var range = flag.getValueRange(); if (range && range.start.line === position.line && range.start.character <= position.character && position.character <= range.end.character) { var stage = flag.getValue(); for (var _b = 0, _c = dockerfile.getCOPYs(); _b < _c.length; _b++) { var other = _c[_b]; var otherFlag = other.getFromFlag(); if (otherFlag && otherFlag.getValue().toLowerCase() === stage.toLowerCase()) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(otherFlag.getValueRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } return highlights; } } } for (var _d = 0, _e = dockerfile.getFROMs(); _d < _e.length; _d++) { var from = _e[_d]; for (var _f = 0, _g = from.getVariables(); _f < _g.length; _f++) { var variable = _g[_f]; if (docker_1.Util.isInsideRange(position, variable.getNameRange())) { var name = variable.getName(); for (var _h = 0, _j = dockerfile.getFROMs(); _h < _j.length; _h++) { var loopFrom = _j[_h]; for (var _k = 0, _l = loopFrom.getVariables(); _k < _l.length; _k++) { var fromVariable = _l[_k]; if (fromVariable.getName() === name) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(fromVariable.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } return highlights; } } } if (image !== null) { for (var _m = 0, _o = image.getInstructions(); _m < _o.length; _m++) { var instruction = _o[_m]; for (var _p = 0, _q = instruction.getVariables(); _p < _q.length; _p++) { var variable = _q[_p]; if (docker_1.Util.isInsideRange(position, variable.getNameRange())) { var name = variable.getName(); for (var _r = 0, _s = image.getInstructions(); _r < _s.length; _r++) { var instruction_1 = _s[_r]; if (!(instruction_1 instanceof dockerfile_ast_1.From)) { for (var _t = 0, _u = instruction_1.getVariables(); _t < _u.length; _t++) { var variable_1 = _u[_t]; if (variable_1.getName() === name) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(variable_1.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } } return highlights; } } } } } else { for (var _v = 0, _w = dockerfile.getInstructions(); _v < _w.length; _v++) { var instruction = _w[_v]; if (instruction instanceof dockerfile_ast_1.Copy || instruction instanceof dockerfile_ast_1.Run) { for (var _x = 0, _y = instruction.getHeredocs(); _x < _y.length; _x++) { var heredoc = _y[_x]; var nameRange = heredoc.getNameRange(); if (docker_1.Util.positionEquals(definitionRange.start, nameRange.start) && docker_1.Util.positionEquals(definitionRange.start, nameRange.start)) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(definitionRange, vscode_languageserver_types_1.DocumentHighlightKind.Write)); var delimiterRange = heredoc.getDelimiterRange(); if (delimiterRange !== null) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(delimiterRange, vscode_languageserver_types_1.DocumentHighlightKind.Read)); } return highlights; } } } } var document = vscode_languageserver_textdocument_1.TextDocument.create("", "", 0, content); var definition = document.getText().substring(document.offsetAt(definitionRange.start), document.offsetAt(definitionRange.end)); var isBuildStage = false; var fromInstructions = dockerfile.getFROMs(); for (var _z = 0, fromInstructions_1 = fromInstructions; _z < fromInstructions_1.length; _z++) { var from = fromInstructions_1[_z]; var stage = from.getBuildStage(); if (stage && definition.toLowerCase() === stage.toLowerCase()) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(from.getBuildStageRange(), vscode_languageserver_types_1.DocumentHighlightKind.Write)); isBuildStage = true; } } if (isBuildStage) { for (var _0 = 0, fromInstructions_2 = fromInstructions; _0 < fromInstructions_2.length; _0++) { var from = fromInstructions_2[_0]; if (from.getRange().start.line > definitionRange.start.line) { if (from.getImageName() === definition) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(from.getImageNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } for (var _1 = 0, _2 = dockerfile.getCOPYs(); _1 < _2.length; _1++) { var instruction = _2[_1]; var flag = instruction.getFromFlag(); if (flag) { if (flag.getValue().toLowerCase() === definition.toLowerCase()) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(flag.getValueRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } return highlights; } for (var _3 = 0, _4 = image.getARGs(); _3 < _4.length; _3++) { var arg = _4[_3]; var property = arg.getProperty(); // property may be null if it's an ARG with no arguments if (property && property.getName() === definition) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(property.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Write)); } } for (var _5 = 0, _6 = image.getENVs(); _5 < _6.length; _5++) { var env = _6[_5]; for (var _7 = 0, _8 = env.getProperties(); _7 < _8.length; _7++) { var property = _8[_7]; if (property.getName() === definition) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(property.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Write)); } } } for (var _9 = 0, _10 = image.getInstructions(); _9 < _10.length; _9++) { var instruction = _10[_9]; // only highlight variables in non-FROM instructions if (!(instruction instanceof dockerfile_ast_1.From)) { for (var _11 = 0, _12 = instruction.getVariables(); _11 < _12.length; _11++) { var variable = _12[_11]; if (variable.getName() === definition) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(variable.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } } for (var _13 = 0, _14 = dockerfile.getInitialARGs(); _13 < _14.length; _13++) { var arg = _14[_13]; var property = arg.getProperty(); if (property && docker_1.Util.rangeEquals(property.getNameRange(), definitionRange)) { for (var _15 = 0, _16 = dockerfile.getFROMs(); _15 < _16.length; _15++) { var from = _16[_15]; for (var _17 = 0, _18 = from.getVariables(); _17 < _18.length; _17++) { var variable = _18[_17]; if (variable.getName() === definition) { highlights.push(vscode_languageserver_types_1.DocumentHighlight.create(variable.getNameRange(), vscode_languageserver_types_1.DocumentHighlightKind.Read)); } } } } } } return highlights; }; return DockerHighlight; }()); exports.DockerHighlight = DockerHighlight; });