Index: pkg/source_maps/lib/printer.dart |
diff --git a/pkg/source_maps/lib/printer.dart b/pkg/source_maps/lib/printer.dart |
deleted file mode 100644 |
index 906e260f8953860d544abb1b1253cd5eb1b62ac9..0000000000000000000000000000000000000000 |
--- a/pkg/source_maps/lib/printer.dart |
+++ /dev/null |
@@ -1,252 +0,0 @@ |
-// Copyright (c) 2013, 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. |
- |
-/// Contains a code printer that generates code by recording the source maps. |
-library source_maps.printer; |
- |
-import 'package:source_span/source_span.dart'; |
- |
-import 'builder.dart'; |
-import 'src/source_map_span.dart'; |
- |
-const int _LF = 10; |
-const int _CR = 13; |
- |
-/// A simple printer that keeps track of offset locations and records source |
-/// maps locations. |
-class Printer { |
- final String filename; |
- final StringBuffer _buff = new StringBuffer(); |
- final SourceMapBuilder _maps = new SourceMapBuilder(); |
- String get text => _buff.toString(); |
- String get map => _maps.toJson(filename); |
- |
- /// Current source location mapping. |
- SourceLocation _loc; |
- |
- /// Current line in the buffer; |
- int _line = 0; |
- |
- /// Current column in the buffer. |
- int _column = 0; |
- |
- Printer(this.filename); |
- |
- /// Add [str] contents to the output, tracking new lines to track correct |
- /// positions for span locations. When [projectMarks] is true, this method |
- /// adds a source map location on each new line, projecting that every new |
- /// line in the target file (printed here) corresponds to a new line in the |
- /// source file. |
- void add(String str, {projectMarks: false}) { |
- var chars = str.runes.toList(); |
- var length = chars.length; |
- for (int i = 0; i < length; i++) { |
- var c = chars[i]; |
- if (c == _LF || (c == _CR && (i + 1 == length || chars[i + 1] != _LF))) { |
- // Return not followed by line-feed is treated as a new line. |
- _line++; |
- _column = 0; |
- if (projectMarks && _loc != null) { |
- if (_loc is FileLocation) { |
- var file = (_loc as FileLocation).file; |
- mark(file.location(file.getOffset(_loc.line + 1))); |
- } else { |
- mark(new SourceLocation(0, |
- sourceUrl: _loc.sourceUrl, line: _loc.line + 1, column: 0)); |
- } |
- } |
- } else { |
- _column++; |
- } |
- } |
- _buff.write(str); |
- } |
- |
- |
- /// Append a [total] number of spaces in the target file. Typically used for |
- /// formatting indentation. |
- void addSpaces(int total) { |
- for (int i = 0; i < total; i++) _buff.write(' '); |
- _column += total; |
- } |
- |
- /// Marks that the current point in the target file corresponds to the [mark] |
- /// in the source file, which can be either a [SourceLocation] or a |
- /// [SourceSpan]. When the mark is a [SourceMapSpan] with `isIdentifier` set, |
- /// this also records the name of the identifier in the source map |
- /// information. |
- void mark(mark) { |
- var loc; |
- var identifier = null; |
- if (mark is SourceLocation) { |
- loc = mark; |
- } else if (mark is SourceSpan) { |
- loc = mark.start; |
- if (mark is SourceMapSpan && mark.isIdentifier) identifier = mark.text; |
- } |
- _maps.addLocation( |
- loc, |
- new SourceLocation(_buff.length, line: _line, column: _column), |
- identifier); |
- _loc = loc; |
- } |
-} |
- |
-/// A more advanced printer that keeps track of offset locations to record |
-/// source maps, but additionally allows nesting of different kind of items, |
-/// including [NestedPrinter]s, and it let's you automatically indent text. |
-/// |
-/// This class is especially useful when doing code generation, where different |
-/// peices of the code are generated independently on separate printers, and are |
-/// finally put together in the end. |
-class NestedPrinter implements NestedItem { |
- |
- /// Items recoded by this printer, which can be [String] literals, |
- /// [NestedItem]s, and source map information like [SourceLocation] and |
- /// [SourceSpan]. |
- List _items = []; |
- |
- /// Internal buffer to merge consecutive strings added to this printer. |
- StringBuffer _buff; |
- |
- /// Current indentation, which can be updated from outside this class. |
- int indent; |
- |
- /// Item used to indicate that the following item is copied from the original |
- /// source code, and hence we should preserve source-maps on every new line. |
- static final _ORIGINAL = new Object(); |
- |
- NestedPrinter([this.indent = 0]); |
- |
- /// Adds [object] to this printer. [object] can be a [String], |
- /// [NestedPrinter], or anything implementing [NestedItem]. If [object] is a |
- /// [String], the value is appended directly, without doing any formatting |
- /// changes. If you wish to add a line of code with automatic indentation, use |
- /// [addLine] instead. [NestedPrinter]s and [NestedItem]s are not processed |
- /// until [build] gets called later on. We ensure that [build] emits every |
- /// object in the order that they were added to this printer. |
- /// |
- /// The [location] and [span] parameters indicate the corresponding source map |
- /// location of [object] in the original input. Only one, [location] or |
- /// [span], should be provided at a time. |
- /// |
- /// Indicate [isOriginal] when [object] is copied directly from the user code. |
- /// Setting [isOriginal] will make this printer propagate source map locations |
- /// on every line-break. |
- void add(object, {SourceLocation location, SourceSpan span, |
- bool isOriginal: false}) { |
- if (object is! String || location != null || span != null || isOriginal) { |
- _flush(); |
- assert(location == null || span == null); |
- if (location != null) _items.add(location); |
- if (span != null) _items.add(span); |
- if (isOriginal) _items.add(_ORIGINAL); |
- } |
- |
- if (object is String) { |
- _appendString(object); |
- } else { |
- _items.add(object); |
- } |
- } |
- |
- /// Append `2 * indent` spaces to this printer. |
- void insertIndent() => _indent(indent); |
- |
- /// Add a [line], autoindenting to the current value of [indent]. Note, |
- /// indentation is not inferred from the contents added to this printer. If a |
- /// line starts or ends an indentation block, you need to also update [indent] |
- /// accordingly. Also, indentation is not adapted for nested printers. If |
- /// you add a [NestedPrinter] to this printer, its indentation is set |
- /// separately and will not include any the indentation set here. |
- /// |
- /// The [location] and [span] parameters indicate the corresponding source map |
- /// location of [object] in the original input. Only one, [location] or |
- /// [span], should be provided at a time. |
- void addLine(String line, {SourceLocation location, SourceSpan span}) { |
- if (location != null || span != null) { |
- _flush(); |
- assert(location == null || span == null); |
- if (location != null) _items.add(location); |
- if (span != null) _items.add(span); |
- } |
- if (line == null) return; |
- if (line != '') { |
- // We don't indent empty lines. |
- _indent(indent); |
- _appendString(line); |
- } |
- _appendString('\n'); |
- } |
- |
- /// Appends a string merging it with any previous strings, if possible. |
- void _appendString(String s) { |
- if (_buff == null) _buff = new StringBuffer(); |
- _buff.write(s); |
- } |
- |
- /// Adds all of the current [_buff] contents as a string item. |
- void _flush() { |
- if (_buff != null) { |
- _items.add(_buff.toString()); |
- _buff = null; |
- } |
- } |
- |
- void _indent(int indent) { |
- for (int i = 0; i < indent; i++) _appendString(' '); |
- } |
- |
- /// Returns a string representation of all the contents appended to this |
- /// printer, including source map location tokens. |
- String toString() { |
- _flush(); |
- return (new StringBuffer()..writeAll(_items)).toString(); |
- } |
- |
- /// [Printer] used during the last call to [build], if any. |
- Printer printer; |
- |
- /// Returns the text produced after calling [build]. |
- String get text => printer.text; |
- |
- /// Returns the source-map information produced after calling [build]. |
- String get map => printer.map; |
- |
- /// Builds the output of this printer and source map information. After |
- /// calling this function, you can use [text] and [map] to retrieve the |
- /// geenrated code and source map information, respectively. |
- void build(String filename) { |
- writeTo(printer = new Printer(filename)); |
- } |
- |
- /// Implements the [NestedItem] interface. |
- void writeTo(Printer printer) { |
- _flush(); |
- bool propagate = false; |
- for (var item in _items) { |
- if (item is NestedItem) { |
- item.writeTo(printer); |
- } else if (item is String) { |
- printer.add(item, projectMarks: propagate); |
- propagate = false; |
- } else if (item is SourceLocation || item is SourceSpan) { |
- printer.mark(item); |
- } else if (item == _ORIGINAL) { |
- // we insert booleans when we are about to quote text that was copied |
- // from the original source. In such case, we will propagate marks on |
- // every new-line. |
- propagate = true; |
- } else { |
- throw new UnsupportedError('Unknown item type: $item'); |
- } |
- } |
- } |
-} |
- |
-/// An item added to a [NestedPrinter]. |
-abstract class NestedItem { |
- /// Write the contents of this item into [printer]. |
- void writeTo(Printer printer); |
-} |