Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(652)

Unified Diff: third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
};

Powered by Google App Engine
This is Rietveld 408576698