OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.source_map_builder; | 5 library dart2js.source_map_builder; |
6 | 6 |
| 7 import 'package:kernel/ast.dart' show Location; |
7 import '../../compiler_new.dart' show OutputSink, OutputType; | 8 import '../../compiler_new.dart' show OutputSink, OutputType; |
8 import '../util/uri_extras.dart' show relativize; | 9 import '../util/uri_extras.dart' show relativize; |
9 import '../util/util.dart'; | 10 import '../util/util.dart'; |
10 import 'line_column_provider.dart'; | 11 import 'location_provider.dart'; |
11 import 'code_output.dart' show SourceLocationsProvider, SourceLocations; | 12 import 'code_output.dart' show SourceLocationsProvider, SourceLocations; |
12 import 'source_information.dart' show SourceLocation; | 13 import 'source_information.dart' show SourceLocation; |
13 | 14 |
14 class SourceMapBuilder { | 15 class SourceMapBuilder { |
15 final String version; | 16 final String version; |
16 | 17 |
17 /// The URI of the source map file. | 18 /// The URI of the source map file. |
18 final Uri sourceMapUri; | 19 final Uri sourceMapUri; |
19 | 20 |
20 /// The URI of the target language file. | 21 /// The URI of the target language file. |
21 final Uri targetFileUri; | 22 final Uri targetFileUri; |
22 | 23 |
23 final LineColumnProvider lineColumnProvider; | 24 final LocationProvider locationProvider; |
24 final List<SourceMapEntry> entries = new List<SourceMapEntry>(); | 25 final List<SourceMapEntry> entries = new List<SourceMapEntry>(); |
25 | 26 |
26 SourceMapBuilder(this.version, this.sourceMapUri, this.targetFileUri, | 27 SourceMapBuilder(this.version, this.sourceMapUri, this.targetFileUri, |
27 this.lineColumnProvider); | 28 this.locationProvider); |
28 | 29 |
29 void addMapping(int targetOffset, SourceLocation sourceLocation) { | 30 void addMapping(int targetOffset, SourceLocation sourceLocation) { |
30 entries.add(new SourceMapEntry(sourceLocation, targetOffset)); | 31 entries.add(new SourceMapEntry(sourceLocation, targetOffset)); |
31 } | 32 } |
32 | 33 |
33 void printStringListOn(Iterable<String> strings, StringBuffer buffer) { | 34 void printStringListOn(Iterable<String> strings, StringBuffer buffer) { |
34 bool first = true; | 35 bool first = true; |
35 buffer.write('['); | 36 buffer.write('['); |
36 for (String string in strings) { | 37 for (String string in strings) { |
37 if (!first) buffer.write(','); | 38 if (!first) buffer.write(','); |
38 buffer.write('"'); | 39 buffer.write('"'); |
39 writeJsonEscapedCharsOn(string, buffer); | 40 writeJsonEscapedCharsOn(string, buffer); |
40 buffer.write('"'); | 41 buffer.write('"'); |
41 first = false; | 42 first = false; |
42 } | 43 } |
43 buffer.write(']'); | 44 buffer.write(']'); |
44 } | 45 } |
45 | 46 |
46 String build() { | 47 String build() { |
47 LineColumnMap<SourceMapEntry> lineColumnMap = | 48 LineColumnMap<SourceMapEntry> lineColumnMap = |
48 new LineColumnMap<SourceMapEntry>(); | 49 new LineColumnMap<SourceMapEntry>(); |
49 Map<Uri, LineColumnMap<SourceMapEntry>> sourceLocationMap = | 50 Map<Uri, LineColumnMap<SourceMapEntry>> sourceLocationMap = |
50 <Uri, LineColumnMap<SourceMapEntry>>{}; | 51 <Uri, LineColumnMap<SourceMapEntry>>{}; |
51 entries.forEach((SourceMapEntry sourceMapEntry) { | 52 entries.forEach((SourceMapEntry sourceMapEntry) { |
52 int line = lineColumnProvider.getLine(sourceMapEntry.targetOffset); | 53 Location kernelLocation = |
53 int column = | 54 locationProvider.getLocation(sourceMapEntry.targetOffset); |
54 lineColumnProvider.getColumn(line, sourceMapEntry.targetOffset); | 55 int line = kernelLocation.line - 1; |
| 56 int column = kernelLocation.column - 1; |
55 lineColumnMap.add(line, column, sourceMapEntry); | 57 lineColumnMap.add(line, column, sourceMapEntry); |
56 | 58 |
57 SourceLocation location = sourceMapEntry.sourceLocation; | 59 SourceLocation location = sourceMapEntry.sourceLocation; |
58 if (location != null) { | 60 if (location != null) { |
59 if (location.sourceUri != null) { | 61 if (location.sourceUri != null) { |
60 LineColumnMap<SourceMapEntry> sourceLineColumnMap = | 62 LineColumnMap<SourceMapEntry> sourceLineColumnMap = |
61 sourceLocationMap.putIfAbsent(location.sourceUri, | 63 sourceLocationMap.putIfAbsent(location.sourceUri, |
62 () => new LineColumnMap<SourceMapEntry>()); | 64 () => new LineColumnMap<SourceMapEntry>()); |
63 sourceLineColumnMap.add( | 65 sourceLineColumnMap.add( |
64 location.line, location.column, sourceMapEntry); | 66 location.line, location.column, sourceMapEntry); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 String sourceMapFileName = relativize(fileUri, sourceMapUri, false); | 177 String sourceMapFileName = relativize(fileUri, sourceMapUri, false); |
176 return ''' | 178 return ''' |
177 | 179 |
178 //# sourceMappingURL=$sourceMapFileName | 180 //# sourceMappingURL=$sourceMapFileName |
179 '''; | 181 '''; |
180 } | 182 } |
181 return ''; | 183 return ''; |
182 } | 184 } |
183 | 185 |
184 /// Generates source map files for all [SourceLocations] in | 186 /// Generates source map files for all [SourceLocations] in |
185 /// [sourceLocationsProvider] for the .js code in [lineColumnProvider] | 187 /// [sourceLocationsProvider] for the .js code in [locationProvider] |
186 /// [sourceMapUri] is used to relativizes the URIs of the referenced source | 188 /// [sourceMapUri] is used to relativizes the URIs of the referenced source |
187 /// files and the target [fileUri]. [name] and [outputProvider] are used to | 189 /// files and the target [fileUri]. [name] and [outputProvider] are used to |
188 /// create the [OutputSink] for the source map text. | 190 /// create the [OutputSink] for the source map text. |
189 static void outputSourceMap( | 191 static void outputSourceMap( |
190 SourceLocationsProvider sourceLocationsProvider, | 192 SourceLocationsProvider sourceLocationsProvider, |
191 LineColumnProvider lineColumnProvider, | 193 LocationProvider locationProvider, |
192 String name, | 194 String name, |
193 Uri sourceMapUri, | 195 Uri sourceMapUri, |
194 Uri fileUri, | 196 Uri fileUri, |
195 OutputSink outputProvider( | 197 OutputSink outputProvider( |
196 String name, String extension, OutputType type)) { | 198 String name, String extension, OutputType type)) { |
197 // Create a source file for the compilation output. This allows using | 199 // Create a source file for the compilation output. This allows using |
198 // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder]. | 200 // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder]. |
199 int index = 0; | 201 int index = 0; |
200 sourceLocationsProvider.sourceLocations | 202 sourceLocationsProvider.sourceLocations |
201 .forEach((SourceLocations sourceLocations) { | 203 .forEach((SourceLocations sourceLocations) { |
202 SourceMapBuilder sourceMapBuilder = new SourceMapBuilder( | 204 SourceMapBuilder sourceMapBuilder = new SourceMapBuilder( |
203 sourceLocations.name, sourceMapUri, fileUri, lineColumnProvider); | 205 sourceLocations.name, sourceMapUri, fileUri, locationProvider); |
204 sourceLocations.forEachSourceLocation(sourceMapBuilder.addMapping); | 206 sourceLocations.forEachSourceLocation(sourceMapBuilder.addMapping); |
205 String sourceMap = sourceMapBuilder.build(); | 207 String sourceMap = sourceMapBuilder.build(); |
206 String extension = 'js.map'; | 208 String extension = 'js.map'; |
207 if (index > 0) { | 209 if (index > 0) { |
208 if (name == '') { | 210 if (name == '') { |
209 name = fileUri != null ? fileUri.pathSegments.last : 'out.js'; | 211 name = fileUri != null ? fileUri.pathSegments.last : 'out.js'; |
210 extension = 'map.${sourceLocations.name}'; | 212 extension = 'map.${sourceLocations.name}'; |
211 } else { | 213 } else { |
212 extension = 'js.map.${sourceLocations.name}'; | 214 extension = 'js.map.${sourceLocations.name}'; |
213 } | 215 } |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 int register(T element) { | 356 int register(T element) { |
355 return map.putIfAbsent(element, () => map.length); | 357 return map.putIfAbsent(element, () => map.length); |
356 } | 358 } |
357 | 359 |
358 /// Returns the index of [element]. | 360 /// Returns the index of [element]. |
359 int operator [](T element) => map[element]; | 361 int operator [](T element) => map[element]; |
360 | 362 |
361 /// Returns the indexed elements. | 363 /// Returns the indexed elements. |
362 Iterable<T> get elements => map.keys; | 364 Iterable<T> get elements => map.keys; |
363 } | 365 } |
OLD | NEW |