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

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

Issue 1935933002: Fix source information positions for deserialized patched elements. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fixes Created 4 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
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 '../common.dart'; 7 import '../common.dart';
8 import '../elements/elements.dart' show AstElement, LocalElement, ResolvedAst; 8 import '../elements/elements.dart'
9 show
10 AstElement,
11 CompilationUnitElement,
12 LocalElement,
13 ResolvedAst,
14 ResolvedAstKind;
9 import '../js/js.dart' show JavaScriptNodeSourceInformation; 15 import '../js/js.dart' show JavaScriptNodeSourceInformation;
16 import '../script.dart';
10 import '../tree/tree.dart' show Node; 17 import '../tree/tree.dart' show Node;
11 import 'source_file.dart'; 18 import 'source_file.dart';
12 19
13 /// Interface for passing source information, for instance for use in source 20 /// Interface for passing source information, for instance for use in source
14 /// maps, through the backend. 21 /// maps, through the backend.
15 abstract class SourceInformation extends JavaScriptNodeSourceInformation { 22 abstract class SourceInformation extends JavaScriptNodeSourceInformation {
16 const SourceInformation(); 23 const SourceInformation();
17 24
18 SourceSpan get sourceSpan; 25 SourceSpan get sourceSpan;
19 26
(...skipping 10 matching lines...) Expand all
30 List<SourceLocation> get sourceLocations; 37 List<SourceLocation> get sourceLocations;
31 38
32 /// Return a short textual representation of the source location. 39 /// Return a short textual representation of the source location.
33 String get shortText; 40 String get shortText;
34 } 41 }
35 42
36 /// Strategy for creating, processing and applying [SourceInformation]. 43 /// Strategy for creating, processing and applying [SourceInformation].
37 class SourceInformationStrategy { 44 class SourceInformationStrategy {
38 const SourceInformationStrategy(); 45 const SourceInformationStrategy();
39 46
40 /// Create a [SourceInformationBuilder] for [element]. 47 /// Create a [SourceInformationBuilder] for [resolvedAst].
41 SourceInformationBuilder createBuilderForContext(AstElement element) { 48 SourceInformationBuilder createBuilderForContext(ResolvedAst resolvedAst) {
42 return const SourceInformationBuilder(); 49 return const SourceInformationBuilder();
43 } 50 }
44 51
45 /// Generate [SourceInformation] marker for non-preamble code. 52 /// Generate [SourceInformation] marker for non-preamble code.
46 SourceInformation buildSourceMappedMarker() => null; 53 SourceInformation buildSourceMappedMarker() => null;
47 54
48 /// Called when compilation has completed. 55 /// Called when compilation has completed.
49 void onComplete() {} 56 void onComplete() {}
50 } 57 }
51 58
52 /// Interface for generating [SourceInformation]. 59 /// Interface for generating [SourceInformation].
53 class SourceInformationBuilder { 60 class SourceInformationBuilder {
54 const SourceInformationBuilder(); 61 const SourceInformationBuilder();
55 62
56 /// Create a [SourceInformationBuilder] for [element]. 63 /// Create a [SourceInformationBuilder] for [resolvedAst].
57 SourceInformationBuilder forContext(AstElement element) => this; 64 SourceInformationBuilder forContext(ResolvedAst resolvedAst) => this;
58 65
59 /// Generate [SourceInformation] the declaration of the element in 66 /// Generate [SourceInformation] the declaration of the element in
60 /// [resolvedAst]. 67 /// [resolvedAst].
61 SourceInformation buildDeclaration(ResolvedAst resolvedAst) => null; 68 SourceInformation buildDeclaration(ResolvedAst resolvedAst) => null;
62 69
63 /// Generate [SourceInformation] for the generic [node]. 70 /// Generate [SourceInformation] for the generic [node].
64 @deprecated 71 @deprecated
65 SourceInformation buildGeneric(Node node) => null; 72 SourceInformation buildGeneric(Node node) => null;
66 73
67 /// Generate [SourceInformation] for an instantiation of a class using [node] 74 /// Generate [SourceInformation] for an instantiation of a class using [node]
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 /// Generate [SourceInformation] for the switch case in [node]. 151 /// Generate [SourceInformation] for the switch case in [node].
145 SourceInformation buildSwitchCase(Node node) => null; 152 SourceInformation buildSwitchCase(Node node) => null;
146 } 153 }
147 154
148 /// A location in a source file. 155 /// A location in a source file.
149 abstract class SourceLocation { 156 abstract class SourceLocation {
150 final SourceFile _sourceFile; 157 final SourceFile _sourceFile;
151 int _line; 158 int _line;
152 159
153 SourceLocation(this._sourceFile) { 160 SourceLocation(this._sourceFile) {
154 assert(isValid); 161 assert(invariant(new SourceSpan(sourceUri, 0, 0), isValid,
162 message: "Invalid source location in ${sourceUri}: "
163 "offset=$offset, length=${_sourceFile.length}."));
155 } 164 }
156 165
157 /// The absolute URI of the source file of this source location. 166 /// The absolute URI of the source file of this source location.
158 Uri get sourceUri => _sourceFile.uri; 167 Uri get sourceUri => _sourceFile.uri;
159 168
160 /// The character offset of the this source location into the source file. 169 /// The character offset of the this source location into the source file.
161 int get offset; 170 int get offset;
162 171
163 /// The 0-based line number of the [offset]. 172 /// The 0-based line number of the [offset].
164 int get line { 173 int get line {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 return '${computeElementNameForSourceMaps(local.executableContext)}.$name'; 246 return '${computeElementNameForSourceMaps(local.executableContext)}.$name';
238 } else if (element.enclosingClass != null) { 247 } else if (element.enclosingClass != null) {
239 if (element.enclosingClass.isClosure) { 248 if (element.enclosingClass.isClosure) {
240 return computeElementNameForSourceMaps(element.enclosingClass); 249 return computeElementNameForSourceMaps(element.enclosingClass);
241 } 250 }
242 return '${element.enclosingClass.name}.${element.name}'; 251 return '${element.enclosingClass.name}.${element.name}';
243 } else { 252 } else {
244 return element.name; 253 return element.name;
245 } 254 }
246 } 255 }
256
257 /// Computes the [SourceFile] for the source code of [resolvedAst].
258 SourceFile computeSourceFile(ResolvedAst resolvedAst) {
259 SourceFile sourceFile;
260 if (resolvedAst.kind != ResolvedAstKind.PARSED) {
261 // Synthesized node. Use the enclosing element for the location.
262 sourceFile = resolvedAst.element.compilationUnit.script.file;
263 } else {
264 Uri uri = resolvedAst.sourceUri;
265 AstElement implementation = resolvedAst.element.implementation;
266 Script script = implementation.compilationUnit.script;
267 if (uri == script.resourceUri) {
268 sourceFile = script.file;
269 } else {
270 // Slow path, happens only for deserialized elements.
271 // TODO(johnniwinther): Support a way to get a [SourceFile] from a
272 // [Uri].
273 for (CompilationUnitElement compilationUnit
274 in implementation.library.compilationUnits) {
275 Script script = compilationUnit.script;
276 if (uri == script.resourceUri) {
277 sourceFile = script.file;
278 break;
279 }
280 }
281 }
282 }
283 return sourceFile;
284 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/io/position_information.dart ('k') | pkg/compiler/lib/src/io/start_end_information.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698