OLD | NEW |
---|---|
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 Loading... | |
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 } |
OLD | NEW |