| Index: third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| index c09017028aae32f40761fd901247c486d2e3dc1f..c3dfe42bf8cc18e22d13b53f9c019966a3ea821f 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| @@ -1,7 +1,6 @@
|
| // Copyright 2015 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.
|
| -
|
| WebInspector.SASSSupport = {};
|
|
|
| /**
|
| @@ -9,601 +8,582 @@ WebInspector.SASSSupport = {};
|
| * @param {string} content
|
| * @return {!Promise<!WebInspector.SASSSupport.AST>}
|
| */
|
| -WebInspector.SASSSupport.parseSCSS = function(url, content)
|
| -{
|
| - var text = new WebInspector.Text(content);
|
| - var document = new WebInspector.SASSSupport.ASTDocument(url, text);
|
| -
|
| - return WebInspector.formatterWorkerPool.runTask("parseSCSS", {content: content}).then(onParsed);
|
| -
|
| - /**
|
| - * @param {?MessageEvent} event
|
| - * @return {!WebInspector.SASSSupport.AST}
|
| - */
|
| - function onParsed(event)
|
| - {
|
| - if (!event)
|
| - return new WebInspector.SASSSupport.AST(document, []);
|
| - var data = /** @type {!Array<!Object>} */(event.data);
|
| - var rules = [];
|
| - for (var i = 0; i < data.length; ++i) {
|
| - var rulePayload = data[i];
|
| - var selectors = rulePayload.selectors.map(createTextNode);
|
| - var properties = rulePayload.properties.map(createProperty);
|
| - var range = WebInspector.TextRange.fromObject(rulePayload.styleRange);
|
| - var rule = new WebInspector.SASSSupport.Rule(document, selectors, range, properties);
|
| - rules.push(rule);
|
| - }
|
| - return new WebInspector.SASSSupport.AST(document, rules);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Object} payload
|
| - */
|
| - function createTextNode(payload)
|
| - {
|
| - var range = WebInspector.TextRange.fromObject(payload);
|
| - var value = text.extract(range);
|
| - return new WebInspector.SASSSupport.TextNode(document, text.extract(range), range);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Object} payload
|
| - */
|
| - function createProperty(payload)
|
| - {
|
| - var name = createTextNode(payload.name);
|
| - var value = createTextNode(payload.value);
|
| - return new WebInspector.SASSSupport.Property(document, name, value, WebInspector.TextRange.fromObject(payload.range), payload.disabled);
|
| +WebInspector.SASSSupport.parseSCSS = function(url, content) {
|
| + var text = new WebInspector.Text(content);
|
| + var document = new WebInspector.SASSSupport.ASTDocument(url, text);
|
| +
|
| + return WebInspector.formatterWorkerPool.runTask('parseSCSS', {content: content}).then(onParsed);
|
| +
|
| + /**
|
| + * @param {?MessageEvent} event
|
| + * @return {!WebInspector.SASSSupport.AST}
|
| + */
|
| + function onParsed(event) {
|
| + if (!event)
|
| + return new WebInspector.SASSSupport.AST(document, []);
|
| + var data = /** @type {!Array<!Object>} */ (event.data);
|
| + var rules = [];
|
| + for (var i = 0; i < data.length; ++i) {
|
| + var rulePayload = data[i];
|
| + var selectors = rulePayload.selectors.map(createTextNode);
|
| + var properties = rulePayload.properties.map(createProperty);
|
| + var range = WebInspector.TextRange.fromObject(rulePayload.styleRange);
|
| + var rule = new WebInspector.SASSSupport.Rule(document, selectors, range, properties);
|
| + rules.push(rule);
|
| }
|
| + return new WebInspector.SASSSupport.AST(document, rules);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Object} payload
|
| + */
|
| + function createTextNode(payload) {
|
| + var range = WebInspector.TextRange.fromObject(payload);
|
| + var value = text.extract(range);
|
| + return new WebInspector.SASSSupport.TextNode(document, text.extract(range), range);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Object} payload
|
| + */
|
| + function createProperty(payload) {
|
| + var name = createTextNode(payload.name);
|
| + var value = createTextNode(payload.value);
|
| + return new WebInspector.SASSSupport.Property(
|
| + document, name, value, WebInspector.TextRange.fromObject(payload.range), payload.disabled);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {string} url
|
| - * @param {!WebInspector.Text} text
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.ASTDocument = function(url, text)
|
| -{
|
| +WebInspector.SASSSupport.ASTDocument = class {
|
| + /**
|
| + * @param {string} url
|
| + * @param {!WebInspector.Text} text
|
| + */
|
| + constructor(url, text) {
|
| this.url = url;
|
| this.text = text;
|
| this.edits = [];
|
| -};
|
| -
|
| -WebInspector.SASSSupport.ASTDocument.prototype = {
|
| - /**
|
| - * @return {!WebInspector.SASSSupport.ASTDocument}
|
| - */
|
| - clone: function()
|
| - {
|
| - return new WebInspector.SASSSupport.ASTDocument(this.url, this.text);
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - hasChanged: function()
|
| - {
|
| - return !!this.edits.length;
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.SASSSupport.ASTDocument}
|
| + */
|
| + clone() {
|
| + return new WebInspector.SASSSupport.ASTDocument(this.url, this.text);
|
| + }
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + hasChanged() {
|
| + return !!this.edits.length;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.Text}
|
| + */
|
| + newText() {
|
| + this.edits.stableSort(sequentialOrder);
|
| + var text = this.text;
|
| + for (var i = this.edits.length - 1; i >= 0; --i) {
|
| + var range = this.edits[i].oldRange;
|
| + var newText = this.edits[i].newText;
|
| + text = new WebInspector.Text(text.replaceRange(range, newText));
|
| + }
|
| + return text;
|
|
|
| /**
|
| - * @return {!WebInspector.Text}
|
| + * @param {!WebInspector.SourceEdit} edit1
|
| + * @param {!WebInspector.SourceEdit} edit2
|
| + * @return {number}
|
| */
|
| - newText: function()
|
| - {
|
| - this.edits.stableSort(sequentialOrder);
|
| - var text = this.text;
|
| - for (var i = this.edits.length - 1; i >= 0; --i) {
|
| - var range = this.edits[i].oldRange;
|
| - var newText = this.edits[i].newText;
|
| - text = new WebInspector.Text(text.replaceRange(range, newText));
|
| - }
|
| - return text;
|
| -
|
| - /**
|
| - * @param {!WebInspector.SourceEdit} edit1
|
| - * @param {!WebInspector.SourceEdit} edit2
|
| - * @return {number}
|
| - */
|
| - function sequentialOrder(edit1, edit2)
|
| - {
|
| - var range1 = edit1.oldRange.collapseToStart();
|
| - var range2 = edit2.oldRange.collapseToStart();
|
| - if (range1.equal(range2))
|
| - return 0;
|
| - return range1.follows(range2) ? 1 : -1;
|
| - }
|
| - },
|
| + function sequentialOrder(edit1, edit2) {
|
| + var range1 = edit1.oldRange.collapseToStart();
|
| + var range2 = edit2.oldRange.collapseToStart();
|
| + if (range1.equal(range2))
|
| + return 0;
|
| + return range1.follows(range2) ? 1 : -1;
|
| + }
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.Node = function(document)
|
| -{
|
| +WebInspector.SASSSupport.Node = class {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + */
|
| + constructor(document) {
|
| this.document = document;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSSupport.Node}
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @param {string} text
|
| - * @param {!WebInspector.TextRange} range
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.TextNode = function(document, text, range)
|
| -{
|
| - WebInspector.SASSSupport.Node.call(this, document);
|
| +WebInspector.SASSSupport.TextNode = class extends WebInspector.SASSSupport.Node {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @param {string} text
|
| + * @param {!WebInspector.TextRange} range
|
| + */
|
| + constructor(document, text, range) {
|
| + super(document);
|
| this.text = text;
|
| this.range = range;
|
| -};
|
| -
|
| -WebInspector.SASSSupport.TextNode.prototype = {
|
| - /**
|
| - * @param {string} newText
|
| - */
|
| - setText: function(newText)
|
| - {
|
| - if (this.text === newText)
|
| - return;
|
| - this.text = newText;
|
| - this.document.edits.push(new WebInspector.SourceEdit(this.document.url, this.range, newText));
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @return {!WebInspector.SASSSupport.TextNode}
|
| - */
|
| - clone: function(document)
|
| - {
|
| - return new WebInspector.SASSSupport.TextNode(document, this.text, this.range.clone());
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.TextNode} other
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| - * @return {boolean}
|
| - */
|
| - match: function(other, outNodeMapping)
|
| - {
|
| - if (this.text.trim() !== other.text.trim())
|
| - return false;
|
| - if (outNodeMapping)
|
| - outNodeMapping.set(this, other);
|
| - return true;
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSSupport.Node.prototype
|
| + }
|
| +
|
| + /**
|
| + * @param {string} newText
|
| + */
|
| + setText(newText) {
|
| + if (this.text === newText)
|
| + return;
|
| + this.text = newText;
|
| + this.document.edits.push(new WebInspector.SourceEdit(this.document.url, this.range, newText));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @return {!WebInspector.SASSSupport.TextNode}
|
| + */
|
| + clone(document) {
|
| + return new WebInspector.SASSSupport.TextNode(document, this.text, this.range.clone());
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.TextNode} other
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| + * @return {boolean}
|
| + */
|
| + match(other, outNodeMapping) {
|
| + if (this.text.trim() !== other.text.trim())
|
| + return false;
|
| + if (outNodeMapping)
|
| + outNodeMapping.set(this, other);
|
| + return true;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSSupport.Node}
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @param {!WebInspector.SASSSupport.TextNode} name
|
| - * @param {!WebInspector.SASSSupport.TextNode} value
|
| - * @param {!WebInspector.TextRange} range
|
| - * @param {boolean} disabled
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.Property = function(document, name, value, range, disabled)
|
| -{
|
| - WebInspector.SASSSupport.Node.call(this, document);
|
| +WebInspector.SASSSupport.Property = class extends WebInspector.SASSSupport.Node {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @param {!WebInspector.SASSSupport.TextNode} name
|
| + * @param {!WebInspector.SASSSupport.TextNode} value
|
| + * @param {!WebInspector.TextRange} range
|
| + * @param {boolean} disabled
|
| + */
|
| + constructor(document, name, value, range, disabled) {
|
| + super(document);
|
| this.name = name;
|
| this.value = value;
|
| this.range = range;
|
| this.name.parent = this;
|
| this.value.parent = this;
|
| this.disabled = disabled;
|
| -};
|
| -
|
| -WebInspector.SASSSupport.Property.prototype = {
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @return {!WebInspector.SASSSupport.Property}
|
| - */
|
| - clone: function(document)
|
| - {
|
| - return new WebInspector.SASSSupport.Property(document, this.name.clone(document), this.value.clone(document), this.range.clone(), this.disabled);
|
| - },
|
| -
|
| - /**
|
| - * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| - */
|
| - visit: function(callback)
|
| - {
|
| - callback(this);
|
| - callback(this.name);
|
| - callback(this.value);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.Property} other
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| - * @return {boolean}
|
| - */
|
| - match: function(other, outNodeMapping)
|
| - {
|
| - if (this.disabled !== other.disabled)
|
| - return false;
|
| - if (outNodeMapping)
|
| - outNodeMapping.set(this, other);
|
| - return this.name.match(other.name, outNodeMapping) && this.value.match(other.value, outNodeMapping);
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} disabled
|
| - */
|
| - setDisabled: function(disabled)
|
| - {
|
| - if (this.disabled === disabled)
|
| - return;
|
| - this.disabled = disabled;
|
| - if (disabled) {
|
| - var oldRange1 = WebInspector.TextRange.createFromLocation(this.range.startLine, this.range.startColumn);
|
| - var edit1 = new WebInspector.SourceEdit(this.document.url, oldRange1, "/* ");
|
| - var oldRange2 = WebInspector.TextRange.createFromLocation(this.range.endLine, this.range.endColumn);
|
| - var edit2 = new WebInspector.SourceEdit(this.document.url, oldRange2, " */");
|
| - this.document.edits.push(edit1, edit2);
|
| - return;
|
| - }
|
| - var oldRange1 = new WebInspector.TextRange(this.range.startLine, this.range.startColumn, this.range.startLine, this.name.range.startColumn);
|
| - var edit1 = new WebInspector.SourceEdit(this.document.url, oldRange1, "");
|
| -
|
| - var propertyText = this.document.text.extract(this.range);
|
| - var endsWithSemicolon = propertyText.slice(0, -2).trim().endsWith(";");
|
| - var oldRange2 = new WebInspector.TextRange(this.range.endLine, this.value.range.endColumn + (endsWithSemicolon ? 1 : 0), this.range.endLine, this.range.endColumn);
|
| - var edit2 = new WebInspector.SourceEdit(this.document.url, oldRange2, "");
|
| - this.document.edits.push(edit1, edit2);
|
| - },
|
| -
|
| - remove: function()
|
| - {
|
| - console.assert(this.parent);
|
| - var rule = this.parent;
|
| - var index = rule.properties.indexOf(this);
|
| - rule.properties.splice(index, 1);
|
| - this.parent = null;
|
| -
|
| - var lineRange = new WebInspector.TextRange(this.range.startLine, 0, this.range.endLine + 1, 0);
|
| - var oldRange;
|
| - if (this.document.text.extract(lineRange).trim() === this.document.text.extract(this.range).trim())
|
| - oldRange = lineRange;
|
| - else
|
| - oldRange = this.range;
|
| - this.document.edits.push(new WebInspector.SourceEdit(this.document.url, oldRange, ""));
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSSupport.Node.prototype
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @return {!WebInspector.SASSSupport.Property}
|
| + */
|
| + clone(document) {
|
| + return new WebInspector.SASSSupport.Property(
|
| + document, this.name.clone(document), this.value.clone(document), this.range.clone(), this.disabled);
|
| + }
|
| +
|
| + /**
|
| + * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| + */
|
| + visit(callback) {
|
| + callback(this);
|
| + callback(this.name);
|
| + callback(this.value);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.Property} other
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| + * @return {boolean}
|
| + */
|
| + match(other, outNodeMapping) {
|
| + if (this.disabled !== other.disabled)
|
| + return false;
|
| + if (outNodeMapping)
|
| + outNodeMapping.set(this, other);
|
| + return this.name.match(other.name, outNodeMapping) && this.value.match(other.value, outNodeMapping);
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} disabled
|
| + */
|
| + setDisabled(disabled) {
|
| + if (this.disabled === disabled)
|
| + return;
|
| + this.disabled = disabled;
|
| + if (disabled) {
|
| + var oldRange1 = WebInspector.TextRange.createFromLocation(this.range.startLine, this.range.startColumn);
|
| + var edit1 = new WebInspector.SourceEdit(this.document.url, oldRange1, '/* ');
|
| + var oldRange2 = WebInspector.TextRange.createFromLocation(this.range.endLine, this.range.endColumn);
|
| + var edit2 = new WebInspector.SourceEdit(this.document.url, oldRange2, ' */');
|
| + this.document.edits.push(edit1, edit2);
|
| + return;
|
| + }
|
| + var oldRange1 = new WebInspector.TextRange(
|
| + this.range.startLine, this.range.startColumn, this.range.startLine, this.name.range.startColumn);
|
| + var edit1 = new WebInspector.SourceEdit(this.document.url, oldRange1, '');
|
| +
|
| + var propertyText = this.document.text.extract(this.range);
|
| + var endsWithSemicolon = propertyText.slice(0, -2).trim().endsWith(';');
|
| + var oldRange2 = new WebInspector.TextRange(
|
| + this.range.endLine, this.value.range.endColumn + (endsWithSemicolon ? 1 : 0), this.range.endLine,
|
| + this.range.endColumn);
|
| + var edit2 = new WebInspector.SourceEdit(this.document.url, oldRange2, '');
|
| + this.document.edits.push(edit1, edit2);
|
| + }
|
| +
|
| + remove() {
|
| + console.assert(this.parent);
|
| + var rule = this.parent;
|
| + var index = rule.properties.indexOf(this);
|
| + rule.properties.splice(index, 1);
|
| + this.parent = null;
|
| +
|
| + var lineRange = new WebInspector.TextRange(this.range.startLine, 0, this.range.endLine + 1, 0);
|
| + var oldRange;
|
| + if (this.document.text.extract(lineRange).trim() === this.document.text.extract(this.range).trim())
|
| + oldRange = lineRange;
|
| + else
|
| + oldRange = this.range;
|
| + this.document.edits.push(new WebInspector.SourceEdit(this.document.url, oldRange, ''));
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSSupport.Node}
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @param {!Array<!WebInspector.SASSSupport.TextNode>} selectors
|
| - * @param {!WebInspector.TextRange} styleRange
|
| - * @param {!Array<!WebInspector.SASSSupport.Property>} properties
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.Rule = function(document, selectors, styleRange, properties)
|
| -{
|
| - WebInspector.SASSSupport.Node.call(this, document);
|
| +WebInspector.SASSSupport.Rule = class extends WebInspector.SASSSupport.Node {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @param {!Array<!WebInspector.SASSSupport.TextNode>} selectors
|
| + * @param {!WebInspector.TextRange} styleRange
|
| + * @param {!Array<!WebInspector.SASSSupport.Property>} properties
|
| + */
|
| + constructor(document, selectors, styleRange, properties) {
|
| + super(document);
|
| this.selectors = selectors;
|
| this.properties = properties;
|
| this.styleRange = styleRange;
|
|
|
| var blockStartRange = styleRange.collapseToStart();
|
| blockStartRange.startColumn -= 1;
|
| - this.blockStart = new WebInspector.SASSSupport.TextNode(document, this.document.text.extract(blockStartRange), blockStartRange);
|
| + this.blockStart =
|
| + new WebInspector.SASSSupport.TextNode(document, this.document.text.extract(blockStartRange), blockStartRange);
|
| this.blockStart.parent = this;
|
|
|
| for (var i = 0; i < this.properties.length; ++i)
|
| - this.properties[i].parent = this;
|
| -
|
| - this._hasTrailingSemicolon = !this.properties.length || this.document.text.extract(this.properties.peekLast().range).endsWith(";");
|
| -};
|
| -
|
| -WebInspector.SASSSupport.Rule.prototype = {
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @return {!WebInspector.SASSSupport.Rule}
|
| - */
|
| - clone: function(document)
|
| - {
|
| - var properties = [];
|
| - for (var i = 0; i < this.properties.length; ++i)
|
| - properties.push(this.properties[i].clone(document));
|
| - var selectors = [];
|
| - for (var i = 0; i < this.selectors.length; ++i)
|
| - selectors.push(this.selectors[i].clone(document));
|
| - return new WebInspector.SASSSupport.Rule(document, selectors, this.styleRange.clone(), properties);
|
| - },
|
| -
|
| - /**
|
| - * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| - */
|
| - visit: function(callback)
|
| - {
|
| - callback(this);
|
| - for (var i = 0; i < this.selectors.length; ++i)
|
| - callback(this.selectors[i]);
|
| - callback(this.blockStart);
|
| - for (var i = 0; i < this.properties.length; ++i)
|
| - this.properties[i].visit(callback);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.Rule} other
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| - * @return {boolean}
|
| - */
|
| - match: function(other, outNodeMapping)
|
| - {
|
| - if (this.selectors.length !== other.selectors.length)
|
| - return false;
|
| - if (this.properties.length !== other.properties.length)
|
| - return false;
|
| - if (outNodeMapping)
|
| - outNodeMapping.set(this, other);
|
| - var result = this.blockStart.match(other.blockStart, outNodeMapping);
|
| - for (var i = 0; result && i < this.selectors.length; ++i)
|
| - result = result && this.selectors[i].match(other.selectors[i], outNodeMapping);
|
| - for (var i = 0; result && i < this.properties.length; ++i)
|
| - result = result && this.properties[i].match(other.properties[i], outNodeMapping);
|
| - return result;
|
| - },
|
| -
|
| - _addTrailingSemicolon: function()
|
| - {
|
| - if (this._hasTrailingSemicolon || !this.properties)
|
| - return;
|
| - this._hasTrailingSemicolon = true;
|
| - this.document.edits.push(new WebInspector.SourceEdit(this.document.url, this.properties.peekLast().range.collapseToEnd(), ";"));
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.SASSSupport.Property} anchorProperty
|
| - * @param {!Array<string>} nameTexts
|
| - * @param {!Array<string>} valueTexts
|
| - * @param {!Array<boolean>} disabledStates
|
| - * @return {!Array<!WebInspector.SASSSupport.Property>}
|
| - */
|
| - insertProperties: function(anchorProperty, nameTexts, valueTexts, disabledStates)
|
| - {
|
| - console.assert(nameTexts.length === valueTexts.length && valueTexts.length === disabledStates.length, "Input array should be of the same size.");
|
| -
|
| - this._addTrailingSemicolon();
|
| - var newProperties = [];
|
| - var index = anchorProperty ? this.properties.indexOf(anchorProperty) : -1;
|
| - for (var i = 0; i < nameTexts.length; ++i) {
|
| - var nameText = nameTexts[i];
|
| - var valueText = valueTexts[i];
|
| - var disabled = disabledStates[i];
|
| - this.document.edits.push(this._insertPropertyEdit(anchorProperty, nameText, valueText, disabled));
|
| -
|
| - var name = new WebInspector.SASSSupport.TextNode(this.document, nameText, WebInspector.TextRange.createFromLocation(0, 0));
|
| - var value = new WebInspector.SASSSupport.TextNode(this.document, valueText, WebInspector.TextRange.createFromLocation(0, 0));
|
| - var newProperty = new WebInspector.SASSSupport.Property(this.document, name, value, WebInspector.TextRange.createFromLocation(0, 0), disabled);
|
| -
|
| - this.properties.splice(index + i + 1, 0, newProperty);
|
| - newProperty.parent = this;
|
| - newProperties.push(newProperty);
|
| - }
|
| - return newProperties;
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.SASSSupport.Property} anchorProperty
|
| - * @param {string} nameText
|
| - * @param {string} valueText
|
| - * @param {boolean} disabled
|
| - * @return {!WebInspector.SourceEdit}
|
| - */
|
| - _insertPropertyEdit: function(anchorProperty, nameText, valueText, disabled)
|
| - {
|
| - var anchorRange = anchorProperty ? anchorProperty.range : this.blockStart.range;
|
| - var indent = this._computePropertyIndent();
|
| - var leftComment = disabled ? "/* " : "";
|
| - var rightComment = disabled ? " */" : "";
|
| - var newText = String.sprintf("\n%s%s%s: %s;%s", indent, leftComment, nameText, valueText, rightComment);
|
| - return new WebInspector.SourceEdit(this.document.url, anchorRange.collapseToEnd(), newText);
|
| - },
|
| -
|
| - /**
|
| - * @return {string}
|
| - */
|
| - _computePropertyIndent: function()
|
| - {
|
| - var indentProperty = this.properties.find(property => !property.range.isEmpty());
|
| - var result = "";
|
| - if (indentProperty) {
|
| - result = this.document.text.extract(new WebInspector.TextRange(indentProperty.range.startLine, 0, indentProperty.range.startLine, indentProperty.range.startColumn));
|
| - } else {
|
| - var lineNumber = this.blockStart.range.startLine;
|
| - var columnNumber = this.blockStart.range.startColumn;
|
| - var baseLine = this.document.text.extract(new WebInspector.TextRange(lineNumber, 0, lineNumber, columnNumber));
|
| - result = WebInspector.TextUtils.lineIndent(baseLine) + WebInspector.moduleSetting("textEditorIndent").get();
|
| - }
|
| - return result.isWhitespace() ? result : "";
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSSupport.Node.prototype
|
| + this.properties[i].parent = this;
|
| +
|
| + this._hasTrailingSemicolon =
|
| + !this.properties.length || this.document.text.extract(this.properties.peekLast().range).endsWith(';');
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @return {!WebInspector.SASSSupport.Rule}
|
| + */
|
| + clone(document) {
|
| + var properties = [];
|
| + for (var i = 0; i < this.properties.length; ++i)
|
| + properties.push(this.properties[i].clone(document));
|
| + var selectors = [];
|
| + for (var i = 0; i < this.selectors.length; ++i)
|
| + selectors.push(this.selectors[i].clone(document));
|
| + return new WebInspector.SASSSupport.Rule(document, selectors, this.styleRange.clone(), properties);
|
| + }
|
| +
|
| + /**
|
| + * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| + */
|
| + visit(callback) {
|
| + callback(this);
|
| + for (var i = 0; i < this.selectors.length; ++i)
|
| + callback(this.selectors[i]);
|
| + callback(this.blockStart);
|
| + for (var i = 0; i < this.properties.length; ++i)
|
| + this.properties[i].visit(callback);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.Rule} other
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| + * @return {boolean}
|
| + */
|
| + match(other, outNodeMapping) {
|
| + if (this.selectors.length !== other.selectors.length)
|
| + return false;
|
| + if (this.properties.length !== other.properties.length)
|
| + return false;
|
| + if (outNodeMapping)
|
| + outNodeMapping.set(this, other);
|
| + var result = this.blockStart.match(other.blockStart, outNodeMapping);
|
| + for (var i = 0; result && i < this.selectors.length; ++i)
|
| + result = result && this.selectors[i].match(other.selectors[i], outNodeMapping);
|
| + for (var i = 0; result && i < this.properties.length; ++i)
|
| + result = result && this.properties[i].match(other.properties[i], outNodeMapping);
|
| + return result;
|
| + }
|
| +
|
| + _addTrailingSemicolon() {
|
| + if (this._hasTrailingSemicolon || !this.properties)
|
| + return;
|
| + this._hasTrailingSemicolon = true;
|
| + this.document.edits.push(
|
| + new WebInspector.SourceEdit(this.document.url, this.properties.peekLast().range.collapseToEnd(), ';'));
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.SASSSupport.Property} anchorProperty
|
| + * @param {!Array<string>} nameTexts
|
| + * @param {!Array<string>} valueTexts
|
| + * @param {!Array<boolean>} disabledStates
|
| + * @return {!Array<!WebInspector.SASSSupport.Property>}
|
| + */
|
| + insertProperties(anchorProperty, nameTexts, valueTexts, disabledStates) {
|
| + console.assert(
|
| + nameTexts.length === valueTexts.length && valueTexts.length === disabledStates.length,
|
| + 'Input array should be of the same size.');
|
| +
|
| + this._addTrailingSemicolon();
|
| + var newProperties = [];
|
| + var index = anchorProperty ? this.properties.indexOf(anchorProperty) : -1;
|
| + for (var i = 0; i < nameTexts.length; ++i) {
|
| + var nameText = nameTexts[i];
|
| + var valueText = valueTexts[i];
|
| + var disabled = disabledStates[i];
|
| + this.document.edits.push(this._insertPropertyEdit(anchorProperty, nameText, valueText, disabled));
|
| +
|
| + var name = new WebInspector.SASSSupport.TextNode(
|
| + this.document, nameText, WebInspector.TextRange.createFromLocation(0, 0));
|
| + var value = new WebInspector.SASSSupport.TextNode(
|
| + this.document, valueText, WebInspector.TextRange.createFromLocation(0, 0));
|
| + var newProperty = new WebInspector.SASSSupport.Property(
|
| + this.document, name, value, WebInspector.TextRange.createFromLocation(0, 0), disabled);
|
| +
|
| + this.properties.splice(index + i + 1, 0, newProperty);
|
| + newProperty.parent = this;
|
| + newProperties.push(newProperty);
|
| + }
|
| + return newProperties;
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.SASSSupport.Property} anchorProperty
|
| + * @param {string} nameText
|
| + * @param {string} valueText
|
| + * @param {boolean} disabled
|
| + * @return {!WebInspector.SourceEdit}
|
| + */
|
| + _insertPropertyEdit(anchorProperty, nameText, valueText, disabled) {
|
| + var anchorRange = anchorProperty ? anchorProperty.range : this.blockStart.range;
|
| + var indent = this._computePropertyIndent();
|
| + var leftComment = disabled ? '/* ' : '';
|
| + var rightComment = disabled ? ' */' : '';
|
| + var newText = String.sprintf('\n%s%s%s: %s;%s', indent, leftComment, nameText, valueText, rightComment);
|
| + return new WebInspector.SourceEdit(this.document.url, anchorRange.collapseToEnd(), newText);
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + _computePropertyIndent() {
|
| + var indentProperty = this.properties.find(property => !property.range.isEmpty());
|
| + var result = '';
|
| + if (indentProperty) {
|
| + result = this.document.text.extract(new WebInspector.TextRange(
|
| + indentProperty.range.startLine, 0, indentProperty.range.startLine, indentProperty.range.startColumn));
|
| + } else {
|
| + var lineNumber = this.blockStart.range.startLine;
|
| + var columnNumber = this.blockStart.range.startColumn;
|
| + var baseLine = this.document.text.extract(new WebInspector.TextRange(lineNumber, 0, lineNumber, columnNumber));
|
| + result = WebInspector.TextUtils.lineIndent(baseLine) + WebInspector.moduleSetting('textEditorIndent').get();
|
| + }
|
| + return result.isWhitespace() ? result : '';
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.SASSSupport.Node}
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @param {!Array<!WebInspector.SASSSupport.Rule>} rules
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.AST = function(document, rules)
|
| -{
|
| - WebInspector.SASSSupport.Node.call(this, document);
|
| +WebInspector.SASSSupport.AST = class extends WebInspector.SASSSupport.Node {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| + * @param {!Array<!WebInspector.SASSSupport.Rule>} rules
|
| + */
|
| + constructor(document, rules) {
|
| + super(document);
|
| this.rules = rules;
|
| for (var i = 0; i < rules.length; ++i)
|
| - rules[i].parent = this;
|
| -};
|
| + rules[i].parent = this;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.SASSSupport.AST}
|
| + */
|
| + clone() {
|
| + var document = this.document.clone();
|
| + var rules = [];
|
| + for (var i = 0; i < this.rules.length; ++i)
|
| + rules.push(this.rules[i].clone(document));
|
| + return new WebInspector.SASSSupport.AST(document, rules);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.AST} other
|
| + * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| + * @return {boolean}
|
| + */
|
| + match(other, outNodeMapping) {
|
| + if (other.document.url !== this.document.url)
|
| + return false;
|
| + if (other.rules.length !== this.rules.length)
|
| + return false;
|
| + if (outNodeMapping)
|
| + outNodeMapping.set(this, other);
|
| + var result = true;
|
| + for (var i = 0; result && i < this.rules.length; ++i)
|
| + result = result && this.rules[i].match(other.rules[i], outNodeMapping);
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| + */
|
| + visit(callback) {
|
| + callback(this);
|
| + for (var i = 0; i < this.rules.length; ++i)
|
| + this.rules[i].visit(callback);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} lineNumber
|
| + * @param {number} columnNumber
|
| + * @return {?WebInspector.SASSSupport.TextNode}
|
| + */
|
| + findNodeForPosition(lineNumber, columnNumber) {
|
| + this._ensureNodePositionsIndex();
|
| + var index = this._sortedTextNodes.lowerBound({lineNumber: lineNumber, columnNumber: columnNumber}, nodeComparator);
|
| + var node = this._sortedTextNodes[index];
|
| + if (!node)
|
| + return null;
|
| + return node.range.containsLocation(lineNumber, columnNumber) ? node : null;
|
|
|
| -WebInspector.SASSSupport.AST.prototype = {
|
| /**
|
| - * @return {!WebInspector.SASSSupport.AST}
|
| + * @param {!{lineNumber: number, columnNumber: number}} position
|
| + * @param {!WebInspector.SASSSupport.TextNode} textNode
|
| + * @return {number}
|
| */
|
| - clone: function()
|
| - {
|
| - var document = this.document.clone();
|
| - var rules = [];
|
| - for (var i = 0; i < this.rules.length; ++i)
|
| - rules.push(this.rules[i].clone(document));
|
| - return new WebInspector.SASSSupport.AST(document, rules);
|
| - },
|
| + function nodeComparator(position, textNode) {
|
| + return textNode.range.compareToPosition(position.lineNumber, position.columnNumber);
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.AST} other
|
| - * @param {!Map<!WebInspector.SASSSupport.Node, !WebInspector.SASSSupport.Node>=} outNodeMapping
|
| - * @return {boolean}
|
| - */
|
| - match: function(other, outNodeMapping)
|
| - {
|
| - if (other.document.url !== this.document.url)
|
| - return false;
|
| - if (other.rules.length !== this.rules.length)
|
| - return false;
|
| - if (outNodeMapping)
|
| - outNodeMapping.set(this, other);
|
| - var result = true;
|
| - for (var i = 0; result && i < this.rules.length; ++i)
|
| - result = result && this.rules[i].match(other.rules[i], outNodeMapping);
|
| - return result;
|
| - },
|
| + _ensureNodePositionsIndex() {
|
| + if (this._sortedTextNodes)
|
| + return;
|
| + this._sortedTextNodes = [];
|
| + this.visit(onNode.bind(this));
|
| + this._sortedTextNodes.sort(nodeComparator);
|
|
|
| /**
|
| - * @param {function(!WebInspector.SASSSupport.Node)} callback
|
| + * @param {!WebInspector.SASSSupport.Node} node
|
| + * @this {WebInspector.SASSSupport.AST}
|
| */
|
| - visit: function(callback)
|
| - {
|
| - callback(this);
|
| - for (var i = 0; i < this.rules.length; ++i)
|
| - this.rules[i].visit(callback);
|
| - },
|
| + function onNode(node) {
|
| + if (!(node instanceof WebInspector.SASSSupport.TextNode))
|
| + return;
|
| + this._sortedTextNodes.push(node);
|
| + }
|
|
|
| /**
|
| - * @param {number} lineNumber
|
| - * @param {number} columnNumber
|
| - * @return {?WebInspector.SASSSupport.TextNode}
|
| + * @param {!WebInspector.SASSSupport.TextNode} text1
|
| + * @param {!WebInspector.SASSSupport.TextNode} text2
|
| + * @return {number}
|
| */
|
| - findNodeForPosition: function(lineNumber, columnNumber)
|
| - {
|
| - this._ensureNodePositionsIndex();
|
| - var index = this._sortedTextNodes.lowerBound({lineNumber: lineNumber, columnNumber: columnNumber}, nodeComparator);
|
| - var node = this._sortedTextNodes[index];
|
| - if (!node)
|
| - return null;
|
| - return node.range.containsLocation(lineNumber, columnNumber) ? node : null;
|
| -
|
| - /**
|
| - * @param {!{lineNumber: number, columnNumber: number}} position
|
| - * @param {!WebInspector.SASSSupport.TextNode} textNode
|
| - * @return {number}
|
| - */
|
| - function nodeComparator(position, textNode)
|
| - {
|
| - return textNode.range.compareToPosition(position.lineNumber, position.columnNumber);
|
| - }
|
| - },
|
| -
|
| - _ensureNodePositionsIndex: function()
|
| - {
|
| - if (this._sortedTextNodes)
|
| - return;
|
| - this._sortedTextNodes = [];
|
| - this.visit(onNode.bind(this));
|
| - this._sortedTextNodes.sort(nodeComparator);
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.Node} node
|
| - * @this {WebInspector.SASSSupport.AST}
|
| - */
|
| - function onNode(node)
|
| - {
|
| - if (!(node instanceof WebInspector.SASSSupport.TextNode))
|
| - return;
|
| - this._sortedTextNodes.push(node);
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.TextNode} text1
|
| - * @param {!WebInspector.SASSSupport.TextNode} text2
|
| - * @return {number}
|
| - */
|
| - function nodeComparator(text1, text2)
|
| - {
|
| - return WebInspector.TextRange.comparator(text1.range, text2.range);
|
| - }
|
| - },
|
| -
|
| - __proto__: WebInspector.SASSSupport.Node.prototype
|
| + function nodeComparator(text1, text2) {
|
| + return WebInspector.TextRange.comparator(text1.range, text2.range);
|
| + }
|
| + }
|
| };
|
|
|
| /** @enum {string} */
|
| WebInspector.SASSSupport.PropertyChangeType = {
|
| - PropertyAdded: "PropertyAdded",
|
| - PropertyRemoved: "PropertyRemoved",
|
| - PropertyToggled: "PropertyToggled",
|
| - ValueChanged: "ValueChanged",
|
| - NameChanged: "NameChanged"
|
| + PropertyAdded: 'PropertyAdded',
|
| + PropertyRemoved: 'PropertyRemoved',
|
| + PropertyToggled: 'PropertyToggled',
|
| + ValueChanged: 'ValueChanged',
|
| + NameChanged: 'NameChanged'
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.SASSSupport.PropertyChangeType} type
|
| - * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| - * @param {!WebInspector.SASSSupport.Rule} newRule
|
| - * @param {number} oldPropertyIndex
|
| - * @param {number} newPropertyIndex
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.PropertyChange = function(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex)
|
| -{
|
| +WebInspector.SASSSupport.PropertyChange = class {
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChangeType} type
|
| + * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| + * @param {!WebInspector.SASSSupport.Rule} newRule
|
| + * @param {number} oldPropertyIndex
|
| + * @param {number} newPropertyIndex
|
| + */
|
| + constructor(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex) {
|
| this.type = type;
|
| this.oldRule = oldRule;
|
| this.newRule = newRule;
|
| this.oldPropertyIndex = oldPropertyIndex;
|
| this.newPropertyIndex = newPropertyIndex;
|
| -};
|
| -
|
| -WebInspector.SASSSupport.PropertyChange.prototype = {
|
| - /**
|
| - * @return {?WebInspector.SASSSupport.Property}
|
| - */
|
| - oldProperty: function()
|
| - {
|
| - return this.oldRule.properties[this.oldPropertyIndex] || null;
|
| - },
|
| -
|
| - /**
|
| - * @return {?WebInspector.SASSSupport.Property}
|
| - */
|
| - newProperty: function()
|
| - {
|
| - return this.newRule.properties[this.newPropertyIndex] || null;
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @return {?WebInspector.SASSSupport.Property}
|
| + */
|
| + oldProperty() {
|
| + return this.oldRule.properties[this.oldPropertyIndex] || null;
|
| + }
|
| +
|
| + /**
|
| + * @return {?WebInspector.SASSSupport.Property}
|
| + */
|
| + newProperty() {
|
| + return this.newRule.properties[this.newPropertyIndex] || null;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {string} url
|
| - * @param {!WebInspector.SASSSupport.AST} oldAST
|
| - * @param {!WebInspector.SASSSupport.AST} newAST
|
| - * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| - * @param {!Array<!WebInspector.SASSSupport.PropertyChange>} changes
|
| + * @unrestricted
|
| */
|
| -WebInspector.SASSSupport.ASTDiff = function(url, oldAST, newAST, mapping, changes)
|
| -{
|
| +WebInspector.SASSSupport.ASTDiff = class {
|
| + /**
|
| + * @param {string} url
|
| + * @param {!WebInspector.SASSSupport.AST} oldAST
|
| + * @param {!WebInspector.SASSSupport.AST} newAST
|
| + * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| + * @param {!Array<!WebInspector.SASSSupport.PropertyChange>} changes
|
| + */
|
| + constructor(url, oldAST, newAST, mapping, changes) {
|
| this.url = url;
|
| this.mapping = mapping;
|
| this.changes = changes;
|
| this.oldAST = oldAST;
|
| this.newAST = newAST;
|
| + }
|
| };
|
|
|
| /**
|
| @@ -611,83 +591,80 @@ WebInspector.SASSSupport.ASTDiff = function(url, oldAST, newAST, mapping, change
|
| * @param {!WebInspector.SASSSupport.AST} newAST
|
| * @return {!WebInspector.SASSSupport.ASTDiff}
|
| */
|
| -WebInspector.SASSSupport.diffModels = function(oldAST, newAST)
|
| -{
|
| - console.assert(oldAST.rules.length === newAST.rules.length, "Not implemented for rule diff.");
|
| - console.assert(oldAST.document.url === newAST.document.url, "Diff makes sense for models with the same url.");
|
| - var T = WebInspector.SASSSupport.PropertyChangeType;
|
| - var changes = [];
|
| - /** @type {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} */
|
| - var mapping = new Map();
|
| - for (var i = 0; i < oldAST.rules.length; ++i) {
|
| - var oldRule = oldAST.rules[i];
|
| - var newRule = newAST.rules[i];
|
| - computeRuleDiff(mapping, oldRule, newRule);
|
| - }
|
| - return new WebInspector.SASSSupport.ASTDiff(oldAST.document.url, oldAST, newAST, mapping, changes);
|
| -
|
| - /**
|
| - * @param {!WebInspector.SASSSupport.PropertyChangeType} type
|
| - * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| - * @param {!WebInspector.SASSSupport.Rule} newRule
|
| - * @param {number} oldPropertyIndex
|
| - * @param {number} newPropertyIndex
|
| - */
|
| - function addChange(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex)
|
| - {
|
| - changes.push(new WebInspector.SASSSupport.PropertyChange(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex));
|
| - }
|
| -
|
| - /**
|
| - * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| - * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| - * @param {!WebInspector.SASSSupport.Rule} newRule
|
| - */
|
| - function computeRuleDiff(mapping, oldRule, newRule)
|
| - {
|
| - var oldLines = [];
|
| - for (var i = 0; i < oldRule.properties.length; ++i)
|
| - oldLines.push(oldRule.properties[i].name.text.trim() + ":" + oldRule.properties[i].value.text.trim());
|
| - var newLines = [];
|
| - for (var i = 0; i < newRule.properties.length; ++i)
|
| - newLines.push(newRule.properties[i].name.text.trim() + ":" + newRule.properties[i].value.text.trim());
|
| - var diff = WebInspector.Diff.lineDiff(oldLines, newLines);
|
| - diff = WebInspector.Diff.convertToEditDiff(diff);
|
| -
|
| - var p1 = 0, p2 = 0;
|
| - for (var i = 0; i < diff.length; ++i) {
|
| - var token = diff[i];
|
| - if (token[0] === WebInspector.Diff.Operation.Delete) {
|
| - for (var j = 0; j < token[1]; ++j)
|
| - addChange(T.PropertyRemoved, oldRule, newRule, p1++, p2);
|
| - } else if (token[0] === WebInspector.Diff.Operation.Insert) {
|
| - for (var j = 0; j < token[1]; ++j)
|
| - addChange(T.PropertyAdded, oldRule, newRule, p1, p2++);
|
| - } else {
|
| - for (var j = 0; j < token[1]; ++j)
|
| - computePropertyDiff(mapping, oldRule, newRule, p1++, p2++);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| - * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| - * @param {!WebInspector.SASSSupport.Rule} newRule
|
| - * @param {number} oldPropertyIndex
|
| - * @param {number} newPropertyIndex
|
| - */
|
| - function computePropertyDiff(mapping, oldRule, newRule, oldPropertyIndex, newPropertyIndex)
|
| - {
|
| - var oldProperty = oldRule.properties[oldPropertyIndex];
|
| - var newProperty = newRule.properties[newPropertyIndex];
|
| - mapping.set(oldProperty.name, newProperty.name);
|
| - mapping.set(oldProperty.value, newProperty.value);
|
| - if (oldProperty.name.text.trim() !== newProperty.name.text.trim())
|
| - addChange(T.NameChanged, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| - if (oldProperty.value.text.trim() !== newProperty.value.text.trim())
|
| - addChange(T.ValueChanged, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| - if (oldProperty.disabled !== newProperty.disabled)
|
| - addChange(T.PropertyToggled, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| +WebInspector.SASSSupport.diffModels = function(oldAST, newAST) {
|
| + console.assert(oldAST.rules.length === newAST.rules.length, 'Not implemented for rule diff.');
|
| + console.assert(oldAST.document.url === newAST.document.url, 'Diff makes sense for models with the same url.');
|
| + var T = WebInspector.SASSSupport.PropertyChangeType;
|
| + var changes = [];
|
| + /** @type {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} */
|
| + var mapping = new Map();
|
| + for (var i = 0; i < oldAST.rules.length; ++i) {
|
| + var oldRule = oldAST.rules[i];
|
| + var newRule = newAST.rules[i];
|
| + computeRuleDiff(mapping, oldRule, newRule);
|
| + }
|
| + return new WebInspector.SASSSupport.ASTDiff(oldAST.document.url, oldAST, newAST, mapping, changes);
|
| +
|
| + /**
|
| + * @param {!WebInspector.SASSSupport.PropertyChangeType} type
|
| + * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| + * @param {!WebInspector.SASSSupport.Rule} newRule
|
| + * @param {number} oldPropertyIndex
|
| + * @param {number} newPropertyIndex
|
| + */
|
| + function addChange(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex) {
|
| + changes.push(
|
| + new WebInspector.SASSSupport.PropertyChange(type, oldRule, newRule, oldPropertyIndex, newPropertyIndex));
|
| + }
|
| +
|
| + /**
|
| + * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| + * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| + * @param {!WebInspector.SASSSupport.Rule} newRule
|
| + */
|
| + function computeRuleDiff(mapping, oldRule, newRule) {
|
| + var oldLines = [];
|
| + for (var i = 0; i < oldRule.properties.length; ++i)
|
| + oldLines.push(oldRule.properties[i].name.text.trim() + ':' + oldRule.properties[i].value.text.trim());
|
| + var newLines = [];
|
| + for (var i = 0; i < newRule.properties.length; ++i)
|
| + newLines.push(newRule.properties[i].name.text.trim() + ':' + newRule.properties[i].value.text.trim());
|
| + var diff = WebInspector.Diff.lineDiff(oldLines, newLines);
|
| + diff = WebInspector.Diff.convertToEditDiff(diff);
|
| +
|
| + var p1 = 0, p2 = 0;
|
| + for (var i = 0; i < diff.length; ++i) {
|
| + var token = diff[i];
|
| + if (token[0] === WebInspector.Diff.Operation.Delete) {
|
| + for (var j = 0; j < token[1]; ++j)
|
| + addChange(T.PropertyRemoved, oldRule, newRule, p1++, p2);
|
| + } else if (token[0] === WebInspector.Diff.Operation.Insert) {
|
| + for (var j = 0; j < token[1]; ++j)
|
| + addChange(T.PropertyAdded, oldRule, newRule, p1, p2++);
|
| + } else {
|
| + for (var j = 0; j < token[1]; ++j)
|
| + computePropertyDiff(mapping, oldRule, newRule, p1++, p2++);
|
| + }
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping
|
| + * @param {!WebInspector.SASSSupport.Rule} oldRule
|
| + * @param {!WebInspector.SASSSupport.Rule} newRule
|
| + * @param {number} oldPropertyIndex
|
| + * @param {number} newPropertyIndex
|
| + */
|
| + function computePropertyDiff(mapping, oldRule, newRule, oldPropertyIndex, newPropertyIndex) {
|
| + var oldProperty = oldRule.properties[oldPropertyIndex];
|
| + var newProperty = newRule.properties[newPropertyIndex];
|
| + mapping.set(oldProperty.name, newProperty.name);
|
| + mapping.set(oldProperty.value, newProperty.value);
|
| + if (oldProperty.name.text.trim() !== newProperty.name.text.trim())
|
| + addChange(T.NameChanged, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| + if (oldProperty.value.text.trim() !== newProperty.value.text.trim())
|
| + addChange(T.ValueChanged, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| + if (oldProperty.disabled !== newProperty.disabled)
|
| + addChange(T.PropertyToggled, oldRule, newRule, oldPropertyIndex, newPropertyIndex);
|
| + }
|
| };
|
|
|