Chromium Code Reviews| 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 |