| 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 c8270049b9eadb7b24a6006fa0b3ea1257795e0a..07a53fe661973e056a3aa6f2e4be64d8917a7989 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
|
| @@ -42,210 +42,56 @@ WebInspector.SASSSupport.parseCSS = function(url, text)
|
| }
|
|
|
| /**
|
| - * @param {!WebInspector.TokenizerFactory} tokenizerFactory
|
| * @param {string} url
|
| - * @param {string} text
|
| - * @return {!WebInspector.SASSSupport.AST}
|
| + * @param {string} content
|
| + * @return {!Promise<!WebInspector.SASSSupport.AST>}
|
| */
|
| -WebInspector.SASSSupport.parseSCSS = function(tokenizerFactory, url, text)
|
| +WebInspector.SASSSupport.parseSCSS = function(url, content)
|
| {
|
| - var document = new WebInspector.SASSSupport.ASTDocument(url, new WebInspector.Text(text));
|
| - var result = WebInspector.SASSSupport._innerParseSCSS(document, tokenizerFactory);
|
| -
|
| - var rules = [
|
| - new WebInspector.SASSSupport.Rule(document, "variables", WebInspector.TextRange.createFromLocation(0, 0), result.variables),
|
| - new WebInspector.SASSSupport.Rule(document, "properties", WebInspector.TextRange.createFromLocation(0, 0), result.properties),
|
| - new WebInspector.SASSSupport.Rule(document, "mixins", WebInspector.TextRange.createFromLocation(0, 0), result.mixins)
|
| - ];
|
| -
|
| - return new WebInspector.SASSSupport.AST(document, rules);
|
| -}
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.SASSSupport.SCSSParserStates = {
|
| - Initial: "Initial",
|
| - PropertyName: "PropertyName",
|
| - PropertyValue: "PropertyValue",
|
| - VariableName: "VariableName",
|
| - VariableValue: "VariableValue",
|
| - MixinName: "MixinName",
|
| - MixinValue: "MixinValue",
|
| - Media: "Media"
|
| -}
|
| + var text = new WebInspector.Text(content);
|
| + var document = new WebInspector.SASSSupport.ASTDocument(url, text);
|
|
|
| -/**
|
| - * @param {!WebInspector.SASSSupport.ASTDocument} document
|
| - * @param {!WebInspector.TokenizerFactory} tokenizerFactory
|
| - * @return {!{variables: !Array<!WebInspector.SASSSupport.Property>, properties: !Array<!WebInspector.SASSSupport.Property>, mixins: !Array<!WebInspector.SASSSupport.Property>}}
|
| - */
|
| -WebInspector.SASSSupport._innerParseSCSS = function(document, tokenizerFactory)
|
| -{
|
| - var properties = [];
|
| - var variables = [];
|
| - var mixins = [];
|
| + return WebInspector.formatterWorkerPool.runTask("parseSCSS", {content: content}).then(onParsed);
|
|
|
| - var States = WebInspector.SASSSupport.SCSSParserStates;
|
| - var state = States.Initial;
|
| - var propertyName, propertyValue;
|
| - var variableName, variableValue;
|
| - var mixinName, mixinValue;
|
| - var UndefTokenType = {};
|
| + /**
|
| + * @param {?MessageEvent} event
|
| + * @return {!WebInspector.SASSSupport.AST}
|
| + */
|
| + function onParsed(event)
|
| + {
|
| + if (!event)
|
| + return new WebInspector.SASSSupport.AST(document, []);
|
| + var data = /** @type {!{properties: !Array<!Object>, variables: !Array<!Object>, mixins: !Array<!Object>}} */(event.data);
|
| + var properties = data.properties.map(createProperty);
|
| + var variables = data.variables.map(createProperty);
|
| + var mixins = data.mixins.map(createProperty);
|
| + var rules = [
|
| + new WebInspector.SASSSupport.Rule(document, "variables", WebInspector.TextRange.createFromLocation(0, 0), variables),
|
| + new WebInspector.SASSSupport.Rule(document, "properties", WebInspector.TextRange.createFromLocation(0, 0), properties),
|
| + new WebInspector.SASSSupport.Rule(document, "mixins", WebInspector.TextRange.createFromLocation(0, 0), mixins)
|
| + ];
|
|
|
| - var cursor = new WebInspector.TextCursor(document.text.lineEndings());
|
| + return new WebInspector.SASSSupport.AST(document, rules);
|
| + }
|
|
|
| /**
|
| - * @param {string} tokenValue
|
| - * @param {?string} tokenTypes
|
| - * @param {number} startPosition
|
| - * @param {number} endPosition
|
| + * @param {!Object} payload
|
| */
|
| - function processToken(tokenValue, tokenTypes, startPosition, endPosition)
|
| + function createTextNode(payload)
|
| {
|
| - cursor.advance(startPosition);
|
| - var startLine = cursor.lineNumber();
|
| - var startColumn = cursor.columnNumber();
|
| - cursor.advance(endPosition);
|
| - var endLine = cursor.lineNumber();
|
| - var endColumn = cursor.columnNumber();
|
| -
|
| - var tokenType = tokenTypes ? tokenTypes.split(" ").keySet() : UndefTokenType;
|
| - switch (state) {
|
| - case States.Initial:
|
| - if (tokenType["css-variable-2"]) {
|
| - variableName = new WebInspector.SASSSupport.TextNode(document, tokenValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn));
|
| - state = States.VariableName;
|
| - } else if (tokenType["css-property"] || tokenType["css-meta"]) {
|
| - propertyName = new WebInspector.SASSSupport.TextNode(document, tokenValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn));
|
| - state = States.PropertyName;
|
| - } else if (tokenType["css-def"] && tokenValue === "@include") {
|
| - mixinName = new WebInspector.SASSSupport.TextNode(document, tokenValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn));
|
| - state = States.MixinName;
|
| - } else if (tokenType["css-comment"]) {
|
| - // Support only a one-line comments.
|
| - if (startLine !== endLine || tokenValue.substring(0, 2) !== "/*" || tokenValue.substring(tokenValue.length - 2) !== "*/")
|
| - break;
|
| - var uncommentedText = tokenValue.substring(2, tokenValue.length - 2);
|
| - var fakeRuleText = "a{" + uncommentedText + "}";
|
| - var fakeDocument = new WebInspector.SASSSupport.ASTDocument("", new WebInspector.Text(fakeRuleText));
|
| - var result = WebInspector.SASSSupport._innerParseSCSS(fakeDocument, tokenizerFactory);
|
| - if (result.properties.length === 1 && result.variables.length === 0 && result.mixins.length === 0) {
|
| - var disabledProperty = result.properties[0];
|
| - var nameRange = rebaseInsideOneLineComment(disabledProperty.name.range, startLine, startColumn);
|
| - var valueRange = rebaseInsideOneLineComment(disabledProperty.value.range, startLine, startColumn);
|
| - var name = new WebInspector.SASSSupport.TextNode(document, disabledProperty.name.text, nameRange);
|
| - var value = new WebInspector.SASSSupport.TextNode(document, disabledProperty.value.text, valueRange);
|
| - var range = new WebInspector.TextRange(startLine, startColumn, startLine, endColumn);
|
| - var property = new WebInspector.SASSSupport.Property(document, name, value, range, true);
|
| - properties.push(property);
|
| - }
|
| - } else if (tokenType["css-def"] && tokenValue === "@media") {
|
| - state = States.Media;
|
| - }
|
| - break;
|
| - case States.VariableName:
|
| - if (tokenValue === "}" && tokenType === UndefTokenType) {
|
| - state = States.Initial;
|
| - } else if (tokenValue === ")" && tokenType === UndefTokenType) {
|
| - state = States.Initial;
|
| - } else if (tokenValue === ":" && tokenType === UndefTokenType) {
|
| - state = States.VariableValue;
|
| - variableValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
|
| - } else if (tokenType !== UndefTokenType) {
|
| - state = States.Initial;
|
| - }
|
| - break;
|
| - case States.VariableValue:
|
| - if (tokenValue === ";" && tokenType === UndefTokenType) {
|
| - variableValue.range.endLine = startLine;
|
| - variableValue.range.endColumn = startColumn;
|
| - var variable = new WebInspector.SASSSupport.Property(document, variableName, variableValue, variableName.range.clone(), false);
|
| - variable.range.endLine = startLine;
|
| - variable.range.endColumn = endColumn;
|
| - variables.push(variable);
|
| - state = States.Initial;
|
| - } else {
|
| - variableValue.text += tokenValue;
|
| - }
|
| - break;
|
| - case States.PropertyName:
|
| - if (tokenValue === "{" && tokenType === UndefTokenType) {
|
| - state = States.Initial;
|
| - } else if (tokenValue === ":" && tokenType === UndefTokenType) {
|
| - state = States.PropertyValue;
|
| - propertyName.range.endLine = startLine;
|
| - propertyName.range.endColumn = startColumn;
|
| - propertyValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
|
| - } else if (tokenType["css-property"]) {
|
| - propertyName.text += tokenValue;
|
| - }
|
| - break;
|
| - case States.PropertyValue:
|
| - if (tokenValue === "{" && tokenType === UndefTokenType) {
|
| - state = States.Initial;
|
| - } else if ((tokenValue === "}" || tokenValue === ";") && tokenType === UndefTokenType) {
|
| - propertyValue.range.endLine = startLine;
|
| - propertyValue.range.endColumn = startColumn;
|
| - var property = new WebInspector.SASSSupport.Property(document, propertyName, propertyValue, propertyName.range.clone(), false);
|
| - property.range.endLine = startLine;
|
| - property.range.endColumn = endColumn;
|
| - properties.push(property);
|
| - state = States.Initial;
|
| - } else {
|
| - propertyValue.text += tokenValue;
|
| - }
|
| - break;
|
| - case States.MixinName:
|
| - if (tokenValue === "(" && tokenType === UndefTokenType) {
|
| - state = States.MixinValue;
|
| - mixinName.range.endLine = startLine;
|
| - mixinName.range.endColumn = startColumn;
|
| - mixinValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
|
| - } else if (tokenValue === ";" && tokenType === UndefTokenType) {
|
| - state = States.Initial;
|
| - mixinValue = null;
|
| - } else {
|
| - mixinName.text += tokenValue;
|
| - }
|
| - break;
|
| - case States.MixinValue:
|
| - if (tokenValue === ")" && tokenType === UndefTokenType) {
|
| - mixinValue.range.endLine = startLine;
|
| - mixinValue.range.endColumn = startColumn;
|
| - var mixin = new WebInspector.SASSSupport.Property(document, mixinName, /** @type {!WebInspector.SASSSupport.TextNode} */(mixinValue), mixinName.range.clone(), false);
|
| - mixin.range.endLine = startLine;
|
| - mixin.range.endColumn = endColumn;
|
| - mixins.push(mixin);
|
| - state = States.Initial;
|
| - } else {
|
| - mixinValue.text += tokenValue;
|
| - }
|
| - break;
|
| - case States.Media:
|
| - if (tokenValue === "{" && tokenType === UndefTokenType)
|
| - state = States.Initial;
|
| - break;
|
| - default:
|
| - console.assert(false, "Unknown SASS parser state.");
|
| - }
|
| + var range = WebInspector.TextRange.fromObject(payload);
|
| + var value = text.extract(range);
|
| + return new WebInspector.SASSSupport.TextNode(document, text.extract(range), range);
|
| }
|
| - var tokenizer = tokenizerFactory.createTokenizer("text/x-scss");
|
| - tokenizer(document.text.value(), processToken);
|
| -
|
| - return {
|
| - variables: variables,
|
| - properties: properties,
|
| - mixins: mixins
|
| - };
|
|
|
| /**
|
| - * @param {!WebInspector.TextRange} range
|
| - * @param {number} startLine
|
| - * @param {number} startColumn
|
| - * @return {!WebInspector.TextRange}
|
| + * @param {!Object} payload
|
| */
|
| - function rebaseInsideOneLineComment(range, startLine, startColumn)
|
| + function createProperty(payload)
|
| {
|
| - return new WebInspector.TextRange(range.startLine + startLine, range.startColumn + startColumn, range.endLine + startLine, range.endColumn + startColumn);
|
| + 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);
|
| }
|
| }
|
|
|
|
|