Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: pkg/source_maps/lib/printer.dart

Issue 12207008: Move source maps package to the dart repo, so it can be used by other internal (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: updates Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/source_maps/lib/parser.dart ('k') | pkg/source_maps/lib/source_maps.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/source_maps/lib/printer.dart
diff --git a/pkg/source_maps/lib/printer.dart b/pkg/source_maps/lib/printer.dart
new file mode 100644
index 0000000000000000000000000000000000000000..333aadcd429c4e951c0aef2c78a2f47db287e442
--- /dev/null
+++ b/pkg/source_maps/lib/printer.dart
@@ -0,0 +1,89 @@
+// 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 'dart:utf' show stringToCodepoints;
+import 'builder.dart';
+import 'span.dart';
+
+const int _LF = 10;
+const int _CR = 13;
+
+/// A 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.
+ Location _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 = stringToCodepoints(str);
+ 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 FixedLocation) {
+ mark(new FixedLocation(0, _loc.sourceUrl, _loc.line + 1, 0));
+ } else if (_loc is FileLocation) {
+ var file = (_loc as FileLocation).file;
+ mark(new FileLocation(file, file.getOffset(_loc.line + 1, 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 [Location] or a [Span]. When the
+ /// mark is an identifier's Span, this also records the name of the identifier
+ /// in the source map information.
+ void mark(mark) {
+ var loc;
+ var identifier = null;
+ if (mark is Location) {
+ loc = mark;
+ } else if (mark is Span) {
+ loc = mark.start;
+ if (mark.isIdentifier) identifier = mark.text;
+ }
+ _maps.addLocation(loc,
+ new FixedLocation(_buff.length, null, _line, _column), identifier);
+ _loc = loc;
+ }
+}
« no previous file with comments | « pkg/source_maps/lib/parser.dart ('k') | pkg/source_maps/lib/source_maps.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698