| Index: third_party/WebKit/Source/devtools/front_end/sass/SASSProcessor.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSProcessor.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSProcessor.js
|
| index eef5ef000a85626e3498d94f680620e7116b96b8..11909cc489650b1f932e6d70b084a83e8295d3f1 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSProcessor.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSProcessor.js
|
| @@ -1,562 +1,543 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.ASTService} astService
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!Array<!WebInspector.SASSProcessor.EditOperation>} editOperations
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor = function(astService, map, editOperations)
|
| -{
|
| +WebInspector.SASSProcessor = class {
|
| + /**
|
| + * @param {!WebInspector.ASTService} astService
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!Array<!WebInspector.SASSProcessor.EditOperation>} editOperations
|
| + */
|
| + constructor(astService, map, editOperations) {
|
| this._astService = astService;
|
| this._map = map;
|
| this._editOperations = editOperations;
|
| -};
|
| -
|
| -WebInspector.SASSProcessor.prototype = {
|
| - /**
|
| - * @return {!Promise<?WebInspector.SourceMap.EditResult>}
|
| - */
|
| - _mutate: function()
|
| - {
|
| - /** @type {!Set<!WebInspector.SASSSupport.Rule>} */
|
| - var changedCSSRules = new Set();
|
| - for (var editOperation of this._editOperations) {
|
| - var rules = editOperation.perform();
|
| - changedCSSRules.addAll(rules);
|
| - }
|
| -
|
| - // Reparse new texts, make sure changes result in anticipated AST trees.
|
| - var promises = [];
|
| - for (var ast of this._map.models().values()) {
|
| - if (!ast.document.hasChanged())
|
| - continue;
|
| - var promise;
|
| - if (ast.document.url === this._map.compiledURL())
|
| - promise = this._astService.parseCSS(ast.document.url, ast.document.newText().value());
|
| - else
|
| - promise = this._astService.parseSCSS(ast.document.url, ast.document.newText().value());
|
| - promises.push(promise);
|
| - }
|
| -
|
| - return Promise.all(promises)
|
| - .then(this._onFinished.bind(this, changedCSSRules));
|
| - },
|
| -
|
| - /**
|
| - * @param {!Set<!WebInspector.SASSSupport.Rule>} changedCSSRules
|
| - * @param {!Array<!WebInspector.SASSSupport.AST>} changedModels
|
| - * @return {?WebInspector.SourceMap.EditResult}
|
| - */
|
| - _onFinished: function(changedCSSRules, changedModels)
|
| - {
|
| - var nodeMapping = new Map();
|
| - var map = this._map.rebase(changedModels, nodeMapping);
|
| - if (!map)
|
| - return null;
|
| -
|
| - var cssEdits = [];
|
| - for (var rule of changedCSSRules) {
|
| - var oldRange = rule.styleRange;
|
| - var newRule = nodeMapping.get(rule);
|
| - var newText = newRule.document.text.extract(newRule.styleRange);
|
| - cssEdits.push(new WebInspector.SourceEdit(newRule.document.url, oldRange, newText));
|
| - }
|
| -
|
| - /** @type {!Map<string, string>} */
|
| - var newSASSSources = new Map();
|
| - for (var model of changedModels) {
|
| - if (model.document.url === map.compiledURL())
|
| - continue;
|
| - newSASSSources.set(model.document.url, model.document.text.value());
|
| - }
|
| - return new WebInspector.SourceMap.EditResult(map, cssEdits, newSASSSources);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.Property} cssProperty
|
| - * @return {?WebInspector.SASSSupport.Property}
|
| - */
|
| -WebInspector.SASSProcessor._toSASSProperty = function(map, cssProperty)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.Property} cssProperty
|
| + * @return {?WebInspector.SASSSupport.Property}
|
| + */
|
| + static _toSASSProperty(map, cssProperty) {
|
| var sassName = map.toSourceNode(cssProperty.name);
|
| return sassName ? sassName.parent : null;
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| - * @return {!Array<!WebInspector.SASSSupport.Property>}
|
| - */
|
| -WebInspector.SASSProcessor._toCSSProperties = function(map, sassProperty)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| + * @return {!Array<!WebInspector.SASSSupport.Property>}
|
| + */
|
| + static _toCSSProperties(map, sassProperty) {
|
| return map.toCompiledNodes(sassProperty.name).map(name => name.parent);
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.ASTService} astService
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!Array<!WebInspector.TextRange>} ranges
|
| - * @param {!Array<string>} newTexts
|
| - * @return {!Promise<?WebInspector.SourceMap.EditResult>}
|
| - */
|
| -WebInspector.SASSProcessor.processCSSEdits = function(astService, map, ranges, newTexts)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ASTService} astService
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!Array<!WebInspector.TextRange>} ranges
|
| + * @param {!Array<string>} newTexts
|
| + * @return {!Promise<?WebInspector.SourceMap.EditResult>}
|
| + */
|
| + static processCSSEdits(astService, map, ranges, newTexts) {
|
| console.assert(ranges.length === newTexts.length);
|
| var cssURL = map.compiledURL();
|
| var cssText = map.compiledModel().document.text;
|
| for (var i = 0; i < ranges.length; ++i)
|
| - cssText = new WebInspector.Text(cssText.replaceRange(ranges[i], newTexts[i]));
|
| - return astService.parseCSS(cssURL, cssText.value())
|
| - .then(onCSSParsed);
|
| + cssText = new WebInspector.Text(cssText.replaceRange(ranges[i], newTexts[i]));
|
| + return astService.parseCSS(cssURL, cssText.value()).then(onCSSParsed);
|
|
|
| /**
|
| * @param {!WebInspector.SASSSupport.AST} newCSSAST
|
| * @return {!Promise<?WebInspector.SourceMap.EditResult>}
|
| */
|
| - function onCSSParsed(newCSSAST)
|
| - {
|
| - if (newCSSAST.rules.length !== map.compiledModel().rules.length)
|
| - return Promise.resolve(/** @type {?WebInspector.SourceMap.EditResult} */(null));
|
| - // TODO(lushnikov): only diff changed styles.
|
| - var cssDiff = WebInspector.SASSSupport.diffModels(map.compiledModel(), newCSSAST);
|
| - var edits = WebInspector.SASSProcessor._editsFromCSSDiff(cssDiff, map);
|
| -
|
| - // Determine AST trees which will change and clone them.
|
| - var changedURLs = new Set(edits.map(edit => edit.sassURL));
|
| - changedURLs.add(map.compiledURL());
|
| - var clonedModels = [];
|
| - for (var url of changedURLs)
|
| - clonedModels.push(map.modelForURL(url).clone());
|
| -
|
| - // Rebase map and edits onto a cloned AST trees.
|
| - var nodeMapping = new Map();
|
| - var rebasedMap = /** @type {!WebInspector.ASTSourceMap} */(map.rebase(clonedModels, nodeMapping));
|
| - console.assert(rebasedMap);
|
| - var rebasedEdits = edits.map(edit => edit.rebase(rebasedMap, nodeMapping));
|
| -
|
| - return new WebInspector.SASSProcessor(astService, rebasedMap, rebasedEdits)._mutate();
|
| + function onCSSParsed(newCSSAST) {
|
| + if (newCSSAST.rules.length !== map.compiledModel().rules.length)
|
| + return Promise.resolve(/** @type {?WebInspector.SourceMap.EditResult} */ (null));
|
| + // TODO(lushnikov): only diff changed styles.
|
| + var cssDiff = WebInspector.SASSSupport.diffModels(map.compiledModel(), newCSSAST);
|
| + var edits = WebInspector.SASSProcessor._editsFromCSSDiff(cssDiff, map);
|
| +
|
| + // Determine AST trees which will change and clone them.
|
| + var changedURLs = new Set(edits.map(edit => edit.sassURL));
|
| + changedURLs.add(map.compiledURL());
|
| + var clonedModels = [];
|
| + for (var url of changedURLs)
|
| + clonedModels.push(map.modelForURL(url).clone());
|
| +
|
| + // Rebase map and edits onto a cloned AST trees.
|
| + var nodeMapping = new Map();
|
| + var rebasedMap = /** @type {!WebInspector.ASTSourceMap} */ (map.rebase(clonedModels, nodeMapping));
|
| + console.assert(rebasedMap);
|
| + var rebasedEdits = edits.map(edit => edit.rebase(rebasedMap, nodeMapping));
|
| +
|
| + return new WebInspector.SASSProcessor(astService, rebasedMap, rebasedEdits)._mutate();
|
| }
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.ASTDiff} cssDiff
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @return {!Array<!WebInspector.SASSProcessor.EditOperation>}
|
| - */
|
| -WebInspector.SASSProcessor._editsFromCSSDiff = function(cssDiff, map)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDiff} cssDiff
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @return {!Array<!WebInspector.SASSProcessor.EditOperation>}
|
| + */
|
| + static _editsFromCSSDiff(cssDiff, map) {
|
| var T = WebInspector.SASSSupport.PropertyChangeType;
|
| var operations = [];
|
| for (var i = 0; i < cssDiff.changes.length; ++i) {
|
| - var change = cssDiff.changes[i];
|
| - var operation = null;
|
| - if (change.type === T.ValueChanged || change.type === T.NameChanged)
|
| - operation = WebInspector.SASSProcessor.SetTextOperation.fromCSSChange(change, map);
|
| - else if (change.type === T.PropertyToggled)
|
| - operation = WebInspector.SASSProcessor.TogglePropertyOperation.fromCSSChange(change, map);
|
| - else if (change.type === T.PropertyRemoved)
|
| - operation = WebInspector.SASSProcessor.RemovePropertyOperation.fromCSSChange(change, map);
|
| - else if (change.type === T.PropertyAdded)
|
| - operation = WebInspector.SASSProcessor.InsertPropertiesOperation.fromCSSChange(change, map);
|
| - if (!operation) {
|
| - WebInspector.console.error("Operation ignored: " + change.type);
|
| - continue;
|
| - }
|
| -
|
| - var merged = false;
|
| - for (var j = 0; !merged && j < operations.length; ++j)
|
| - merged = operations[j].merge(operation);
|
| - if (!merged)
|
| - operations.push(operation);
|
| + var change = cssDiff.changes[i];
|
| + var operation = null;
|
| + if (change.type === T.ValueChanged || change.type === T.NameChanged)
|
| + operation = WebInspector.SASSProcessor.SetTextOperation.fromCSSChange(change, map);
|
| + else if (change.type === T.PropertyToggled)
|
| + operation = WebInspector.SASSProcessor.TogglePropertyOperation.fromCSSChange(change, map);
|
| + else if (change.type === T.PropertyRemoved)
|
| + operation = WebInspector.SASSProcessor.RemovePropertyOperation.fromCSSChange(change, map);
|
| + else if (change.type === T.PropertyAdded)
|
| + operation = WebInspector.SASSProcessor.InsertPropertiesOperation.fromCSSChange(change, map);
|
| + if (!operation) {
|
| + WebInspector.console.error('Operation ignored: ' + change.type);
|
| + continue;
|
| + }
|
| +
|
| + var merged = false;
|
| + for (var j = 0; !merged && j < operations.length; ++j)
|
| + merged = operations[j].merge(operation);
|
| + if (!merged)
|
| + operations.push(operation);
|
| }
|
| return operations;
|
| + }
|
| +
|
| + /**
|
| + * @return {!Promise<?WebInspector.SourceMap.EditResult>}
|
| + */
|
| + _mutate() {
|
| + /** @type {!Set<!WebInspector.SASSSupport.Rule>} */
|
| + var changedCSSRules = new Set();
|
| + for (var editOperation of this._editOperations) {
|
| + var rules = editOperation.perform();
|
| + changedCSSRules.addAll(rules);
|
| + }
|
| +
|
| + // Reparse new texts, make sure changes result in anticipated AST trees.
|
| + var promises = [];
|
| + for (var ast of this._map.models().values()) {
|
| + if (!ast.document.hasChanged())
|
| + continue;
|
| + var promise;
|
| + if (ast.document.url === this._map.compiledURL())
|
| + promise = this._astService.parseCSS(ast.document.url, ast.document.newText().value());
|
| + else
|
| + promise = this._astService.parseSCSS(ast.document.url, ast.document.newText().value());
|
| + promises.push(promise);
|
| + }
|
| +
|
| + return Promise.all(promises).then(this._onFinished.bind(this, changedCSSRules));
|
| + }
|
| +
|
| + /**
|
| + * @param {!Set<!WebInspector.SASSSupport.Rule>} changedCSSRules
|
| + * @param {!Array<!WebInspector.SASSSupport.AST>} changedModels
|
| + * @return {?WebInspector.SourceMap.EditResult}
|
| + */
|
| + _onFinished(changedCSSRules, changedModels) {
|
| + var nodeMapping = new Map();
|
| + var map = this._map.rebase(changedModels, nodeMapping);
|
| + if (!map)
|
| + return null;
|
| +
|
| + var cssEdits = [];
|
| + for (var rule of changedCSSRules) {
|
| + var oldRange = rule.styleRange;
|
| + var newRule = nodeMapping.get(rule);
|
| + var newText = newRule.document.text.extract(newRule.styleRange);
|
| + cssEdits.push(new WebInspector.SourceEdit(newRule.document.url, oldRange, newText));
|
| + }
|
| +
|
| + /** @type {!Map<string, string>} */
|
| + var newSASSSources = new Map();
|
| + for (var model of changedModels) {
|
| + if (model.document.url === map.compiledURL())
|
| + continue;
|
| + newSASSSources.set(model.document.url, model.document.text.value());
|
| + }
|
| + return new WebInspector.SourceMap.EditResult(map, cssEdits, newSASSSources);
|
| + }
|
| };
|
|
|
| +
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {string} sassURL
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor.EditOperation = function(map, sassURL)
|
| -{
|
| +WebInspector.SASSProcessor.EditOperation = class {
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {string} sassURL
|
| + */
|
| + constructor(map, sassURL) {
|
| this.map = map;
|
| this.sassURL = sassURL;
|
| -};
|
| -
|
| -WebInspector.SASSProcessor.EditOperation.prototype = {
|
| - /**
|
| - * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| - * @return {boolean}
|
| - */
|
| - merge: function(other)
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| - */
|
| - perform: function()
|
| - {
|
| - return [];
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.ASTSourceMap} newMap
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| - * @return {!WebInspector.SASSProcessor.EditOperation}
|
| - */
|
| - rebase: function(newMap, nodeMapping)
|
| - {
|
| - return this;
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| + * @return {boolean}
|
| + */
|
| + merge(other) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| + */
|
| + perform() {
|
| + return [];
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} newMap
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| + * @return {!WebInspector.SASSProcessor.EditOperation}
|
| + */
|
| + rebase(newMap, nodeMapping) {
|
| + return this;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSProcessor.EditOperation}
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.TextNode} sassNode
|
| - * @param {string} newText
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor.SetTextOperation = function(map, sassNode, newText)
|
| -{
|
| - WebInspector.SASSProcessor.EditOperation.call(this, map, sassNode.document.url);
|
| +WebInspector.SASSProcessor.SetTextOperation = class extends WebInspector.SASSProcessor.EditOperation {
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.TextNode} sassNode
|
| + * @param {string} newText
|
| + */
|
| + constructor(map, sassNode, newText) {
|
| + super(map, sassNode.document.url);
|
| this._sassNode = sassNode;
|
| this._newText = newText;
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @return {?WebInspector.SASSProcessor.SetTextOperation}
|
| - */
|
| -WebInspector.SASSProcessor.SetTextOperation.fromCSSChange = function(change, map)
|
| -{
|
| - var oldProperty = /** @type {!WebInspector.SASSSupport.Property} */(change.oldProperty());
|
| - var newProperty = /** @type {!WebInspector.SASSSupport.Property} */(change.newProperty());
|
| - console.assert(oldProperty && newProperty, "SetTextOperation must have both oldProperty and newProperty");
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @return {?WebInspector.SASSProcessor.SetTextOperation}
|
| + */
|
| + static fromCSSChange(change, map) {
|
| + var oldProperty = /** @type {!WebInspector.SASSSupport.Property} */ (change.oldProperty());
|
| + var newProperty = /** @type {!WebInspector.SASSSupport.Property} */ (change.newProperty());
|
| + console.assert(oldProperty && newProperty, 'SetTextOperation must have both oldProperty and newProperty');
|
| var newValue = null;
|
| var sassNode = null;
|
| if (change.type === WebInspector.SASSSupport.PropertyChangeType.NameChanged) {
|
| - newValue = newProperty.name.text;
|
| - sassNode = map.toSourceNode(oldProperty.name);
|
| + newValue = newProperty.name.text;
|
| + sassNode = map.toSourceNode(oldProperty.name);
|
| } else {
|
| - newValue = newProperty.value.text;
|
| - sassNode = map.toSourceNode(oldProperty.value);
|
| + newValue = newProperty.value.text;
|
| + sassNode = map.toSourceNode(oldProperty.value);
|
| }
|
| if (!sassNode)
|
| - return null;
|
| + return null;
|
| return new WebInspector.SASSProcessor.SetTextOperation(map, sassNode, newValue);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| + * @return {boolean}
|
| + */
|
| + merge(other) {
|
| + if (!(other instanceof WebInspector.SASSProcessor.SetTextOperation))
|
| + return false;
|
| + return this._sassNode === other._sassNode;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| + */
|
| + perform() {
|
| + this._sassNode.setText(this._newText);
|
| + var nodes = this.map.toCompiledNodes(this._sassNode);
|
| + for (var node of nodes)
|
| + node.setText(this._newText);
|
| +
|
| + var cssRules = nodes.map(textNode => textNode.parent.parent);
|
| + return cssRules;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ASTSourceMap} newMap
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| + * @return {!WebInspector.SASSProcessor.SetTextOperation}
|
| + */
|
| + rebase(newMap, nodeMapping) {
|
| + var sassNode =
|
| + /** @type {?WebInspector.SASSSupport.TextNode} */ (nodeMapping.get(this._sassNode)) || this._sassNode;
|
| + return new WebInspector.SASSProcessor.SetTextOperation(newMap, sassNode, this._newText);
|
| + }
|
| };
|
|
|
| -WebInspector.SASSProcessor.SetTextOperation.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| - * @return {boolean}
|
| - */
|
| - merge: function(other)
|
| - {
|
| - if (!(other instanceof WebInspector.SASSProcessor.SetTextOperation))
|
| - return false;
|
| - return this._sassNode === other._sassNode;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| - */
|
| - perform: function()
|
| - {
|
| - this._sassNode.setText(this._newText);
|
| - var nodes = this.map.toCompiledNodes(this._sassNode);
|
| - for (var node of nodes)
|
| - node.setText(this._newText);
|
| -
|
| - var cssRules = nodes.map(textNode => textNode.parent.parent);
|
| - return cssRules;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ASTSourceMap} newMap
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| - * @return {!WebInspector.SASSProcessor.SetTextOperation}
|
| - */
|
| - rebase: function(newMap, nodeMapping)
|
| - {
|
| - var sassNode = /** @type {?WebInspector.SASSSupport.TextNode} */(nodeMapping.get(this._sassNode)) || this._sassNode;
|
| - return new WebInspector.SASSProcessor.SetTextOperation(newMap, sassNode, this._newText);
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSProcessor.EditOperation.prototype
|
| -};
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSProcessor.EditOperation}
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| - * @param {boolean} newDisabled
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor.TogglePropertyOperation = function(map, sassProperty, newDisabled)
|
| -{
|
| - WebInspector.SASSProcessor.EditOperation.call(this, map, sassProperty.document.url);
|
| +WebInspector.SASSProcessor.TogglePropertyOperation = class extends WebInspector.SASSProcessor.EditOperation {
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| + * @param {boolean} newDisabled
|
| + */
|
| + constructor(map, sassProperty, newDisabled) {
|
| + super(map, sassProperty.document.url);
|
| this._sassProperty = sassProperty;
|
| this._newDisabled = newDisabled;
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @return {?WebInspector.SASSProcessor.TogglePropertyOperation}
|
| - */
|
| -WebInspector.SASSProcessor.TogglePropertyOperation.fromCSSChange = function(change, map)
|
| -{
|
| - var oldCSSProperty = /** @type {!WebInspector.SASSSupport.Property} */(change.oldProperty());
|
| - console.assert(oldCSSProperty, "TogglePropertyOperation must have old CSS property");
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @return {?WebInspector.SASSProcessor.TogglePropertyOperation}
|
| + */
|
| + static fromCSSChange(change, map) {
|
| + var oldCSSProperty = /** @type {!WebInspector.SASSSupport.Property} */ (change.oldProperty());
|
| + console.assert(oldCSSProperty, 'TogglePropertyOperation must have old CSS property');
|
| var sassProperty = WebInspector.SASSProcessor._toSASSProperty(map, oldCSSProperty);
|
| if (!sassProperty)
|
| - return null;
|
| + return null;
|
| var newDisabled = change.newProperty().disabled;
|
| return new WebInspector.SASSProcessor.TogglePropertyOperation(map, sassProperty, newDisabled);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| + * @return {boolean}
|
| + */
|
| + merge(other) {
|
| + if (!(other instanceof WebInspector.SASSProcessor.TogglePropertyOperation))
|
| + return false;
|
| + return this._sassProperty === other._sassProperty;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| + */
|
| + perform() {
|
| + this._sassProperty.setDisabled(this._newDisabled);
|
| + var cssProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._sassProperty);
|
| + for (var property of cssProperties)
|
| + property.setDisabled(this._newDisabled);
|
| +
|
| + var cssRules = cssProperties.map(property => property.parent);
|
| + return cssRules;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ASTSourceMap} newMap
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| + * @return {!WebInspector.SASSProcessor.TogglePropertyOperation}
|
| + */
|
| + rebase(newMap, nodeMapping) {
|
| + var sassProperty =
|
| + /** @type {?WebInspector.SASSSupport.Property} */ (nodeMapping.get(this._sassProperty)) || this._sassProperty;
|
| + return new WebInspector.SASSProcessor.TogglePropertyOperation(newMap, sassProperty, this._newDisabled);
|
| + }
|
| };
|
|
|
| -WebInspector.SASSProcessor.TogglePropertyOperation.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| - * @return {boolean}
|
| - */
|
| - merge: function(other)
|
| - {
|
| - if (!(other instanceof WebInspector.SASSProcessor.TogglePropertyOperation))
|
| - return false;
|
| - return this._sassProperty === other._sassProperty;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| - */
|
| - perform: function()
|
| - {
|
| - this._sassProperty.setDisabled(this._newDisabled);
|
| - var cssProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._sassProperty);
|
| - for (var property of cssProperties)
|
| - property.setDisabled(this._newDisabled);
|
| -
|
| - var cssRules = cssProperties.map(property => property.parent);
|
| - return cssRules;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ASTSourceMap} newMap
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| - * @return {!WebInspector.SASSProcessor.TogglePropertyOperation}
|
| - */
|
| - rebase: function(newMap, nodeMapping)
|
| - {
|
| - var sassProperty = /** @type {?WebInspector.SASSSupport.Property} */(nodeMapping.get(this._sassProperty)) || this._sassProperty;
|
| - return new WebInspector.SASSProcessor.TogglePropertyOperation(newMap, sassProperty, this._newDisabled);
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSProcessor.EditOperation.prototype
|
| -};
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSProcessor.EditOperation}
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor.RemovePropertyOperation = function(map, sassProperty)
|
| -{
|
| - WebInspector.SASSProcessor.EditOperation.call(this, map, sassProperty.document.url);
|
| +WebInspector.SASSProcessor.RemovePropertyOperation = class extends WebInspector.SASSProcessor.EditOperation {
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.Property} sassProperty
|
| + */
|
| + constructor(map, sassProperty) {
|
| + super(map, sassProperty.document.url);
|
| this._sassProperty = sassProperty;
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @return {?WebInspector.SASSProcessor.RemovePropertyOperation}
|
| - */
|
| -WebInspector.SASSProcessor.RemovePropertyOperation.fromCSSChange = function(change, map)
|
| -{
|
| - var removedProperty = /** @type {!WebInspector.SASSSupport.Property} */(change.oldProperty());
|
| - console.assert(removedProperty, "RemovePropertyOperation must have removed CSS property");
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @return {?WebInspector.SASSProcessor.RemovePropertyOperation}
|
| + */
|
| + static fromCSSChange(change, map) {
|
| + var removedProperty = /** @type {!WebInspector.SASSSupport.Property} */ (change.oldProperty());
|
| + console.assert(removedProperty, 'RemovePropertyOperation must have removed CSS property');
|
| var sassProperty = WebInspector.SASSProcessor._toSASSProperty(map, removedProperty);
|
| if (!sassProperty)
|
| - return null;
|
| + return null;
|
| return new WebInspector.SASSProcessor.RemovePropertyOperation(map, sassProperty);
|
| -};
|
| -
|
| -WebInspector.SASSProcessor.RemovePropertyOperation.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| - * @return {boolean}
|
| - */
|
| - merge: function(other)
|
| - {
|
| - if (!(other instanceof WebInspector.SASSProcessor.RemovePropertyOperation))
|
| - return false;
|
| - return this._sassProperty === other._sassProperty;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| - */
|
| - perform: function()
|
| - {
|
| - var cssProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._sassProperty);
|
| - var cssRules = cssProperties.map(property => property.parent);
|
| - this._sassProperty.remove();
|
| - for (var cssProperty of cssProperties) {
|
| - cssProperty.remove();
|
| - this.map.removeMapping(cssProperty.name, this._sassProperty.name);
|
| - this.map.removeMapping(cssProperty.value, this._sassProperty.value);
|
| - }
|
| -
|
| - return cssRules;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ASTSourceMap} newMap
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| - * @return {!WebInspector.SASSProcessor.RemovePropertyOperation}
|
| - */
|
| - rebase: function(newMap, nodeMapping)
|
| - {
|
| - var sassProperty = /** @type {?WebInspector.SASSSupport.Property} */(nodeMapping.get(this._sassProperty)) || this._sassProperty;
|
| - return new WebInspector.SASSProcessor.RemovePropertyOperation(newMap, sassProperty);
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| + * @return {boolean}
|
| + */
|
| + merge(other) {
|
| + if (!(other instanceof WebInspector.SASSProcessor.RemovePropertyOperation))
|
| + return false;
|
| + return this._sassProperty === other._sassProperty;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| + */
|
| + perform() {
|
| + var cssProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._sassProperty);
|
| + var cssRules = cssProperties.map(property => property.parent);
|
| + this._sassProperty.remove();
|
| + for (var cssProperty of cssProperties) {
|
| + cssProperty.remove();
|
| + this.map.removeMapping(cssProperty.name, this._sassProperty.name);
|
| + this.map.removeMapping(cssProperty.value, this._sassProperty.value);
|
| + }
|
|
|
| - __proto__: WebInspector.SASSProcessor.EditOperation.prototype
|
| + return cssRules;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ASTSourceMap} newMap
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| + * @return {!WebInspector.SASSProcessor.RemovePropertyOperation}
|
| + */
|
| + rebase(newMap, nodeMapping) {
|
| + var sassProperty =
|
| + /** @type {?WebInspector.SASSSupport.Property} */ (nodeMapping.get(this._sassProperty)) || this._sassProperty;
|
| + return new WebInspector.SASSProcessor.RemovePropertyOperation(newMap, sassProperty);
|
| + }
|
| };
|
|
|
| +
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSProcessor.EditOperation}
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @param {!WebInspector.SASSSupport.Rule} sassRule
|
| - * @param {?WebInspector.SASSSupport.Property} afterSASSProperty
|
| - * @param {!Array<string>} propertyNames
|
| - * @param {!Array<string>} propertyValues
|
| - * @param {!Array<boolean>} disabledStates
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSProcessor.InsertPropertiesOperation = function(map, sassRule, afterSASSProperty, propertyNames, propertyValues, disabledStates)
|
| -{
|
| +WebInspector.SASSProcessor.InsertPropertiesOperation = class extends WebInspector.SASSProcessor.EditOperation {
|
| + /**
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @param {!WebInspector.SASSSupport.Rule} sassRule
|
| + * @param {?WebInspector.SASSSupport.Property} afterSASSProperty
|
| + * @param {!Array<string>} propertyNames
|
| + * @param {!Array<string>} propertyValues
|
| + * @param {!Array<boolean>} disabledStates
|
| + */
|
| + constructor(map, sassRule, afterSASSProperty, propertyNames, propertyValues, disabledStates) {
|
| console.assert(propertyNames.length === propertyValues.length && propertyValues.length === disabledStates.length);
|
| - WebInspector.SASSProcessor.EditOperation.call(this, map, sassRule.document.url);
|
| + super(map, sassRule.document.url);
|
| this._sassRule = sassRule;
|
| this._afterSASSProperty = afterSASSProperty;
|
| this._nameTexts = propertyNames;
|
| this._valueTexts = propertyValues;
|
| this._disabledStates = disabledStates;
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| - * @param {!WebInspector.ASTSourceMap} map
|
| - * @return {?WebInspector.SASSProcessor.InsertPropertiesOperation}
|
| - */
|
| -WebInspector.SASSProcessor.InsertPropertiesOperation.fromCSSChange = function(change, map)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChange} change
|
| + * @param {!WebInspector.ASTSourceMap} map
|
| + * @return {?WebInspector.SASSProcessor.InsertPropertiesOperation}
|
| + */
|
| + static fromCSSChange(change, map) {
|
| var sassRule = null;
|
| var afterSASSProperty = null;
|
| if (change.oldPropertyIndex) {
|
| - var cssAnchor = change.oldRule.properties[change.oldPropertyIndex - 1].name;
|
| - var sassAnchor = map.toSourceNode(cssAnchor);
|
| - afterSASSProperty = sassAnchor ? sassAnchor.parent : null;
|
| - sassRule = afterSASSProperty ? afterSASSProperty.parent : null;
|
| + var cssAnchor = change.oldRule.properties[change.oldPropertyIndex - 1].name;
|
| + var sassAnchor = map.toSourceNode(cssAnchor);
|
| + afterSASSProperty = sassAnchor ? sassAnchor.parent : null;
|
| + sassRule = afterSASSProperty ? afterSASSProperty.parent : null;
|
| } else {
|
| - var cssAnchor = change.oldRule.blockStart;
|
| - var sassAnchor = map.toSourceNode(cssAnchor);
|
| - sassRule = sassAnchor ? sassAnchor.parent : null;
|
| + var cssAnchor = change.oldRule.blockStart;
|
| + var sassAnchor = map.toSourceNode(cssAnchor);
|
| + sassRule = sassAnchor ? sassAnchor.parent : null;
|
| }
|
| if (!sassRule)
|
| - return null;
|
| - var insertedProperty = /** @type {!WebInspector.SASSSupport.Property} */(change.newProperty());
|
| - console.assert(insertedProperty, "InsertPropertiesOperation must have inserted CSS property");
|
| + return null;
|
| + var insertedProperty = /** @type {!WebInspector.SASSSupport.Property} */ (change.newProperty());
|
| + console.assert(insertedProperty, 'InsertPropertiesOperation must have inserted CSS property');
|
| var names = [insertedProperty.name.text];
|
| var values = [insertedProperty.value.text];
|
| var disabledStates = [insertedProperty.disabled];
|
| - return new WebInspector.SASSProcessor.InsertPropertiesOperation(map, sassRule, afterSASSProperty, names, values, disabledStates);
|
| + return new WebInspector.SASSProcessor.InsertPropertiesOperation(
|
| + map, sassRule, afterSASSProperty, names, values, disabledStates);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| + * @return {boolean}
|
| + */
|
| + merge(other) {
|
| + if (!(other instanceof WebInspector.SASSProcessor.InsertPropertiesOperation))
|
| + return false;
|
| + if (this._sassRule !== other._sassRule || this._afterSASSProperty !== other._afterSASSProperty)
|
| + return false;
|
| + var names = new Set(this._nameTexts);
|
| + for (var i = 0; i < other._nameTexts.length; ++i) {
|
| + var nameText = other._nameTexts[i];
|
| + if (names.has(nameText))
|
| + continue;
|
| + this._nameTexts.push(nameText);
|
| + this._valueTexts.push(other._valueTexts[i]);
|
| + this._disabledStates.push(other._disabledStates[i]);
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| + */
|
| + perform() {
|
| + var newSASSProperties = this._sassRule.insertProperties(
|
| + this._afterSASSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| + var cssRules = [];
|
| + var afterCSSProperties = [];
|
| + if (this._afterSASSProperty) {
|
| + afterCSSProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._afterSASSProperty);
|
| + cssRules = afterCSSProperties.map(property => property.parent);
|
| + } else {
|
| + cssRules = this.map.toCompiledNodes(this._sassRule.blockStart).map(blockStart => blockStart.parent);
|
| + }
|
| + for (var i = 0; i < cssRules.length; ++i) {
|
| + var cssRule = cssRules[i];
|
| + var afterCSSProperty = afterCSSProperties.length ? afterCSSProperties[i] : null;
|
| + var newCSSProperties =
|
| + cssRule.insertProperties(afterCSSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| + for (var j = 0; j < newCSSProperties.length; ++j) {
|
| + this.map.addMapping(newCSSProperties[j].name, newSASSProperties[j].name);
|
| + this.map.addMapping(newCSSProperties[j].value, newSASSProperties[j].value);
|
| + }
|
| + }
|
| + return cssRules;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ASTSourceMap} newMap
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| + * @return {!WebInspector.SASSProcessor.InsertPropertiesOperation}
|
| + */
|
| + rebase(newMap, nodeMapping) {
|
| + var sassRule = /** @type {?WebInspector.SASSSupport.Rule} */ (nodeMapping.get(this._sassRule)) || this._sassRule;
|
| + var afterSASSProperty = this._afterSASSProperty ?
|
| + /** @type {?WebInspector.SASSSupport.Property} */ (nodeMapping.get(this._afterSASSProperty)) ||
|
| + this._afterSASSProperty :
|
| + null;
|
| + return new WebInspector.SASSProcessor.InsertPropertiesOperation(
|
| + newMap, sassRule, afterSASSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| + }
|
| };
|
|
|
| -WebInspector.SASSProcessor.InsertPropertiesOperation.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SASSProcessor.EditOperation} other
|
| - * @return {boolean}
|
| - */
|
| - merge: function(other)
|
| - {
|
| - if (!(other instanceof WebInspector.SASSProcessor.InsertPropertiesOperation))
|
| - return false;
|
| - if (this._sassRule !== other._sassRule || this._afterSASSProperty !== other._afterSASSProperty)
|
| - return false;
|
| - var names = new Set(this._nameTexts);
|
| - for (var i = 0; i < other._nameTexts.length; ++i) {
|
| - var nameText = other._nameTexts[i];
|
| - if (names.has(nameText))
|
| - continue;
|
| - this._nameTexts.push(nameText);
|
| - this._valueTexts.push(other._valueTexts[i]);
|
| - this._disabledStates.push(other._disabledStates[i]);
|
| - }
|
| - return true;
|
| - },
|
|
|
| - /**
|
| - * @override
|
| - * @return {!Array<!WebInspector.SASSSupport.Rule>}
|
| - */
|
| - perform: function()
|
| - {
|
| - var newSASSProperties = this._sassRule.insertProperties(this._afterSASSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| - var cssRules = [];
|
| - var afterCSSProperties = [];
|
| - if (this._afterSASSProperty) {
|
| - afterCSSProperties = WebInspector.SASSProcessor._toCSSProperties(this.map, this._afterSASSProperty);
|
| - cssRules = afterCSSProperties.map(property => property.parent);
|
| - } else {
|
| - cssRules = this.map.toCompiledNodes(this._sassRule.blockStart).map(blockStart => blockStart.parent);
|
| - }
|
| - for (var i = 0; i < cssRules.length; ++i) {
|
| - var cssRule = cssRules[i];
|
| - var afterCSSProperty = afterCSSProperties.length ? afterCSSProperties[i] : null;
|
| - var newCSSProperties = cssRule.insertProperties(afterCSSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| - for (var j = 0; j < newCSSProperties.length; ++j) {
|
| - this.map.addMapping(newCSSProperties[j].name, newSASSProperties[j].name);
|
| - this.map.addMapping(newCSSProperties[j].value, newSASSProperties[j].value);
|
| - }
|
| - }
|
| - return cssRules;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ASTSourceMap} newMap
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>} nodeMapping
|
| - * @return {!WebInspector.SASSProcessor.InsertPropertiesOperation}
|
| - */
|
| - rebase: function(newMap, nodeMapping)
|
| - {
|
| - var sassRule = /** @type {?WebInspector.SASSSupport.Rule} */(nodeMapping.get(this._sassRule)) || this._sassRule;
|
| - var afterSASSProperty = this._afterSASSProperty ? /** @type {?WebInspector.SASSSupport.Property} */(nodeMapping.get(this._afterSASSProperty)) || this._afterSASSProperty : null;
|
| - return new WebInspector.SASSProcessor.InsertPropertiesOperation(newMap, sassRule, afterSASSProperty, this._nameTexts, this._valueTexts, this._disabledStates);
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSProcessor.EditOperation.prototype
|
| -};
|
|
|