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

Side by Side Diff: pkg/compiler/lib/src/io/source_information.dart

Issue 1139693002: Compute better names for source maps. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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, MessageKind; 7 import '../dart2jslib.dart' show SourceSpan, MessageKind;
8 import '../elements/elements.dart' show AstElement; 8 import '../elements/elements.dart' show
9 AstElement,
10 LocalElement;
9 import '../scanner/scannerlib.dart' show Token; 11 import '../scanner/scannerlib.dart' show Token;
10 import '../tree/tree.dart' show Node; 12 import '../tree/tree.dart' show Node;
11 import '../js/js.dart' show JavaScriptNodeSourceInformation; 13 import '../js/js.dart' show JavaScriptNodeSourceInformation;
12 import 'source_file.dart'; 14 import 'source_file.dart';
13 15
14 /// Interface for passing source information, for instance for use in source 16 /// Interface for passing source information, for instance for use in source
15 /// maps, through the backend. 17 /// maps, through the backend.
16 abstract class SourceInformation extends JavaScriptNodeSourceInformation { 18 abstract class SourceInformation extends JavaScriptNodeSourceInformation {
17 SourceSpan get sourceSpan; 19 SourceSpan get sourceSpan;
18 20
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 endPosition == other.endPosition; 98 endPosition == other.endPosition;
97 } 99 }
98 100
99 // TODO(johnniwinther): Remove this method. Source information should be 101 // TODO(johnniwinther): Remove this method. Source information should be
100 // computed based on the element by provided from statements and expressions. 102 // computed based on the element by provided from statements and expressions.
101 static StartEndSourceInformation computeSourceInformation( 103 static StartEndSourceInformation computeSourceInformation(
102 AstElement element) { 104 AstElement element) {
103 105
104 AstElement implementation = element.implementation; 106 AstElement implementation = element.implementation;
105 SourceFile sourceFile = implementation.compilationUnit.script.file; 107 SourceFile sourceFile = implementation.compilationUnit.script.file;
106 String name = element.name; 108 String name = computeElementNameForSourceMaps(element);
107 Node node = implementation.node; 109 Node node = implementation.node;
108 Token beginToken; 110 Token beginToken;
109 Token endToken; 111 Token endToken;
110 if (node == null) { 112 if (node == null) {
111 // Synthesized node. Use the enclosing element for the location. 113 // Synthesized node. Use the enclosing element for the location.
112 beginToken = endToken = element.position; 114 beginToken = endToken = element.position;
113 } else { 115 } else {
114 beginToken = node.getBeginToken(); 116 beginToken = node.getBeginToken();
115 endToken = node.getEndToken(); 117 endToken = node.getEndToken();
116 } 118 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 } 151 }
150 } 152 }
151 153
152 /// [SourceInformationBuilder] that generates [PositionSourceInformation]. 154 /// [SourceInformationBuilder] that generates [PositionSourceInformation].
153 class StartEndSourceInformationBuilder extends SourceInformationBuilder { 155 class StartEndSourceInformationBuilder extends SourceInformationBuilder {
154 final SourceFile sourceFile; 156 final SourceFile sourceFile;
155 final String name; 157 final String name;
156 158
157 StartEndSourceInformationBuilder(AstElement element) 159 StartEndSourceInformationBuilder(AstElement element)
158 : sourceFile = element.compilationUnit.script.file, 160 : sourceFile = element.compilationUnit.script.file,
159 name = element.name; 161 name = computeElementNameForSourceMaps(element);
160 162
161 SourceInformation buildDeclaration(AstElement element) { 163 SourceInformation buildDeclaration(AstElement element) {
162 return StartEndSourceInformation.computeSourceInformation(element); 164 return StartEndSourceInformation.computeSourceInformation(element);
163 } 165 }
164 166
165 SourceLocation sourceFileLocationForToken(Token token) { 167 SourceLocation sourceFileLocationForToken(Token token) {
166 SourceLocation location = 168 SourceLocation location =
167 new OffsetSourceLocation(sourceFile, token.charOffset, name); 169 new OffsetSourceLocation(sourceFile, token.charOffset, name);
168 checkValidSourceFileLocation(location, sourceFile, token.charOffset); 170 checkValidSourceFileLocation(location, sourceFile, token.charOffset);
169 return location; 171 return location;
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 } 334 }
333 } 335 }
334 336
335 /// [SourceInformationBuilder] that generates [PositionSourceInformation]. 337 /// [SourceInformationBuilder] that generates [PositionSourceInformation].
336 class PositionSourceInformationBuilder implements SourceInformationBuilder { 338 class PositionSourceInformationBuilder implements SourceInformationBuilder {
337 final SourceFile sourceFile; 339 final SourceFile sourceFile;
338 final String name; 340 final String name;
339 341
340 PositionSourceInformationBuilder(AstElement element) 342 PositionSourceInformationBuilder(AstElement element)
341 : sourceFile = element.implementation.compilationUnit.script.file, 343 : sourceFile = element.implementation.compilationUnit.script.file,
342 name = element.name; 344 name = computeElementNameForSourceMaps(element);
343 345
344 SourceInformation buildDeclaration(AstElement element) { 346 SourceInformation buildDeclaration(AstElement element) {
345 if (element.isSynthesized) { 347 if (element.isSynthesized) {
346 return new PositionSourceInformation( 348 return new PositionSourceInformation(
347 new OffsetSourceLocation( 349 new OffsetSourceLocation(
348 sourceFile, element.position.charOffset, name)); 350 sourceFile, element.position.charOffset, name));
349 } else { 351 } else {
350 return new PositionSourceInformation( 352 return new PositionSourceInformation(
351 null, 353 null,
352 new OffsetSourceLocation(sourceFile, 354 new OffsetSourceLocation(sourceFile,
(...skipping 19 matching lines...) Expand all
372 SourceInformation buildGet(Node node) => buildBegin(node); 374 SourceInformation buildGet(Node node) => buildBegin(node);
373 375
374 @override 376 @override
375 SourceInformation buildCall(Node node) => buildBegin(node); 377 SourceInformation buildCall(Node node) => buildBegin(node);
376 378
377 @override 379 @override
378 SourceInformationBuilder forContext(AstElement element) { 380 SourceInformationBuilder forContext(AstElement element) {
379 return new PositionSourceInformationBuilder(element); 381 return new PositionSourceInformationBuilder(element);
380 } 382 }
381 } 383 }
384
385 /// Compute the source map name for [element].
386 String computeElementNameForSourceMaps(AstElement element) {
387 if (element.isClosure) {
388 return computeElementNameForSourceMaps(element.enclosingElement);
389 } else if (element.isClass) {
390 return element.name;
391 } else if (element.isConstructor || element.isGenerativeConstructorBody) {
392 String className = element.enclosingClass.name;
393 if (element.name == '') {
394 return className;
395 }
396 return '$className.${element.name}';
397 } else if (element.isLocal) {
398 LocalElement local = element;
399 String name = local.name;
400 if (name == '') {
401 name = '<anonymous function>';
402 }
403 return '${computeElementNameForSourceMaps(local.executableContext)}.$name';
404 } else if (element.enclosingClass != null) {
405 if (element.enclosingClass.isClosure) {
406 return computeElementNameForSourceMaps(element.enclosingClass);
407 }
408 return '${element.enclosingClass.name}.${element.name}';
409 } else {
410 return element.name;
411 }
412 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/elements/elements.dart ('k') | tests/compiler/dart2js/source_map_name_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698