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

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

Issue 1917863008: DevTools: [SASS] introduce Gonzales-PE for SCSS parsing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebaseline Created 4 years, 7 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 WebInspector.SASSSupport = {} 5 WebInspector.SASSSupport = {}
6 6
7 /** 7 /**
8 * @param {string} url 8 * @param {string} url
9 * @param {string} text 9 * @param {string} text
10 * @return {!Promise<!WebInspector.SASSSupport.AST>} 10 * @return {!Promise<!WebInspector.SASSSupport.AST>}
(...skipping 24 matching lines...) Expand all
35 var property = new WebInspector.SASSSupport.Property(document, n ame, value, WebInspector.TextRange.fromObject(cssProperty.range), !!cssProperty. disabled); 35 var property = new WebInspector.SASSSupport.Property(document, n ame, value, WebInspector.TextRange.fromObject(cssProperty.range), !!cssProperty. disabled);
36 properties.push(property); 36 properties.push(property);
37 } 37 }
38 rules.push(new WebInspector.SASSSupport.Rule(document, rule.selector Text, WebInspector.TextRange.fromObject(rule.styleRange), properties)); 38 rules.push(new WebInspector.SASSSupport.Rule(document, rule.selector Text, WebInspector.TextRange.fromObject(rule.styleRange), properties));
39 } 39 }
40 return new WebInspector.SASSSupport.AST(document, rules); 40 return new WebInspector.SASSSupport.AST(document, rules);
41 } 41 }
42 } 42 }
43 43
44 /** 44 /**
45 * @param {!WebInspector.TokenizerFactory} tokenizerFactory
46 * @param {string} url 45 * @param {string} url
47 * @param {string} text 46 * @param {string} content
48 * @return {!WebInspector.SASSSupport.AST} 47 * @return {!Promise<!WebInspector.SASSSupport.AST>}
49 */ 48 */
50 WebInspector.SASSSupport.parseSCSS = function(tokenizerFactory, url, text) 49 WebInspector.SASSSupport.parseSCSS = function(url, content)
51 { 50 {
52 var document = new WebInspector.SASSSupport.ASTDocument(url, new WebInspecto r.Text(text)); 51 var text = new WebInspector.Text(content);
53 var result = WebInspector.SASSSupport._innerParseSCSS(document, tokenizerFac tory); 52 var document = new WebInspector.SASSSupport.ASTDocument(url, text);
54 53
55 var rules = [ 54 return WebInspector.formatterWorkerPool.runTask("parseSCSS", {content: conte nt}).then(onParsed);
56 new WebInspector.SASSSupport.Rule(document, "variables", WebInspector.Te xtRange.createFromLocation(0, 0), result.variables),
57 new WebInspector.SASSSupport.Rule(document, "properties", WebInspector.T extRange.createFromLocation(0, 0), result.properties),
58 new WebInspector.SASSSupport.Rule(document, "mixins", WebInspector.TextR ange.createFromLocation(0, 0), result.mixins)
59 ];
60
61 return new WebInspector.SASSSupport.AST(document, rules);
62 }
63
64 /** @enum {string} */
65 WebInspector.SASSSupport.SCSSParserStates = {
66 Initial: "Initial",
67 PropertyName: "PropertyName",
68 PropertyValue: "PropertyValue",
69 VariableName: "VariableName",
70 VariableValue: "VariableValue",
71 MixinName: "MixinName",
72 MixinValue: "MixinValue",
73 Media: "Media"
74 }
75
76 /**
77 * @param {!WebInspector.SASSSupport.ASTDocument} document
78 * @param {!WebInspector.TokenizerFactory} tokenizerFactory
79 * @return {!{variables: !Array<!WebInspector.SASSSupport.Property>, properties: !Array<!WebInspector.SASSSupport.Property>, mixins: !Array<!WebInspector.SASSSu pport.Property>}}
80 */
81 WebInspector.SASSSupport._innerParseSCSS = function(document, tokenizerFactory)
82 {
83 var properties = [];
84 var variables = [];
85 var mixins = [];
86
87 var States = WebInspector.SASSSupport.SCSSParserStates;
88 var state = States.Initial;
89 var propertyName, propertyValue;
90 var variableName, variableValue;
91 var mixinName, mixinValue;
92 var UndefTokenType = {};
93
94 var cursor = new WebInspector.TextCursor(document.text.lineEndings());
95 55
96 /** 56 /**
97 * @param {string} tokenValue 57 * @param {?MessageEvent} event
98 * @param {?string} tokenTypes 58 * @return {!WebInspector.SASSSupport.AST}
99 * @param {number} startPosition
100 * @param {number} endPosition
101 */ 59 */
102 function processToken(tokenValue, tokenTypes, startPosition, endPosition) 60 function onParsed(event)
103 { 61 {
104 cursor.advance(startPosition); 62 if (!event)
105 var startLine = cursor.lineNumber(); 63 return new WebInspector.SASSSupport.AST(document, []);
106 var startColumn = cursor.columnNumber(); 64 var data = /** @type {!{properties: !Array<!Object>, variables: !Array<! Object>, mixins: !Array<!Object>}} */(event.data);
107 cursor.advance(endPosition); 65 var properties = data.properties.map(createProperty);
108 var endLine = cursor.lineNumber(); 66 var variables = data.variables.map(createProperty);
109 var endColumn = cursor.columnNumber(); 67 var mixins = data.mixins.map(createProperty);
68 var rules = [
69 new WebInspector.SASSSupport.Rule(document, "variables", WebInspecto r.TextRange.createFromLocation(0, 0), variables),
70 new WebInspector.SASSSupport.Rule(document, "properties", WebInspect or.TextRange.createFromLocation(0, 0), properties),
71 new WebInspector.SASSSupport.Rule(document, "mixins", WebInspector.T extRange.createFromLocation(0, 0), mixins)
72 ];
110 73
111 var tokenType = tokenTypes ? tokenTypes.split(" ").keySet() : UndefToken Type; 74 return new WebInspector.SASSSupport.AST(document, rules);
112 switch (state) {
113 case States.Initial:
114 if (tokenType["css-variable-2"]) {
115 variableName = new WebInspector.SASSSupport.TextNode(document, t okenValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn ));
116 state = States.VariableName;
117 } else if (tokenType["css-property"] || tokenType["css-meta"]) {
118 propertyName = new WebInspector.SASSSupport.TextNode(document, t okenValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn ));
119 state = States.PropertyName;
120 } else if (tokenType["css-def"] && tokenValue === "@include") {
121 mixinName = new WebInspector.SASSSupport.TextNode(document, toke nValue, new WebInspector.TextRange(startLine, startColumn, endLine, endColumn));
122 state = States.MixinName;
123 } else if (tokenType["css-comment"]) {
124 // Support only a one-line comments.
125 if (startLine !== endLine || tokenValue.substring(0, 2) !== "/*" || tokenValue.substring(tokenValue.length - 2) !== "*/")
126 break;
127 var uncommentedText = tokenValue.substring(2, tokenValue.length - 2);
128 var fakeRuleText = "a{" + uncommentedText + "}";
129 var fakeDocument = new WebInspector.SASSSupport.ASTDocument("", new WebInspector.Text(fakeRuleText));
130 var result = WebInspector.SASSSupport._innerParseSCSS(fakeDocume nt, tokenizerFactory);
131 if (result.properties.length === 1 && result.variables.length == = 0 && result.mixins.length === 0) {
132 var disabledProperty = result.properties[0];
133 var nameRange = rebaseInsideOneLineComment(disabledProperty. name.range, startLine, startColumn);
134 var valueRange = rebaseInsideOneLineComment(disabledProperty .value.range, startLine, startColumn);
135 var name = new WebInspector.SASSSupport.TextNode(document, d isabledProperty.name.text, nameRange);
136 var value = new WebInspector.SASSSupport.TextNode(document, disabledProperty.value.text, valueRange);
137 var range = new WebInspector.TextRange(startLine, startColum n, startLine, endColumn);
138 var property = new WebInspector.SASSSupport.Property(documen t, name, value, range, true);
139 properties.push(property);
140 }
141 } else if (tokenType["css-def"] && tokenValue === "@media") {
142 state = States.Media;
143 }
144 break;
145 case States.VariableName:
146 if (tokenValue === "}" && tokenType === UndefTokenType) {
147 state = States.Initial;
148 } else if (tokenValue === ")" && tokenType === UndefTokenType) {
149 state = States.Initial;
150 } else if (tokenValue === ":" && tokenType === UndefTokenType) {
151 state = States.VariableValue;
152 variableValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
153 } else if (tokenType !== UndefTokenType) {
154 state = States.Initial;
155 }
156 break;
157 case States.VariableValue:
158 if (tokenValue === ";" && tokenType === UndefTokenType) {
159 variableValue.range.endLine = startLine;
160 variableValue.range.endColumn = startColumn;
161 var variable = new WebInspector.SASSSupport.Property(document, v ariableName, variableValue, variableName.range.clone(), false);
162 variable.range.endLine = startLine;
163 variable.range.endColumn = endColumn;
164 variables.push(variable);
165 state = States.Initial;
166 } else {
167 variableValue.text += tokenValue;
168 }
169 break;
170 case States.PropertyName:
171 if (tokenValue === "{" && tokenType === UndefTokenType) {
172 state = States.Initial;
173 } else if (tokenValue === ":" && tokenType === UndefTokenType) {
174 state = States.PropertyValue;
175 propertyName.range.endLine = startLine;
176 propertyName.range.endColumn = startColumn;
177 propertyValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
178 } else if (tokenType["css-property"]) {
179 propertyName.text += tokenValue;
180 }
181 break;
182 case States.PropertyValue:
183 if (tokenValue === "{" && tokenType === UndefTokenType) {
184 state = States.Initial;
185 } else if ((tokenValue === "}" || tokenValue === ";") && tokenType = == UndefTokenType) {
186 propertyValue.range.endLine = startLine;
187 propertyValue.range.endColumn = startColumn;
188 var property = new WebInspector.SASSSupport.Property(document, p ropertyName, propertyValue, propertyName.range.clone(), false);
189 property.range.endLine = startLine;
190 property.range.endColumn = endColumn;
191 properties.push(property);
192 state = States.Initial;
193 } else {
194 propertyValue.text += tokenValue;
195 }
196 break;
197 case States.MixinName:
198 if (tokenValue === "(" && tokenType === UndefTokenType) {
199 state = States.MixinValue;
200 mixinName.range.endLine = startLine;
201 mixinName.range.endColumn = startColumn;
202 mixinValue = new WebInspector.SASSSupport.TextNode(document, "", WebInspector.TextRange.createFromLocation(startLine, endColumn));
203 } else if (tokenValue === ";" && tokenType === UndefTokenType) {
204 state = States.Initial;
205 mixinValue = null;
206 } else {
207 mixinName.text += tokenValue;
208 }
209 break;
210 case States.MixinValue:
211 if (tokenValue === ")" && tokenType === UndefTokenType) {
212 mixinValue.range.endLine = startLine;
213 mixinValue.range.endColumn = startColumn;
214 var mixin = new WebInspector.SASSSupport.Property(document, mixi nName, /** @type {!WebInspector.SASSSupport.TextNode} */(mixinValue), mixinName. range.clone(), false);
215 mixin.range.endLine = startLine;
216 mixin.range.endColumn = endColumn;
217 mixins.push(mixin);
218 state = States.Initial;
219 } else {
220 mixinValue.text += tokenValue;
221 }
222 break;
223 case States.Media:
224 if (tokenValue === "{" && tokenType === UndefTokenType)
225 state = States.Initial;
226 break;
227 default:
228 console.assert(false, "Unknown SASS parser state.");
229 }
230 } 75 }
231 var tokenizer = tokenizerFactory.createTokenizer("text/x-scss");
232 tokenizer(document.text.value(), processToken);
233
234 return {
235 variables: variables,
236 properties: properties,
237 mixins: mixins
238 };
239 76
240 /** 77 /**
241 * @param {!WebInspector.TextRange} range 78 * @param {!Object} payload
242 * @param {number} startLine
243 * @param {number} startColumn
244 * @return {!WebInspector.TextRange}
245 */ 79 */
246 function rebaseInsideOneLineComment(range, startLine, startColumn) 80 function createTextNode(payload)
247 { 81 {
248 return new WebInspector.TextRange(range.startLine + startLine, range.sta rtColumn + startColumn, range.endLine + startLine, range.endColumn + startColumn ); 82 var range = WebInspector.TextRange.fromObject(payload);
83 var value = text.extract(range);
84 return new WebInspector.SASSSupport.TextNode(document, text.extract(rang e), range);
85 }
86
87 /**
88 * @param {!Object} payload
89 */
90 function createProperty(payload)
91 {
92 var name = createTextNode(payload.name);
93 var value = createTextNode(payload.value);
94 return new WebInspector.SASSSupport.Property(document, name, value, WebI nspector.TextRange.fromObject(payload.range), payload.disabled);
249 } 95 }
250 } 96 }
251 97
252 /** 98 /**
253 * @constructor 99 * @constructor
254 * @param {string} url 100 * @param {string} url
255 * @param {!WebInspector.Text} text 101 * @param {!WebInspector.Text} text
256 */ 102 */
257 WebInspector.SASSSupport.ASTDocument = function(url, text) 103 WebInspector.SASSSupport.ASTDocument = function(url, text)
258 { 104 {
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 mapping.set(oldProperty.name, newProperty.name); 698 mapping.set(oldProperty.name, newProperty.name);
853 mapping.set(oldProperty.value, newProperty.value); 699 mapping.set(oldProperty.value, newProperty.value);
854 if (oldProperty.name.text.trim() !== newProperty.name.text.trim()) 700 if (oldProperty.name.text.trim() !== newProperty.name.text.trim())
855 addChange(T.NameChanged, oldRule, newRule, oldPropertyIndex, newProp ertyIndex); 701 addChange(T.NameChanged, oldRule, newRule, oldPropertyIndex, newProp ertyIndex);
856 if (oldProperty.value.text.trim() !== newProperty.value.text.trim()) 702 if (oldProperty.value.text.trim() !== newProperty.value.text.trim())
857 addChange(T.ValueChanged, oldRule, newRule, oldPropertyIndex, newPro pertyIndex); 703 addChange(T.ValueChanged, oldRule, newRule, oldPropertyIndex, newPro pertyIndex);
858 if (oldProperty.disabled !== newProperty.disabled) 704 if (oldProperty.disabled !== newProperty.disabled)
859 addChange(T.PropertyToggled, oldRule, newRule, oldPropertyIndex, new PropertyIndex); 705 addChange(T.PropertyToggled, oldRule, newRule, oldPropertyIndex, new PropertyIndex);
860 } 706 }
861 } 707 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698