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

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

Issue 1641893002: DevTools: [SASS] introduce workspace/cssModel adapter for SASS processor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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.SASSLiveSourceMap = {} 5 WebInspector.SASSLiveSourceMap = {}
6 6
7 /** 7 /**
8 * @param {!WebInspector.SASSWorkspaceAdapter.Client} client
9 * @param {!WebInspector.CSSParser} cssParser
10 * @param {!WebInspector.TokenizerFactory} tokenizer
11 * @param {!WebInspector.SourceMap} sourceMap
12 * @return {!Promise<?WebInspector.SASSLiveSourceMap.CSSToSASSMapping>}
13 */
14 WebInspector.SASSLiveSourceMap._loadMapping = function(client, cssParser, tokeni zer, sourceMap)
15 {
16 var sassModels = new Map();
17 var cssAST = null;
18 var promises = [];
19 for (var url of sourceMap.sources()) {
dgozman 2016/01/27 23:14:04 client.sassURLs()
lushnikov 2016/01/28 00:04:29 Done.
20 var sassPromise = client.content(url)
21 .then(text => WebInspector.SASSSupport.parseSCSS(url, text, tokenize r))
22 .then(ast => sassModels.set(url, ast));
23 promises.push(sassPromise);
24 }
25 var cssPromise = client.content(sourceMap.compiledURL())
dgozman 2016/01/27 23:14:04 client.cssURL()
lushnikov 2016/01/28 00:04:29 Done.
26 .then(text => WebInspector.SASSSupport.parseCSS(cssParser, sourceMap.com piledURL(), text))
27 .then(ast => cssAST = ast);
28 promises.push(cssPromise);
29
30 return Promise.all(promises)
31 .then(() => WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMa p(sourceMap, cssAST, sassModels))
dgozman 2016/01/27 23:14:04 Use client.sourceMap() and remove sourceMap parame
lushnikov 2016/01/28 00:04:29 Done.
32 .catchException(/** @type {?WebInspector.SASSLiveSourceMap.CSSToSASSMapp ing} */(null))
dgozman 2016/01/27 23:14:04 semicolon missing
lushnikov 2016/01/28 00:04:29 Done.
33 }
34
35 /**
8 * @constructor 36 * @constructor
37 * @param {!WebInspector.SASSSupport.AST} cssAST
38 * @param {!Map<string, !WebInspector.SASSSupport.AST>} sassModels
9 */ 39 */
10 WebInspector.SASSLiveSourceMap.CSSToSASSMapping = function() 40 WebInspector.SASSLiveSourceMap.CSSToSASSMapping = function(cssAST, sassModels)
11 { 41 {
42 this._cssAST = cssAST;
43 this._sassModels = sassModels;
12 /** @type {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSuppor t.TextNode>} */ 44 /** @type {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSuppor t.TextNode>} */
13 this._cssToSass = new Map(); 45 this._cssToSass = new Map();
14 /** @type {!Multimap<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSS upport.TextNode>} */ 46 /** @type {!Multimap<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSS upport.TextNode>} */
15 this._sassToCss = new Multimap(); 47 this._sassToCss = new Multimap();
16 } 48 }
17 49
18 /** 50 /**
19 * @param {!WebInspector.SourceMap} sourceMap 51 * @param {!WebInspector.SourceMap} sourceMap
20 * @param {!WebInspector.SASSSupport.AST} cssAST 52 * @param {!WebInspector.SASSSupport.AST} cssAST
21 * @param {!Map<string, !WebInspector.SASSSupport.AST>} sassModels 53 * @param {!Map<string, !WebInspector.SASSSupport.AST>} sassModels
22 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping} 54 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping}
23 */ 55 */
24 WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap = function(sourceM ap, cssAST, sassModels) 56 WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap = function(sourceM ap, cssAST, sassModels)
25 { 57 {
26 var mapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); 58 var mapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(cssAST, sa ssModels);
27 //FIXME: this works O(N^2). 59 //FIXME: this works O(N^2).
28 cssAST.visit(map); 60 cssAST.visit(map);
29 return mapping; 61 return mapping;
30 62
31 /** 63 /**
32 * @param {!WebInspector.SASSSupport.Node} cssNode 64 * @param {!WebInspector.SASSSupport.Node} cssNode
33 */ 65 */
34 function map(cssNode) 66 function map(cssNode)
35 { 67 {
36 if (!(cssNode instanceof WebInspector.SASSSupport.TextNode)) 68 if (!(cssNode instanceof WebInspector.SASSSupport.TextNode))
37 return; 69 return;
38 var entry = sourceMap.findEntry(cssNode.range.endLine, cssNode.range.end Column); 70 var entry = sourceMap.findEntry(cssNode.range.endLine, cssNode.range.end Column);
39 if (!entry || !entry.sourceURL || typeof entry.sourceLineNumber === "und efined" || typeof entry.sourceColumnNumber === "undefined") 71 if (!entry || !entry.sourceURL || typeof entry.sourceLineNumber === "und efined" || typeof entry.sourceColumnNumber === "undefined")
40 return; 72 return;
41 var sassAST = sassModels.get(entry.sourceURL); 73 var sassAST = sassModels.get(entry.sourceURL);
42 if (!sassAST) 74 if (!sassAST)
43 return; 75 return;
44 var sassNode = sassAST.findNodeForPosition(entry.sourceLineNumber, entry .sourceColumnNumber); 76 var sassNode = sassAST.findNodeForPosition(entry.sourceLineNumber, entry .sourceColumnNumber);
45 if (sassNode) 77 if (sassNode)
46 mapping.mapCssToSass(cssNode, sassNode); 78 mapping.mapCssToSass(cssNode, sassNode);
47 } 79 }
48 } 80 }
49 81
50 WebInspector.SASSLiveSourceMap.CSSToSASSMapping.prototype = { 82 WebInspector.SASSLiveSourceMap.CSSToSASSMapping.prototype = {
51 /** 83 /**
84 * @return {!WebInspector.SASSSupport.AST}
85 */
86 cssAST: function()
87 {
88 return this._cssAST;
89 },
90
91 /**
92 * @return {!Map<string, !WebInspector.SASSSupport.AST>}
93 */
94 sassModels: function()
95 {
96 return this._sassModels;
97 },
98
99 /**
52 * @param {!WebInspector.SASSSupport.TextNode} css 100 * @param {!WebInspector.SASSSupport.TextNode} css
53 * @param {!WebInspector.SASSSupport.TextNode} sass 101 * @param {!WebInspector.SASSSupport.TextNode} sass
54 */ 102 */
55 mapCssToSass: function(css, sass) 103 mapCssToSass: function(css, sass)
56 { 104 {
57 this._cssToSass.set(css, sass); 105 this._cssToSass.set(css, sass);
58 this._sassToCss.set(sass, css); 106 this._sassToCss.set(sass, css);
59 }, 107 },
60 108
61 /** 109 /**
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 { 153 {
106 return this.toCSSNodes(sassProperty.name).map(name => name.parent); 154 return this.toCSSNodes(sassProperty.name).map(name => name.parent);
107 }, 155 },
108 156
109 /** 157 /**
110 * @param {!WebInspector.SASSSupport.ASTDiff} cssDiff 158 * @param {!WebInspector.SASSSupport.ASTDiff} cssDiff
111 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping} 159 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping}
112 */ 160 */
113 rebaseForCSSDiff: function(cssDiff) 161 rebaseForCSSDiff: function(cssDiff)
114 { 162 {
115 var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); 163 var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(css Diff.newAST, this._sassModels);
116 var cssNodes = this._cssToSass.keysArray(); 164 var cssNodes = this._cssToSass.keysArray();
117 for (var i = 0; i < cssNodes.length; ++i) { 165 for (var i = 0; i < cssNodes.length; ++i) {
118 var cssNode = cssNodes[i]; 166 var cssNode = cssNodes[i];
119 var sassNode = this._cssToSass.get(cssNode); 167 var sassNode = this._cssToSass.get(cssNode);
120 var mappedNode = cssDiff.mapping.get(cssNode); 168 var mappedNode = cssDiff.mapping.get(cssNode);
121 if (mappedNode && sassNode) 169 if (mappedNode && sassNode)
122 newMapping.mapCssToSass(mappedNode, sassNode); 170 newMapping.mapCssToSass(mappedNode, sassNode);
123 } 171 }
124 return newMapping; 172 return newMapping;
125 }, 173 },
126 174
127 /** 175 /**
128 * @param {!WebInspector.SASSSupport.ASTDiff} sassDiff 176 * @param {!WebInspector.SASSSupport.ASTDiff} sassDiff
129 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping} 177 * @return {!WebInspector.SASSLiveSourceMap.CSSToSASSMapping}
130 */ 178 */
131 rebaseForSASSDiff: function(sassDiff) 179 rebaseForSASSDiff: function(sassDiff)
132 { 180 {
133 var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); 181 var sassModels = new Map(this._sassModels);
182 sassModels.set(sassDiff.url, sassDiff.newAST);
183 var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(thi s._cssAST, sassModels);
134 var cssNodes = this._cssToSass.keysArray(); 184 var cssNodes = this._cssToSass.keysArray();
135 for (var i = 0; i < cssNodes.length; ++i) { 185 for (var i = 0; i < cssNodes.length; ++i) {
136 var cssNode = cssNodes[i]; 186 var cssNode = cssNodes[i];
137 var sassNode = this._cssToSass.get(cssNode); 187 var sassNode = this._cssToSass.get(cssNode);
138 var mappedNode = sassNode.document.url === sassDiff.url ? sassDiff.m apping.get(sassNode) : sassNode; 188 var mappedNode = sassNode.document.url === sassDiff.url ? sassDiff.m apping.get(sassNode) : sassNode;
139 if (mappedNode) 189 if (mappedNode)
140 newMapping.mapCssToSass(cssNode, mappedNode); 190 newMapping.mapCssToSass(cssNode, mappedNode);
141 } 191 }
142 return newMapping; 192 return newMapping;
143 }, 193 },
144 194
145 /** 195 /**
146 * @return {boolean} 196 * @return {boolean}
147 */ 197 */
148 isValid: function() 198 isValid: function()
149 { 199 {
150 var cssNodes = this._cssToSass.keysArray(); 200 var cssNodes = this._cssToSass.keysArray();
151 for (var i = 0; i < cssNodes.length; ++i) { 201 for (var i = 0; i < cssNodes.length; ++i) {
152 var cssNode = cssNodes[i]; 202 var cssNode = cssNodes[i];
153 if (!cssNode.parent || !(cssNode.parent instanceof WebInspector.SASS Support.Property)) 203 if (!cssNode.parent || !(cssNode.parent instanceof WebInspector.SASS Support.Property))
154 continue; 204 continue;
155 if (cssNode !== cssNode.parent.name) 205 if (cssNode !== cssNode.parent.name)
156 continue; 206 continue;
157 var sassNode = this._cssToSass.get(cssNode); 207 var sassNode = this._cssToSass.get(cssNode);
158 if (sassNode && cssNode.text.trim() !== sassNode.text.trim()) 208 if (sassNode && cssNode.text.trim() !== sassNode.text.trim())
159 return false; 209 return false;
160 } 210 }
161 return true; 211 return true;
162 } 212 },
dgozman 2016/01/27 23:14:04 revert
lushnikov 2016/01/28 00:04:29 Done.
163 } 213 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698