OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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_information; | 5 library dart2js.source_information; |
6 | 6 |
7 import '../dart2jslib.dart' show SourceSpan; | 7 import '../dart2jslib.dart' show SourceSpan; |
8 import '../elements/elements.dart' show AstElement; | 8 import '../elements/elements.dart' show AstElement; |
9 import '../scanner/scannerlib.dart' show Token; | 9 import '../scanner/scannerlib.dart' show Token; |
10 import '../tree/tree.dart' show Node; | 10 import '../tree/tree.dart' show Node; |
11 import '../js/js.dart' show JavaScriptNodeSourceInformation; | 11 import '../js/js.dart' show JavaScriptNodeSourceInformation; |
12 import 'code_output.dart'; | |
13 import 'source_file.dart'; | 12 import 'source_file.dart'; |
14 | 13 |
15 /// Interface for passing source information, for instance for use in source | 14 /// Interface for passing source information, for instance for use in source |
16 /// maps, through the backend. | 15 /// maps, through the backend. |
17 abstract class SourceInformation extends JavaScriptNodeSourceInformation { | 16 abstract class SourceInformation extends JavaScriptNodeSourceInformation { |
18 SourceSpan get sourceSpan; | 17 SourceSpan get sourceSpan; |
19 void beginMapping(CodeOutput output); | 18 |
20 void endMapping(CodeOutput output); | 19 /// The source location associated with the start of the JS node. |
| 20 SourceLocation get startPosition; |
| 21 |
| 22 /// The source location associated with the end of the JS node. |
| 23 SourceLocation get endPosition; |
21 } | 24 } |
22 | 25 |
23 /// Source information that contains start source position and optionally an | 26 /// Source information that contains start source position and optionally an |
24 /// end source position. | 27 /// end source position. |
25 class StartEndSourceInformation implements SourceInformation { | 28 class StartEndSourceInformation implements SourceInformation { |
26 final SourceLocation startPosition; | 29 final SourceLocation startPosition; |
27 final SourceLocation endPosition; | 30 final SourceLocation endPosition; |
28 | 31 |
29 StartEndSourceInformation(this.startPosition, [this.endPosition]); | 32 StartEndSourceInformation(this.startPosition, [this.endPosition]); |
30 | 33 |
31 SourceSpan get sourceSpan { | 34 SourceSpan get sourceSpan { |
32 Uri uri = startPosition.sourceUri; | 35 Uri uri = startPosition.sourceUri; |
33 int begin = startPosition.offset; | 36 int begin = startPosition.offset; |
34 int end = endPosition == null ? begin : endPosition.offset; | 37 int end = endPosition == null ? begin : endPosition.offset; |
35 return new SourceSpan(uri, begin, end); | 38 return new SourceSpan(uri, begin, end); |
36 } | 39 } |
37 | 40 |
38 void beginMapping(CodeBuffer output) { | |
39 output.beginMappedRange(); | |
40 output.setSourceLocation(startPosition); | |
41 } | |
42 | |
43 void endMapping(CodeBuffer output) { | |
44 if (endPosition != null) { | |
45 output.setSourceLocation(endPosition); | |
46 } | |
47 output.endMappedRange(); | |
48 } | |
49 | |
50 int get hashCode { | 41 int get hashCode { |
51 return (startPosition.hashCode * 17 + | 42 return (startPosition.hashCode * 17 + |
52 endPosition.hashCode * 19) | 43 endPosition.hashCode * 19) |
53 & 0x7FFFFFFF; | 44 & 0x7FFFFFFF; |
54 } | 45 } |
55 | 46 |
56 bool operator ==(other) { | 47 bool operator ==(other) { |
57 if (identical(this, other)) return true; | 48 if (identical(this, other)) return true; |
58 if (other is! StartEndSourceInformation) return false; | 49 if (other is! StartEndSourceInformation) return false; |
59 return startPosition == other.startPosition && | 50 return startPosition == other.startPosition && |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 } | 95 } |
105 } | 96 } |
106 | 97 |
107 /// [SourceInformation] that consists of an offset position into the source | 98 /// [SourceInformation] that consists of an offset position into the source |
108 /// code. | 99 /// code. |
109 class PositionSourceInformation implements SourceInformation { | 100 class PositionSourceInformation implements SourceInformation { |
110 final SourceLocation sourcePosition; | 101 final SourceLocation sourcePosition; |
111 | 102 |
112 PositionSourceInformation(this.sourcePosition); | 103 PositionSourceInformation(this.sourcePosition); |
113 | 104 |
114 @override | 105 SourceLocation get startPosition => sourcePosition; |
115 void beginMapping(CodeOutput output) { | 106 SourceLocation get endPosition => null; |
116 output.setSourceLocation(sourcePosition); | |
117 } | |
118 | |
119 @override | |
120 void endMapping(CodeOutput output) { | |
121 // Do nothing. | |
122 } | |
123 | 107 |
124 SourceSpan get sourceSpan { | 108 SourceSpan get sourceSpan { |
125 Uri uri = sourcePosition.sourceUri; | 109 Uri uri = sourcePosition.sourceUri; |
126 int offset = sourcePosition.offset; | 110 int offset = sourcePosition.offset; |
127 return new SourceSpan(uri, offset, offset); | 111 return new SourceSpan(uri, offset, offset); |
128 } | 112 } |
129 | 113 |
130 int get hashCode { | 114 int get hashCode { |
131 return sourcePosition.hashCode * 17 & 0x7FFFFFFF; | 115 return sourcePosition.hashCode * 17 & 0x7FFFFFFF; |
132 } | 116 } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 TokenSourceLocation(SourceFile sourceFile, this.token, this.sourceName) | 187 TokenSourceLocation(SourceFile sourceFile, this.token, this.sourceName) |
204 : super(sourceFile); | 188 : super(sourceFile); |
205 | 189 |
206 @override | 190 @override |
207 int get offset => token.charOffset; | 191 int get offset => token.charOffset; |
208 | 192 |
209 String toString() { | 193 String toString() { |
210 return '${super.toString()}:$sourceName'; | 194 return '${super.toString()}:$sourceName'; |
211 } | 195 } |
212 } | 196 } |
OLD | NEW |