| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:io'; |
| |
| import 'package:dart2js_info/info.dart'; |
| |
| /// Modify [info] to fill in the text of code spans. |
| /// |
| /// By default, code spans contains the offsets but omit the text |
| /// (`CodeSpan.text` is null). This function reads the output files emitted by |
| /// dart2js to extract the code denoted by each span. |
| void injectText(AllInfo info) { |
| // Fill the text of each code span. The binary form produced by dart2js |
| // produces code spans, but excludes the orignal text |
| for (var f in info.functions) { |
| for (var span in f.code) { |
| _fillSpan(span, f.outputUnit!); |
| } |
| } |
| for (var f in info.fields) { |
| for (var span in f.code) { |
| _fillSpan(span, f.outputUnit!); |
| } |
| } |
| for (var c in info.constants) { |
| for (var span in c.code) { |
| _fillSpan(span, c.outputUnit!); |
| } |
| } |
| } |
| |
| Map<String, String> _cache = {}; |
| |
| _getContents(OutputUnitInfo unit) => _cache.putIfAbsent(unit.filename, () { |
| var uri = Uri.base.resolve(unit.filename); |
| return File.fromUri(uri).readAsStringSync(); |
| }); |
| |
| _fillSpan(CodeSpan span, OutputUnitInfo unit) { |
| if (span.text == null && span.start != null && span.end != 0) { |
| var contents = _getContents(unit); |
| span.text = contents.substring(span.start, span.end); |
| } |
| } |