Index: sdk/lib/_internal/compiler/implementation/source_map_builder.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart |
index 3910615899285e634f082a70081b575ca00e45fe..16697e940c4ed3e4f79e4352b8a6642dd3aeb62e 100644 |
--- a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart |
+++ b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart |
@@ -20,6 +20,7 @@ class SourceMapBuilder { |
final Uri uri; |
final Uri fileUri; |
+ SourceFile targetFile; |
List<SourceMapEntry> entries; |
Map<String, int> sourceUrlMap; |
@@ -35,7 +36,7 @@ class SourceMapBuilder { |
int previousSourceNameIndex; |
bool firstEntryInLine; |
- SourceMapBuilder(this.uri, this.fileUri) { |
+ SourceMapBuilder(this.uri, this.fileUri, this.targetFile) { |
entries = new List<SourceMapEntry>(); |
sourceUrlMap = new Map<String, int>(); |
@@ -52,7 +53,59 @@ class SourceMapBuilder { |
firstEntryInLine = true; |
} |
+ resetPreviousSourceLocation() { |
+ previousSourceUrlIndex = 0; |
+ previousSourceLine = 0; |
+ previousSourceColumn = 0; |
+ previousSourceNameIndex = 0; |
+ } |
+ |
+ updatePreviousSourceLocation(SourceFileLocation sourceLocation) { |
+ previousSourceLine = sourceLocation.getLine(); |
+ previousSourceColumn = sourceLocation.getColumn(); |
+ String sourceUrl = sourceLocation.getSourceUrl(); |
+ previousSourceUrlIndex = indexOf(sourceUrlList, sourceUrl, sourceUrlMap); |
+ String sourceName = sourceLocation.getSourceName(); |
+ if (sourceName != null) { |
+ previousSourceNameIndex = |
+ indexOf(sourceNameList, sourceName, sourceNameMap); |
+ } |
+ } |
+ |
+ bool sameAsPreviousLocation(SourceFileLocation sourceLocation) { |
+ if (sourceLocation == null) { |
+ return true; |
+ } |
+ int sourceUrlIndex = |
+ indexOf(sourceUrlList, sourceLocation.getSourceUrl(), sourceUrlMap); |
+ return |
+ sourceUrlIndex == previousSourceUrlIndex && |
+ sourceLocation.getLine() == previousSourceLine && |
+ sourceLocation.getColumn() == previousSourceColumn; |
+ } |
+ |
void addMapping(int targetOffset, SourceFileLocation sourceLocation) { |
+ |
+ bool sameLine(int position, otherPosition) { |
+ return targetFile.getLine(position) == targetFile.getLine(otherPosition); |
+ } |
+ |
+ if (!entries.isEmpty && sameLine(targetOffset, entries.last.targetOffset)) { |
+ if (sameAsPreviousLocation(sourceLocation)) { |
+ // The entry points to the same source location as the previous entry in |
+ // the same line, hence it is not needed for the source map. |
+ // |
+ // TODO(zarah): Remove this check and make sure that [addMapping] is not |
+ // called for this position. Instead, when consecutive lines in the |
+ // generated code point to the same source location, record this and use |
+ // it to generate the entries of the source map. |
+ return; |
+ } |
+ } |
+ |
+ if (sourceLocation != null) { |
+ updatePreviousSourceLocation(sourceLocation); |
+ } |
entries.add(new SourceMapEntry(sourceLocation, targetOffset)); |
} |
@@ -69,7 +122,8 @@ class SourceMapBuilder { |
buffer.write(']'); |
} |
- String build(SourceFile targetFile) { |
+ String build() { |
+ resetPreviousSourceLocation(); |
StringBuffer mappingsBuffer = new StringBuffer(); |
entries.forEach((SourceMapEntry entry) => writeEntry(entry, targetFile, |
mappingsBuffer)); |
@@ -127,12 +181,9 @@ class SourceMapBuilder { |
int sourceUrlIndex = indexOf(sourceUrlList, sourceUrl, sourceUrlMap); |
encodeVLQ(output, sourceUrlIndex - previousSourceUrlIndex); |
- previousSourceUrlIndex = sourceUrlIndex; |
- |
encodeVLQ(output, sourceLine - previousSourceLine); |
- previousSourceLine = sourceLine; |
encodeVLQ(output, sourceColumn - previousSourceColumn); |
- previousSourceColumn = sourceColumn; |
+ updatePreviousSourceLocation(entry.sourceLocation); |
if (sourceName == null) { |
return; |
@@ -140,7 +191,7 @@ class SourceMapBuilder { |
int sourceNameIndex = indexOf(sourceNameList, sourceName, sourceNameMap); |
encodeVLQ(output, sourceNameIndex - previousSourceNameIndex); |
- previousSourceNameIndex = sourceNameIndex; |
+ |
} |
int indexOf(List<String> list, String value, Map<String, int> map) { |