Commit 56254974 authored by chenwilliam's avatar chenwilliam Committed by Commit bot

DevTools: don't cherrypick Common files for Gonzales

Previous, Gonzales was cherrypicking files from Common module for the
TextRange class which was used as a struct.

BUG=none

Review-Url: https://codereview.chromium.org/2625163002
Cr-Commit-Position: refs/heads/master@{#443148}
parent 6c75f8a3
...@@ -7,6 +7,6 @@ front_end/cm_modes/* ...@@ -7,6 +7,6 @@ front_end/cm_modes/*
front_end/cm_web_modes/* front_end/cm_web_modes/*
front_end/diff/diff_match_patch.js front_end/diff/diff_match_patch.js
front_end/formatter_worker/acorn/acorn.js front_end/formatter_worker/acorn/acorn.js
front_end/gonzales/* front_end/gonzales/gonzales-scss.js
front_end/terminal/xterm.js/** front_end/terminal/xterm.js/**
front_end/protocol_externs.js front_end/protocol_externs.js
...@@ -6,8 +6,6 @@ ...@@ -6,8 +6,6 @@
"scripts": [ "scripts": [
"../cm_web_modes/css.js", "../cm_web_modes/css.js",
"../cm_web_modes/xml.js", "../cm_web_modes/xml.js",
"../common/Text.js",
"../common/TextRange.js",
"ESTreeWalker.js", "ESTreeWalker.js",
"FormatterWorker.js", "FormatterWorker.js",
"acorn/acorn.js", "acorn/acorn.js",
......
...@@ -3,233 +3,240 @@ ...@@ -3,233 +3,240 @@
// found in the LICENSE file. // found in the LICENSE file.
/** /**
* @constructor
* @implements {FormatterWorker.FormatterWorkerContentParser} * @implements {FormatterWorker.FormatterWorkerContentParser}
* @unrestricted
*/ */
Gonzales.SCSSParser = function() Gonzales.SCSSParser = class {
{ /**
} * @override
* @param {string} content
Gonzales.SCSSParser.prototype = { * @return {!Array<!Gonzales.SCSSParser.Rule>}
/** */
* @override parse(content) {
* @param {string} content var ast = null;
* @return {!Array<!Gonzales.SCSSParser.Rule>} try {
*/ ast = gonzales.parse(content, {syntax: 'scss'});
parse: function(content) } catch (e) {
{ return [];
var ast = null; }
try {
ast = gonzales.parse(content, {syntax: "scss"});
} catch (e) {
return [];
}
/** @type {!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}} */
var rootBlock = {
properties: [],
node: ast
};
/** @type {!Array<!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}>} */
var blocks = [rootBlock];
ast.selectors = [];
Gonzales.SCSSParser.extractNodes(ast, blocks, rootBlock);
var rules = [];
for (var block of blocks)
this._handleBlock(block, rules);
return rules;
},
/**
* @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} block
* @param {!Array<!Gonzales.SCSSParser.Rule>} output
*/
_handleBlock: function(block, output)
{
var selectors = block.node.selectors.map(Gonzales.SCSSParser.rangeFromNode);
var properties = [];
var styleRange = Gonzales.SCSSParser.rangeFromNode(block.node);
styleRange.startColumn += 1;
styleRange.endColumn -= 1;
for (var node of block.properties) {
if (node.type === "declaration")
this._handleDeclaration(node, properties);
else if (node.type === "include")
this._handleInclude(node, properties);
else if (node.type === "multilineComment" && node.start.line === node.end.line)
this._handleComment(node, properties);
}
if (!selectors.length && !properties.length)
return;
var rule = new Gonzales.SCSSParser.Rule(selectors, properties, styleRange);
output.push(rule);
},
/**
* @param {!Gonzales.Node} node
* @param {!Array<!Gonzales.SCSSParser.Property>} output
*/
_handleDeclaration: function(node, output)
{
var propertyNode = node.content.find(node => node.type === "property");
var valueNode = node.content.find(node => node.type === "value");
if (!propertyNode || !valueNode)
return;
var nameRange = Gonzales.SCSSParser.rangeFromNode(propertyNode);
var valueRange = Gonzales.SCSSParser.rangeFromNode(valueNode);
var range = /** @type {!Common.TextRange} */(node.declarationRange);
var property = new Gonzales.SCSSParser.Property(range, nameRange, valueRange, false);
output.push(property);
},
/**
* @param {!Gonzales.Node} node
* @param {!Array<!Gonzales.SCSSParser.Property>} output
*/
_handleInclude: function(node, output)
{
var mixinName = node.content.find(node => node.type === "ident");
if (!mixinName)
return;
var nameRange = Gonzales.SCSSParser.rangeFromNode(mixinName);
var mixinArguments = node.content.find(node => node.type === "arguments");
if (!mixinArguments)
return;
var parameters = mixinArguments.content.filter(node => node.type !== "delimiter" && node.type !== "space");
for (var parameter of parameters) {
var range = Gonzales.SCSSParser.rangeFromNode(node);
var valueRange = Gonzales.SCSSParser.rangeFromNode(parameter);
var property = new Gonzales.SCSSParser.Property(range, nameRange, valueRange, false);
output.push(property);
}
},
/** /** @type {!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}} */
* @param {!Gonzales.Node} node var rootBlock = {properties: [], node: ast};
* @param {!Array<!Gonzales.SCSSParser.Property>} output /** @type {!Array<!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}>} */
*/ var blocks = [rootBlock];
_handleComment: function(node, output) ast.selectors = [];
{ Gonzales.SCSSParser.extractNodes(ast, blocks, rootBlock);
if (node.start.line !== node.end.line)
return; var rules = [];
var innerText = /** @type {string} */(node.content); for (var block of blocks)
var innerResult = this.parse(innerText); this._handleBlock(block, rules);
if (innerResult.length !== 1 || innerResult[0].properties.length !== 1) return rules;
return; }
var property = innerResult[0].properties[0];
var disabledProperty = property.rebaseInsideOneLineComment(node); /**
output.push(disabledProperty); * @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} block
}, * @param {!Array<!Gonzales.SCSSParser.Rule>} output
} */
_handleBlock(block, output) {
var selectors = block.node.selectors.map(Gonzales.SCSSParser.rangeFromNode);
var properties = [];
var styleRange = Gonzales.SCSSParser.rangeFromNode(block.node);
styleRange.startColumn += 1;
styleRange.endColumn -= 1;
for (var node of block.properties) {
if (node.type === 'declaration')
this._handleDeclaration(node, properties);
else if (node.type === 'include')
this._handleInclude(node, properties);
else if (node.type === 'multilineComment' && node.start.line === node.end.line)
this._handleComment(node, properties);
}
if (!selectors.length && !properties.length)
return;
var rule = new Gonzales.SCSSParser.Rule(selectors, properties, styleRange);
output.push(rule);
}
/**
* @param {!Gonzales.Node} node
* @param {!Array<!Gonzales.SCSSParser.Property>} output
*/
_handleDeclaration(node, output) {
var propertyNode = node.content.find(node => node.type === 'property');
var valueNode = node.content.find(node => node.type === 'value');
if (!propertyNode || !valueNode)
return;
var nameRange = Gonzales.SCSSParser.rangeFromNode(propertyNode);
var valueRange = Gonzales.SCSSParser.rangeFromNode(valueNode);
var range = /** @type {!Gonzales.TextRange} */ (node.declarationRange);
var property = new Gonzales.SCSSParser.Property(range, nameRange, valueRange, false);
output.push(property);
}
/**
* @param {!Gonzales.Node} node
* @param {!Array<!Gonzales.SCSSParser.Property>} output
*/
_handleInclude(node, output) {
var mixinName = node.content.find(node => node.type === 'ident');
if (!mixinName)
return;
var nameRange = Gonzales.SCSSParser.rangeFromNode(mixinName);
var mixinArguments = node.content.find(node => node.type === 'arguments');
if (!mixinArguments)
return;
var parameters = mixinArguments.content.filter(node => node.type !== 'delimiter' && node.type !== 'space');
for (var parameter of parameters) {
var range = Gonzales.SCSSParser.rangeFromNode(node);
var valueRange = Gonzales.SCSSParser.rangeFromNode(parameter);
var property = new Gonzales.SCSSParser.Property(range, nameRange, valueRange, false);
output.push(property);
}
}
/**
* @param {!Gonzales.Node} node
* @param {!Array<!Gonzales.SCSSParser.Property>} output
*/
_handleComment(node, output) {
if (node.start.line !== node.end.line)
return;
var innerText = /** @type {string} */ (node.content);
var innerResult = this.parse(innerText);
if (innerResult.length !== 1 || innerResult[0].properties.length !== 1)
return;
var property = innerResult[0].properties[0];
var disabledProperty = property.rebaseInsideOneLineComment(node);
output.push(disabledProperty);
}
};
/** /**
* @param {!Gonzales.Node} node * @param {!Gonzales.Node} node
* @return {!Common.TextRange} * @return {!Gonzales.TextRange}
*/ */
Gonzales.SCSSParser.rangeFromNode = function(node) Gonzales.SCSSParser.rangeFromNode = function(node) {
{ return new Gonzales.TextRange(node.start.line - 1, node.start.column - 1, node.end.line - 1, node.end.column);
return new Common.TextRange(node.start.line - 1, node.start.column - 1, node.end.line - 1, node.end.column); };
}
/** /**
* @constructor * @unrestricted
* @param {!Common.TextRange} range
* @param {!Common.TextRange} nameRange
* @param {!Common.TextRange} valueRange
* @param {boolean} disabled
*/ */
Gonzales.SCSSParser.Property = function(range, nameRange, valueRange, disabled) Gonzales.SCSSParser.Property = class {
{ /**
* @param {!Gonzales.TextRange} range
* @param {!Gonzales.TextRange} nameRange
* @param {!Gonzales.TextRange} valueRange
* @param {boolean} disabled
*/
constructor(range, nameRange, valueRange, disabled) {
this.range = range; this.range = range;
this.name = nameRange; this.name = nameRange;
this.value = valueRange; this.value = valueRange;
this.disabled = disabled; this.disabled = disabled;
} }
/**
* @param {!Gonzales.Node} commentNode
* @return {!Gonzales.SCSSParser.Property}
*/
rebaseInsideOneLineComment(commentNode) {
var lineOffset = commentNode.start.line - 1;
// Account for the "/*".
var columnOffset = commentNode.start.column - 1 + 2;
var range = Gonzales.SCSSParser.rangeFromNode(commentNode);
var name = rebaseRange(this.name, lineOffset, columnOffset);
var value = rebaseRange(this.value, lineOffset, columnOffset);
return new Gonzales.SCSSParser.Property(range, name, value, true);
Gonzales.SCSSParser.Property.prototype = {
/** /**
* @param {!Gonzales.Node} commentNode * @param {!Gonzales.TextRange} range
* @return {!Gonzales.SCSSParser.Property} * @param {number} lineOffset
* @param {number} columnOffset
* @return {!Gonzales.TextRange}
*/ */
rebaseInsideOneLineComment: function(commentNode) function rebaseRange(range, lineOffset, columnOffset) {
{ return new Gonzales.TextRange(
var lineOffset = commentNode.start.line - 1; range.startLine + lineOffset, range.startColumn + columnOffset, range.endLine + lineOffset,
// Account for the "/*". range.endColumn + columnOffset);
var columnOffset = commentNode.start.column - 1 + 2;
var range = Gonzales.SCSSParser.rangeFromNode(commentNode);
var name = rebaseRange(this.name, lineOffset, columnOffset);
var value = rebaseRange(this.value, lineOffset, columnOffset);
return new Gonzales.SCSSParser.Property(range, name, value, true);
/**
* @param {!Common.TextRange} range
* @param {number} lineOffset
* @param {number} columnOffset
* @return {!Common.TextRange}
*/
function rebaseRange(range, lineOffset, columnOffset)
{
return new Common.TextRange(range.startLine + lineOffset, range.startColumn + columnOffset, range.endLine + lineOffset, range.endColumn + columnOffset);
}
} }
} }
};
/** /**
* @constructor * @unrestricted
* @param {!Array<!Common.TextRange>} selectors
* @param {!Array<!Gonzales.SCSSParser.Property>} properties
* @param {!Common.TextRange} styleRange
*/ */
Gonzales.SCSSParser.Rule = function(selectors, properties, styleRange) Gonzales.SCSSParser.Rule = class {
{ /**
* @param {!Array<!Gonzales.TextRange>} selectors
* @param {!Array<!Gonzales.SCSSParser.Property>} properties
* @param {!Gonzales.TextRange} styleRange
*/
constructor(selectors, properties, styleRange) {
this.selectors = selectors; this.selectors = selectors;
this.properties = properties; this.properties = properties;
this.styleRange = styleRange; this.styleRange = styleRange;
} }
};
/** /**
* @param {!Gonzales.Node} node * @param {!Gonzales.Node} node
* @param {!Array<{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}>} blocks * @param {!Array<{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}>} blocks
* @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} lastBlock * @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} lastBlock
*/ */
Gonzales.SCSSParser.extractNodes = function(node, blocks, lastBlock) Gonzales.SCSSParser.extractNodes = function(node, blocks, lastBlock) {
{ if (!Array.isArray(node.content))
if (!Array.isArray(node.content)) return;
return; if (node.type === 'block') {
if (node.type === "block") { lastBlock = {node: node, properties: []};
lastBlock = { blocks.push(lastBlock);
node: node, }
properties: [] var lastDeclaration = null;
}; var selectors = [];
blocks.push(lastBlock); for (var i = 0; i < node.content.length; ++i) {
} var child = node.content[i];
var lastDeclaration = null; if (child.type === 'declarationDelimiter' && lastDeclaration) {
var selectors = []; lastDeclaration.declarationRange.endLine = child.end.line - 1;
for (var i = 0; i < node.content.length; ++i) { lastDeclaration.declarationRange.endColumn = child.end.column;
var child = node.content[i]; lastDeclaration = null;
if (child.type === "declarationDelimiter" && lastDeclaration) { } else if (child.type === 'selector') {
lastDeclaration.declarationRange.endLine = child.end.line - 1; selectors.push(child);
lastDeclaration.declarationRange.endColumn = child.end.column; } else if (child.type === 'block') {
lastDeclaration = null; child.selectors = selectors;
} else if (child.type === "selector") { selectors = [];
selectors.push(child);
} else if (child.type === "block") {
child.selectors = selectors;
selectors = [];
}
if (child.type === "include" || child.type === "declaration" || child.type === "multilineComment")
lastBlock.properties.push(child);
if (child.type === "declaration") {
lastDeclaration = child;
lastDeclaration.declarationRange = Common.TextRange.createFromLocation(child.start.line - 1, child.start.column - 1);
}
Gonzales.SCSSParser.extractNodes(child, blocks, lastBlock);
} }
if (lastDeclaration) { if (child.type === 'include' || child.type === 'declaration' || child.type === 'multilineComment')
lastDeclaration.declarationRange.endLine = node.end.line - 1; lastBlock.properties.push(child);
lastDeclaration.declarationRange.endColumn = node.end.column - 1; if (child.type === 'declaration') {
lastDeclaration = child;
const line = child.start.line - 1;
const column = child.start.column - 1;
lastDeclaration.declarationRange = new Gonzales.TextRange(line, column, line, column);
} }
} Gonzales.SCSSParser.extractNodes(child, blocks, lastBlock);
}
if (lastDeclaration) {
lastDeclaration.declarationRange.endLine = node.end.line - 1;
lastDeclaration.declarationRange.endColumn = node.end.column - 1;
}
};
/**
* @unrestricted
*/
Gonzales.TextRange = class {
/**
* @param {number} startLine
* @param {number} startColumn
* @param {number} endLine
* @param {number} endColumn
*/
constructor(startLine, startColumn, endLine, endColumn) {
this.startLine = startLine;
this.startColumn = startColumn;
this.endLine = endLine;
this.endColumn = endColumn;
}
};
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment