| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 * @implements {WebInspector.SourceMapFactory} | 5 * @implements {SDK.SourceMapFactory} |
| 6 * @unrestricted | 6 * @unrestricted |
| 7 */ | 7 */ |
| 8 WebInspector.SASSSourceMapFactory = class { | 8 Sass.SASSSourceMapFactory = class { |
| 9 constructor() { | 9 constructor() { |
| 10 this._astService = new WebInspector.ASTService(); | 10 this._astService = new Sass.ASTService(); |
| 11 } | 11 } |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * @override | 14 * @override |
| 15 * @param {!WebInspector.Target} target | 15 * @param {!SDK.Target} target |
| 16 * @param {!WebInspector.SourceMap} sourceMap | 16 * @param {!SDK.SourceMap} sourceMap |
| 17 * @return {!Promise<?WebInspector.SourceMap>} | 17 * @return {!Promise<?SDK.SourceMap>} |
| 18 */ | 18 */ |
| 19 editableSourceMap(target, sourceMap) { | 19 editableSourceMap(target, sourceMap) { |
| 20 var cssModel = WebInspector.CSSModel.fromTarget(target); | 20 var cssModel = SDK.CSSModel.fromTarget(target); |
| 21 if (!cssModel) | 21 if (!cssModel) |
| 22 return Promise.resolve(/** @type {?WebInspector.SourceMap} */ (null)); | 22 return Promise.resolve(/** @type {?SDK.SourceMap} */ (null)); |
| 23 | 23 |
| 24 var header = | 24 var header = |
| 25 cssModel.styleSheetHeaders().find(styleSheetHeader => styleSheetHeader.s
ourceMapURL === sourceMap.url()); | 25 cssModel.styleSheetHeaders().find(styleSheetHeader => styleSheetHeader.s
ourceMapURL === sourceMap.url()); |
| 26 if (!header) | 26 if (!header) |
| 27 return Promise.resolve(/** @type {?WebInspector.SourceMap} */ (null)); | 27 return Promise.resolve(/** @type {?SDK.SourceMap} */ (null)); |
| 28 | 28 |
| 29 /** @type {!Map<string, !WebInspector.SASSSupport.AST>} */ | 29 /** @type {!Map<string, !Sass.SASSSupport.AST>} */ |
| 30 var models = new Map(); | 30 var models = new Map(); |
| 31 var promises = []; | 31 var promises = []; |
| 32 for (let url of sourceMap.sourceURLs()) { | 32 for (let url of sourceMap.sourceURLs()) { |
| 33 var contentProvider = sourceMap.sourceContentProvider(url, WebInspector.re
sourceTypes.SourceMapStyleSheet); | 33 var contentProvider = sourceMap.sourceContentProvider(url, Common.resource
Types.SourceMapStyleSheet); |
| 34 var sassPromise = contentProvider.requestContent() | 34 var sassPromise = contentProvider.requestContent() |
| 35 .then(text => this._astService.parseSCSS(url, text |
| '')) | 35 .then(text => this._astService.parseSCSS(url, text |
| '')) |
| 36 .then(ast => models.set(ast.document.url, ast)); | 36 .then(ast => models.set(ast.document.url, ast)); |
| 37 promises.push(sassPromise); | 37 promises.push(sassPromise); |
| 38 } | 38 } |
| 39 var cssURL = sourceMap.compiledURL(); | 39 var cssURL = sourceMap.compiledURL(); |
| 40 var cssPromise = header.originalContentProvider() | 40 var cssPromise = header.originalContentProvider() |
| 41 .requestContent() | 41 .requestContent() |
| 42 .then(text => this._astService.parseCSS(cssURL, text ||
'')) | 42 .then(text => this._astService.parseCSS(cssURL, text ||
'')) |
| 43 .then(ast => models.set(ast.document.url, ast)); | 43 .then(ast => models.set(ast.document.url, ast)); |
| 44 promises.push(cssPromise); | 44 promises.push(cssPromise); |
| 45 | 45 |
| 46 return Promise.all(promises) | 46 return Promise.all(promises) |
| 47 .then(this._onSourcesParsed.bind(this, sourceMap, models)) | 47 .then(this._onSourcesParsed.bind(this, sourceMap, models)) |
| 48 .catchException(/** @type {?WebInspector.SourceMap} */ (null)); | 48 .catchException(/** @type {?SDK.SourceMap} */ (null)); |
| 49 } | 49 } |
| 50 | 50 |
| 51 /** | 51 /** |
| 52 * @param {!WebInspector.SourceMap} sourceMap | 52 * @param {!SDK.SourceMap} sourceMap |
| 53 * @param {!Map<string, !WebInspector.SASSSupport.AST>} models | 53 * @param {!Map<string, !Sass.SASSSupport.AST>} models |
| 54 * @return {?WebInspector.SourceMap} | 54 * @return {?SDK.SourceMap} |
| 55 */ | 55 */ |
| 56 _onSourcesParsed(sourceMap, models) { | 56 _onSourcesParsed(sourceMap, models) { |
| 57 var editCallback = WebInspector.SASSProcessor.processCSSEdits.bind(WebInspec
tor.SASSProcessor, this._astService); | 57 var editCallback = Sass.SASSProcessor.processCSSEdits.bind(Sass.SASSProcesso
r, this._astService); |
| 58 var map = new WebInspector.ASTSourceMap(sourceMap.compiledURL(), sourceMap.u
rl(), models, editCallback); | 58 var map = new Sass.ASTSourceMap(sourceMap.compiledURL(), sourceMap.url(), mo
dels, editCallback); |
| 59 var valid = true; | 59 var valid = true; |
| 60 map.compiledModel().visit(onNode); | 60 map.compiledModel().visit(onNode); |
| 61 return valid ? map : null; | 61 return valid ? map : null; |
| 62 | 62 |
| 63 /** | 63 /** |
| 64 * @param {!WebInspector.SASSSupport.Node} cssNode | 64 * @param {!Sass.SASSSupport.Node} cssNode |
| 65 */ | 65 */ |
| 66 function onNode(cssNode) { | 66 function onNode(cssNode) { |
| 67 if (!valid) | 67 if (!valid) |
| 68 return; | 68 return; |
| 69 if (!(cssNode instanceof WebInspector.SASSSupport.TextNode)) | 69 if (!(cssNode instanceof Sass.SASSSupport.TextNode)) |
| 70 return; | 70 return; |
| 71 var entry = sourceMap.findEntry(cssNode.range.startLine, cssNode.range.sta
rtColumn); | 71 var entry = sourceMap.findEntry(cssNode.range.startLine, cssNode.range.sta
rtColumn); |
| 72 if (!entry || !entry.sourceURL || typeof entry.sourceLineNumber === 'undef
ined' || | 72 if (!entry || !entry.sourceURL || typeof entry.sourceLineNumber === 'undef
ined' || |
| 73 typeof entry.sourceColumnNumber === 'undefined') | 73 typeof entry.sourceColumnNumber === 'undefined') |
| 74 return; | 74 return; |
| 75 var sassAST = models.get(entry.sourceURL); | 75 var sassAST = models.get(entry.sourceURL); |
| 76 if (!sassAST) | 76 if (!sassAST) |
| 77 return; | 77 return; |
| 78 var sassNode = sassAST.findNodeForPosition(entry.sourceLineNumber, entry.s
ourceColumnNumber); | 78 var sassNode = sassAST.findNodeForPosition(entry.sourceLineNumber, entry.s
ourceColumnNumber); |
| 79 if (!sassNode) | 79 if (!sassNode) |
| 80 return; | 80 return; |
| 81 if (cssNode.parent && (cssNode.parent instanceof WebInspector.SASSSupport.
Property) && | 81 if (cssNode.parent && (cssNode.parent instanceof Sass.SASSSupport.Property
) && |
| 82 cssNode === cssNode.parent.name && cssNode.text.trim() !== sassNode.te
xt.trim()) { | 82 cssNode === cssNode.parent.name && cssNode.text.trim() !== sassNode.te
xt.trim()) { |
| 83 valid = false; | 83 valid = false; |
| 84 reportError(cssNode, sassNode); | 84 reportError(cssNode, sassNode); |
| 85 return; | 85 return; |
| 86 } | 86 } |
| 87 map.addMapping(cssNode, sassNode); | 87 map.addMapping(cssNode, sassNode); |
| 88 } | 88 } |
| 89 | 89 |
| 90 /** | 90 /** |
| 91 * @param {!WebInspector.SASSSupport.TextNode} cssNode | 91 * @param {!Sass.SASSSupport.TextNode} cssNode |
| 92 * @param {!WebInspector.SASSSupport.TextNode} sassNode | 92 * @param {!Sass.SASSSupport.TextNode} sassNode |
| 93 */ | 93 */ |
| 94 function reportError(cssNode, sassNode) { | 94 function reportError(cssNode, sassNode) { |
| 95 var text = WebInspector.UIString('LiveSASS failed to start: %s', sourceMap
.url()); | 95 var text = Common.UIString('LiveSASS failed to start: %s', sourceMap.url()
); |
| 96 text += WebInspector.UIString('\nSourceMap is misaligned: %s != %s', cssNo
de.text.trim(), sassNode.text.trim()); | 96 text += Common.UIString('\nSourceMap is misaligned: %s != %s', cssNode.tex
t.trim(), sassNode.text.trim()); |
| 97 text += '\ncompiled: ' + cssNode.document.url + ':' + (cssNode.range.start
Line + 1) + ':' + | 97 text += '\ncompiled: ' + cssNode.document.url + ':' + (cssNode.range.start
Line + 1) + ':' + |
| 98 (cssNode.range.startColumn + 1); | 98 (cssNode.range.startColumn + 1); |
| 99 text += '\nsource: ' + sassNode.document.url + ':' + (sassNode.range.start
Line + 1) + ':' + | 99 text += '\nsource: ' + sassNode.document.url + ':' + (sassNode.range.start
Line + 1) + ':' + |
| 100 (sassNode.range.startColumn + 1); | 100 (sassNode.range.startColumn + 1); |
| 101 WebInspector.console.error(text); | 101 Common.console.error(text); |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 }; | 104 }; |
| OLD | NEW |