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 /// Source information system that maps spans of Dart AST nodes to spans of | 5 /// Source information system that maps spans of Dart AST nodes to spans of |
6 /// JavaScript nodes. | 6 /// JavaScript nodes. |
7 | 7 |
8 library dart2js.source_information.start_end; | 8 library dart2js.source_information.start_end; |
9 | 9 |
10 import '../common.dart'; | 10 import '../common.dart'; |
11 import '../diagnostics/messages.dart' show | 11 import '../diagnostics/messages.dart' show MessageTemplate; |
12 MessageTemplate; | 12 import '../elements/elements.dart' show AstElement, LocalElement; |
13 import '../elements/elements.dart' show | |
14 AstElement, | |
15 LocalElement; | |
16 import '../js/js.dart' as js; | 13 import '../js/js.dart' as js; |
17 import '../js/js_source_mapping.dart'; | 14 import '../js/js_source_mapping.dart'; |
18 import '../tokens/token.dart' show Token; | 15 import '../tokens/token.dart' show Token; |
19 import '../tree/tree.dart' show Node, Send; | 16 import '../tree/tree.dart' show Node, Send; |
20 | 17 |
21 import 'source_file.dart'; | 18 import 'source_file.dart'; |
22 import 'source_information.dart'; | 19 import 'source_information.dart'; |
23 | 20 |
24 /// Source information that contains start source position and optionally an | 21 /// Source information that contains start source position and optionally an |
25 /// end source position. | 22 /// end source position. |
(...skipping 18 matching lines...) Expand all Loading... |
44 @override | 41 @override |
45 SourceSpan get sourceSpan { | 42 SourceSpan get sourceSpan { |
46 Uri uri = startPosition.sourceUri; | 43 Uri uri = startPosition.sourceUri; |
47 int begin = startPosition.offset; | 44 int begin = startPosition.offset; |
48 int end = endPosition == null ? begin : endPosition.offset; | 45 int end = endPosition == null ? begin : endPosition.offset; |
49 return new SourceSpan(uri, begin, end); | 46 return new SourceSpan(uri, begin, end); |
50 } | 47 } |
51 | 48 |
52 int get hashCode { | 49 int get hashCode { |
53 return 0x7FFFFFFF & | 50 return 0x7FFFFFFF & |
54 (startPosition.hashCode * 17 + endPosition.hashCode * 19); | 51 (startPosition.hashCode * 17 + endPosition.hashCode * 19); |
55 } | 52 } |
56 | 53 |
57 bool operator ==(other) { | 54 bool operator ==(other) { |
58 if (identical(this, other)) return true; | 55 if (identical(this, other)) return true; |
59 if (other is! StartEndSourceInformation) return false; | 56 if (other is! StartEndSourceInformation) return false; |
60 return startPosition == other.startPosition && | 57 return startPosition == other.startPosition && |
61 endPosition == other.endPosition; | 58 endPosition == other.endPosition; |
62 } | 59 } |
63 | 60 |
64 // TODO(johnniwinther): Inline this in | 61 // TODO(johnniwinther): Inline this in |
65 // [StartEndSourceInformationBuilder.buildDeclaration]. | 62 // [StartEndSourceInformationBuilder.buildDeclaration]. |
66 static StartEndSourceInformation _computeSourceInformation( | 63 static StartEndSourceInformation _computeSourceInformation( |
67 AstElement element) { | 64 AstElement element) { |
68 | |
69 AstElement implementation = element.implementation; | 65 AstElement implementation = element.implementation; |
70 SourceFile sourceFile = implementation.compilationUnit.script.file; | 66 SourceFile sourceFile = implementation.compilationUnit.script.file; |
71 String name = computeElementNameForSourceMaps(element); | 67 String name = computeElementNameForSourceMaps(element); |
72 Node node = implementation.node; | 68 Node node = implementation.node; |
73 Token beginToken; | 69 Token beginToken; |
74 Token endToken; | 70 Token endToken; |
75 if (node == null) { | 71 if (node == null) { |
76 // Synthesized node. Use the enclosing element for the location. | 72 // Synthesized node. Use the enclosing element for the location. |
77 beginToken = endToken = element.position; | 73 beginToken = endToken = element.position; |
78 } else { | 74 } else { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 class StartEndSourceInformationProcessor extends SourceInformationProcessor { | 129 class StartEndSourceInformationProcessor extends SourceInformationProcessor { |
134 final SourceMapper sourceMapper; | 130 final SourceMapper sourceMapper; |
135 | 131 |
136 /// Used to track whether a terminating source location marker has been | 132 /// Used to track whether a terminating source location marker has been |
137 /// registered for the top-most node with source information. | 133 /// registered for the top-most node with source information. |
138 bool hasRegisteredRoot = false; | 134 bool hasRegisteredRoot = false; |
139 | 135 |
140 StartEndSourceInformationProcessor(this.sourceMapper); | 136 StartEndSourceInformationProcessor(this.sourceMapper); |
141 | 137 |
142 @override | 138 @override |
143 void onPositions(js.Node node, | 139 void onPositions( |
144 int startPosition, | 140 js.Node node, int startPosition, int endPosition, int closingPosition) { |
145 int endPosition, | |
146 int closingPosition) { | |
147 if (node.sourceInformation != null) { | 141 if (node.sourceInformation != null) { |
148 StartEndSourceInformation sourceInformation = node.sourceInformation; | 142 StartEndSourceInformation sourceInformation = node.sourceInformation; |
149 sourceMapper.register( | 143 sourceMapper.register( |
150 node, startPosition, sourceInformation.startPosition); | 144 node, startPosition, sourceInformation.startPosition); |
151 if (sourceInformation.endPosition != null) { | 145 if (sourceInformation.endPosition != null) { |
152 sourceMapper.register(node, endPosition, sourceInformation.endPosition); | 146 sourceMapper.register(node, endPosition, sourceInformation.endPosition); |
153 } | 147 } |
154 if (!hasRegisteredRoot) { | 148 if (!hasRegisteredRoot) { |
155 sourceMapper.register(node, endPosition, null); | 149 sourceMapper.register(node, endPosition, null); |
156 hasRegisteredRoot = true; | 150 hasRegisteredRoot = true; |
(...skipping 19 matching lines...) Expand all Loading... |
176 SourceLocation location = | 170 SourceLocation location = |
177 new OffsetSourceLocation(sourceFile, token.charOffset, name); | 171 new OffsetSourceLocation(sourceFile, token.charOffset, name); |
178 checkValidSourceFileLocation(location, sourceFile, token.charOffset); | 172 checkValidSourceFileLocation(location, sourceFile, token.charOffset); |
179 return location; | 173 return location; |
180 } | 174 } |
181 | 175 |
182 void checkValidSourceFileLocation( | 176 void checkValidSourceFileLocation( |
183 SourceLocation location, SourceFile sourceFile, int offset) { | 177 SourceLocation location, SourceFile sourceFile, int offset) { |
184 if (!location.isValid) { | 178 if (!location.isValid) { |
185 throw MessageTemplate.TEMPLATES[MessageKind.INVALID_SOURCE_FILE_LOCATION] | 179 throw MessageTemplate.TEMPLATES[MessageKind.INVALID_SOURCE_FILE_LOCATION] |
186 .message( | 180 .message({ |
187 {'offset': offset, | 181 'offset': offset, |
188 'fileName': sourceFile.filename, | 182 'fileName': sourceFile.filename, |
189 'length': sourceFile.length}); | 183 'length': sourceFile.length |
| 184 }); |
190 } | 185 } |
191 } | 186 } |
192 | 187 |
193 @override | 188 @override |
194 SourceInformation buildLoop(Node node) { | 189 SourceInformation buildLoop(Node node) { |
195 return new StartEndSourceInformation( | 190 return new StartEndSourceInformation( |
196 sourceFileLocationForToken(node.getBeginToken()), | 191 sourceFileLocationForToken(node.getBeginToken()), |
197 sourceFileLocationForToken(node.getEndToken())); | 192 sourceFileLocationForToken(node.getEndToken())); |
198 } | 193 } |
199 | 194 |
(...skipping 17 matching lines...) Expand all Loading... |
217 | 212 |
218 @override | 213 @override |
219 SourceInformation buildCall(Node receiver, Node call) { | 214 SourceInformation buildCall(Node receiver, Node call) { |
220 return buildGeneric(receiver); | 215 return buildGeneric(receiver); |
221 } | 216 } |
222 | 217 |
223 @override | 218 @override |
224 SourceInformation buildIf(Node node) => buildGeneric(node); | 219 SourceInformation buildIf(Node node) => buildGeneric(node); |
225 | 220 |
226 @override | 221 @override |
227 SourceInformationBuilder forContext( | 222 SourceInformationBuilder forContext(AstElement element, |
228 AstElement element, {SourceInformation sourceInformation}) { | 223 {SourceInformation sourceInformation}) { |
229 return new StartEndSourceInformationBuilder(element); | 224 return new StartEndSourceInformationBuilder(element); |
230 } | 225 } |
231 } | 226 } |
232 | |
233 | |
234 | |
OLD | NEW |