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

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

Issue 1902363002: Derive source information from ResolvedAst. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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
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 /// 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 MessageTemplate; 11 import '../diagnostics/messages.dart' show MessageTemplate;
12 import '../elements/elements.dart' show AstElement; 12 import '../elements/elements.dart' show AstElement, ResolvedAst, ResolvedAstKind ;
13 import '../js/js.dart' as js; 13 import '../js/js.dart' as js;
14 import '../js/js_source_mapping.dart'; 14 import '../js/js_source_mapping.dart';
15 import '../tokens/token.dart' show Token; 15 import '../tokens/token.dart' show Token;
16 import '../tree/tree.dart' show Node; 16 import '../tree/tree.dart' show Node;
17 import 'source_file.dart'; 17 import 'source_file.dart';
18 import 'source_information.dart'; 18 import 'source_information.dart';
19 19
20 /// Source information that contains start source position and optionally an 20 /// Source information that contains start source position and optionally an
21 /// end source position. 21 /// end source position.
22 class StartEndSourceInformation extends SourceInformation { 22 class StartEndSourceInformation extends SourceInformation {
(...skipping 30 matching lines...) Expand all
53 bool operator ==(other) { 53 bool operator ==(other) {
54 if (identical(this, other)) return true; 54 if (identical(this, other)) return true;
55 if (other is! StartEndSourceInformation) return false; 55 if (other is! StartEndSourceInformation) return false;
56 return startPosition == other.startPosition && 56 return startPosition == other.startPosition &&
57 endPosition == other.endPosition; 57 endPosition == other.endPosition;
58 } 58 }
59 59
60 // TODO(johnniwinther): Inline this in 60 // TODO(johnniwinther): Inline this in
61 // [StartEndSourceInformationBuilder.buildDeclaration]. 61 // [StartEndSourceInformationBuilder.buildDeclaration].
62 static StartEndSourceInformation _computeSourceInformation( 62 static StartEndSourceInformation _computeSourceInformation(
63 AstElement element) { 63 ResolvedAst resolvedAst) {
64 AstElement implementation = element.implementation; 64 String name = computeElementNameForSourceMaps(resolvedAst.element);
65 SourceFile sourceFile = implementation.compilationUnit.script.file; 65 SourceFile sourceFile;
66 String name = computeElementNameForSourceMaps(element); 66 int begin;
67 Node node = implementation.node; 67 int end;
68 Token beginToken; 68 if (resolvedAst.kind != ResolvedAstKind.PARSED) {
69 Token endToken;
70 if (node == null) {
71 // Synthesized node. Use the enclosing element for the location. 69 // Synthesized node. Use the enclosing element for the location.
72 beginToken = endToken = element.position; 70 sourceFile = resolvedAst.element.compilationUnit.script.file;
71 begin = end = resolvedAst.element.sourcePosition.begin;
73 } else { 72 } else {
74 beginToken = node.getBeginToken(); 73 AstElement implementation = resolvedAst.element.implementation;
75 endToken = node.getEndToken(); 74 sourceFile = implementation.compilationUnit.script.file;
75 Node node = resolvedAst.node;
76 begin = node.getBeginToken().charOffset;
77 end = node.getEndToken().charOffset;
76 } 78 }
77 // TODO(johnniwinther): find the right sourceFile here and remove offset 79 // TODO(johnniwinther): find the right sourceFile here and remove offset
78 // checks below. 80 // checks below.
79 SourceLocation sourcePosition, endSourcePosition; 81 SourceLocation sourcePosition, endSourcePosition;
80 if (beginToken.charOffset < sourceFile.length) { 82 if (begin < sourceFile.length) {
81 sourcePosition = 83 sourcePosition =
82 new OffsetSourceLocation(sourceFile, beginToken.charOffset, name); 84 new OffsetSourceLocation(sourceFile, begin, name);
83 } 85 }
84 if (endToken.charOffset < sourceFile.length) { 86 if (end < sourceFile.length) {
85 endSourcePosition = 87 endSourcePosition = new OffsetSourceLocation(sourceFile, end, name);
86 new OffsetSourceLocation(sourceFile, endToken.charOffset, name);
87 } 88 }
88 return new StartEndSourceInformation(sourcePosition, endSourcePosition); 89 return new StartEndSourceInformation(sourcePosition, endSourcePosition);
89 } 90 }
90 91
91 /// Create a textual representation of the source information using [uriText] 92 /// Create a textual representation of the source information using [uriText]
92 /// as the Uri representation. 93 /// as the Uri representation.
93 String _computeText(String uriText) { 94 String _computeText(String uriText) {
94 StringBuffer sb = new StringBuffer(); 95 StringBuffer sb = new StringBuffer();
95 sb.write('$uriText:'); 96 sb.write('$uriText:');
96 // Use 1-based line/startPosition info to match usual dart tool output. 97 // Use 1-based line/startPosition info to match usual dart tool output.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 155
155 /// [SourceInformationBuilder] that generates [PositionSourceInformation]. 156 /// [SourceInformationBuilder] that generates [PositionSourceInformation].
156 class StartEndSourceInformationBuilder extends SourceInformationBuilder { 157 class StartEndSourceInformationBuilder extends SourceInformationBuilder {
157 final SourceFile sourceFile; 158 final SourceFile sourceFile;
158 final String name; 159 final String name;
159 160
160 StartEndSourceInformationBuilder(AstElement element) 161 StartEndSourceInformationBuilder(AstElement element)
161 : sourceFile = element.compilationUnit.script.file, 162 : sourceFile = element.compilationUnit.script.file,
162 name = computeElementNameForSourceMaps(element); 163 name = computeElementNameForSourceMaps(element);
163 164
164 SourceInformation buildDeclaration(AstElement element) { 165 SourceInformation buildDeclaration(ResolvedAst resolvedAst) {
165 return StartEndSourceInformation._computeSourceInformation(element); 166 return StartEndSourceInformation._computeSourceInformation(resolvedAst);
166 } 167 }
167 168
168 SourceLocation sourceFileLocationForToken(Token token) { 169 SourceLocation sourceFileLocationForToken(Token token) {
169 SourceLocation location = 170 SourceLocation location =
170 new OffsetSourceLocation(sourceFile, token.charOffset, name); 171 new OffsetSourceLocation(sourceFile, token.charOffset, name);
171 checkValidSourceFileLocation(location, sourceFile, token.charOffset); 172 checkValidSourceFileLocation(location, sourceFile, token.charOffset);
172 return location; 173 return location;
173 } 174 }
174 175
175 void checkValidSourceFileLocation( 176 void checkValidSourceFileLocation(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 217
217 @override 218 @override
218 SourceInformation buildIf(Node node) => buildGeneric(node); 219 SourceInformation buildIf(Node node) => buildGeneric(node);
219 220
220 @override 221 @override
221 SourceInformationBuilder forContext(AstElement element, 222 SourceInformationBuilder forContext(AstElement element,
222 {SourceInformation sourceInformation}) { 223 {SourceInformation sourceInformation}) {
223 return new StartEndSourceInformationBuilder(element); 224 return new StartEndSourceInformationBuilder(element);
224 } 225 }
225 } 226 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/io/source_information.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698