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