OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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('mirrors.dart2js'); | 5 #library('mirrors.dart2js'); |
6 | 6 |
7 #import('../../compiler/compiler.dart', prefix: 'diagnostics'); | 7 #import('../../compiler/compiler.dart', prefix: 'diagnostics'); |
8 #import('../../compiler/implementation/elements/elements.dart'); | 8 #import('../../compiler/implementation/elements/elements.dart'); |
9 #import('../../compiler/implementation/apiimpl.dart', prefix: 'api'); | 9 #import('../../compiler/implementation/apiimpl.dart', prefix: 'api'); |
10 #import('../../compiler/implementation/scanner/scannerlib.dart'); | 10 #import('../../compiler/implementation/scanner/scannerlib.dart'); |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 //------------------------------------------------------------------------------ | 24 //------------------------------------------------------------------------------ |
25 // Utility types and functions for the dart2js mirror system | 25 // Utility types and functions for the dart2js mirror system |
26 //------------------------------------------------------------------------------ | 26 //------------------------------------------------------------------------------ |
27 | 27 |
28 bool _isPrivate(String name) { | 28 bool _isPrivate(String name) { |
29 return name.startsWith('_'); | 29 return name.startsWith('_'); |
30 } | 30 } |
31 | 31 |
32 List<ParameterMirror> _parametersFromFunctionSignature( | 32 List<ParameterMirror> _parametersFromFunctionSignature( |
33 Dart2jsMirrorSystem system, | 33 Dart2JsMirrorSystem system, |
34 Dart2jsMethodMirror method, | 34 Dart2JsMethodMirror method, |
35 FunctionSignature signature) { | 35 FunctionSignature signature) { |
36 var parameters = <ParameterMirror>[]; | 36 var parameters = <ParameterMirror>[]; |
37 Link<Element> link = signature.requiredParameters; | 37 Link<Element> link = signature.requiredParameters; |
38 while (!link.isEmpty()) { | 38 while (!link.isEmpty()) { |
39 parameters.add(new Dart2jsParameterMirror(system, method, | 39 parameters.add(new Dart2JsParameterMirror(system, method, |
40 link.head, false)); | 40 link.head, false)); |
41 link = link.tail; | 41 link = link.tail; |
42 } | 42 } |
43 link = signature.optionalParameters; | 43 link = signature.optionalParameters; |
44 while (!link.isEmpty()) { | 44 while (!link.isEmpty()) { |
45 parameters.add(new Dart2jsParameterMirror(system, method, | 45 parameters.add(new Dart2JsParameterMirror(system, method, |
46 link.head, true)); | 46 link.head, true)); |
47 link = link.tail; | 47 link = link.tail; |
48 } | 48 } |
49 return parameters; | 49 return parameters; |
50 } | 50 } |
51 | 51 |
52 Dart2jsTypeMirror _convertTypeToTypeMirror( | 52 Dart2JsTypeMirror _convertTypeToTypeMirror( |
53 Dart2jsMirrorSystem system, | 53 Dart2JsMirrorSystem system, |
54 Type type, | 54 Type type, |
55 InterfaceType defaultType, | 55 InterfaceType defaultType, |
56 [FunctionSignature functionSignature]) { | 56 [FunctionSignature functionSignature]) { |
57 if (type === null) { | 57 if (type === null) { |
58 return new Dart2jsInterfaceTypeMirror(system, defaultType); | 58 return new Dart2JsInterfaceTypeMirror(system, defaultType); |
59 } else if (type is InterfaceType) { | 59 } else if (type is InterfaceType) { |
60 return new Dart2jsInterfaceTypeMirror(system, type); | 60 return new Dart2JsInterfaceTypeMirror(system, type); |
61 } else if (type is TypeVariableType) { | 61 } else if (type is TypeVariableType) { |
62 return new Dart2jsTypeVariableMirror(system, type); | 62 return new Dart2JsTypeVariableMirror(system, type); |
63 } else if (type is FunctionType) { | 63 } else if (type is FunctionType) { |
64 if (type.element is TypedefElement) { | 64 if (type.element is TypedefElement) { |
65 return new Dart2jsTypedefMirror(system, type.element); | 65 return new Dart2JsTypedefMirror(system, type.element); |
66 } else { | 66 } else { |
67 return new Dart2jsFunctionTypeMirror(system, type, functionSignature); | 67 return new Dart2JsFunctionTypeMirror(system, type, functionSignature); |
68 } | 68 } |
69 } else if (type is VoidType) { | 69 } else if (type is VoidType) { |
70 return new Dart2jsVoidMirror(system, type); | 70 return new Dart2JsVoidMirror(system, type); |
71 } | 71 } |
72 throw new IllegalArgumentException("Unexpected interface type $type"); | 72 throw new IllegalArgumentException("Unexpected interface type $type"); |
73 } | 73 } |
74 | 74 |
75 Collection<Dart2jsMemberMirror> _convertElementMemberToMemberMirrors( | 75 Collection<Dart2JsMemberMirror> _convertElementMemberToMemberMirrors( |
76 Dart2jsObjectMirror library, Element element) { | 76 Dart2JsObjectMirror library, Element element) { |
77 if (element is SynthesizedConstructorElement) { | 77 if (element is SynthesizedConstructorElement) { |
78 return const <Dart2jsMemberMirror>[]; | 78 return const <Dart2JsMemberMirror>[]; |
79 } else if (element is VariableElement) { | 79 } else if (element is VariableElement) { |
80 return <Dart2jsMemberMirror>[new Dart2jsFieldMirror(library, element)]; | 80 return <Dart2JsMemberMirror>[new Dart2JsFieldMirror(library, element)]; |
81 } else if (element is FunctionElement) { | 81 } else if (element is FunctionElement) { |
82 return <Dart2jsMemberMirror>[new Dart2jsMethodMirror(library, element)]; | 82 return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)]; |
83 } else if (element is AbstractFieldElement) { | 83 } else if (element is AbstractFieldElement) { |
84 var members = <Dart2jsMemberMirror>[]; | 84 var members = <Dart2JsMemberMirror>[]; |
85 if (element.getter !== null) { | 85 if (element.getter !== null) { |
86 members.add(new Dart2jsMethodMirror(library, element.getter, | 86 members.add(new Dart2JsMethodMirror(library, element.getter, |
87 Dart2jsMethodKind.GETTER)); | 87 Dart2JsMethodKind.GETTER)); |
88 } | 88 } |
89 if (element.setter !== null) { | 89 if (element.setter !== null) { |
90 members.add(new Dart2jsMethodMirror(library, element.setter, | 90 members.add(new Dart2JsMethodMirror(library, element.setter, |
91 Dart2jsMethodKind.SETTER)); | 91 Dart2JsMethodKind.SETTER)); |
92 } | 92 } |
93 return members; | 93 return members; |
94 } | 94 } |
95 throw new IllegalArgumentException( | 95 throw new IllegalArgumentException( |
96 "Unexpected member type $element ${element.kind}"); | 96 "Unexpected member type $element ${element.kind}"); |
97 } | 97 } |
98 | 98 |
99 MethodMirror _convertElementMethodToMethodMirror(Dart2jsObjectMirror library, | 99 MethodMirror _convertElementMethodToMethodMirror(Dart2JsObjectMirror library, |
100 Element element) { | 100 Element element) { |
101 if (element is FunctionElement) { | 101 if (element is FunctionElement) { |
102 return new Dart2jsMethodMirror(library, element); | 102 return new Dart2JsMethodMirror(library, element); |
103 } else { | 103 } else { |
104 return null; | 104 return null; |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 class Dart2jsMethodKind { | 108 class Dart2JsMethodKind { |
109 static final Dart2jsMethodKind NORMAL = const Dart2jsMethodKind("normal"); | 109 static final Dart2JsMethodKind NORMAL = const Dart2JsMethodKind("normal"); |
110 static final Dart2jsMethodKind CONSTRUCTOR | 110 static final Dart2JsMethodKind CONSTRUCTOR |
111 = const Dart2jsMethodKind("constructor"); | 111 = const Dart2JsMethodKind("constructor"); |
112 static final Dart2jsMethodKind CONST = const Dart2jsMethodKind("const"); | 112 static final Dart2JsMethodKind CONST = const Dart2JsMethodKind("const"); |
113 static final Dart2jsMethodKind FACTORY = const Dart2jsMethodKind("factory"); | 113 static final Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory"); |
114 static final Dart2jsMethodKind GETTER = const Dart2jsMethodKind("getter"); | 114 static final Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter"); |
115 static final Dart2jsMethodKind SETTER = const Dart2jsMethodKind("setter"); | 115 static final Dart2JsMethodKind SETTER = const Dart2JsMethodKind("setter"); |
116 static final Dart2jsMethodKind OPERATOR = const Dart2jsMethodKind("operator"); | 116 static final Dart2JsMethodKind OPERATOR = const Dart2JsMethodKind("operator"); |
117 | 117 |
118 final String text; | 118 final String text; |
119 | 119 |
120 const Dart2jsMethodKind(this.text); | 120 const Dart2JsMethodKind(this.text); |
121 | 121 |
122 String toString() => text; | 122 String toString() => text; |
123 } | 123 } |
124 | 124 |
125 | 125 |
126 String _getOperatorFromOperatorName(String name) { | 126 String _getOperatorFromOperatorName(String name) { |
127 Map<String, String> mapping = const { | 127 Map<String, String> mapping = const { |
128 'eq': '==', | 128 'eq': '==', |
129 'not': '~', | 129 'not': '~', |
130 'negate': 'negate', // Will change. | 130 'negate': 'negate', // Will change. |
(...skipping 16 matching lines...) Expand all Loading... |
147 'or': '|', | 147 'or': '|', |
148 }; | 148 }; |
149 String newName = mapping[name]; | 149 String newName = mapping[name]; |
150 if (newName === null) { | 150 if (newName === null) { |
151 throw new Exception('Unhandled operator name: $name'); | 151 throw new Exception('Unhandled operator name: $name'); |
152 } | 152 } |
153 return newName; | 153 return newName; |
154 } | 154 } |
155 | 155 |
156 DiagnosticListener get _diagnosticListener() { | 156 DiagnosticListener get _diagnosticListener() { |
157 return const Dart2jsDiagnosticListener(); | 157 return const Dart2JsDiagnosticListener(); |
158 } | 158 } |
159 | 159 |
160 class Dart2jsDiagnosticListener implements DiagnosticListener { | 160 class Dart2JsDiagnosticListener implements DiagnosticListener { |
161 const Dart2jsDiagnosticListener(); | 161 const Dart2JsDiagnosticListener(); |
162 | 162 |
163 void cancel([String reason, node, token, instruction, element]) { | 163 void cancel([String reason, node, token, instruction, element]) { |
164 print(reason); | 164 print(reason); |
165 } | 165 } |
166 | 166 |
167 void log(message) { | 167 void log(message) { |
168 print(message); | 168 print(message); |
169 } | 169 } |
170 } | 170 } |
171 | 171 |
172 //------------------------------------------------------------------------------ | 172 //------------------------------------------------------------------------------ |
| 173 // Compiler extension for apidoc. |
| 174 //------------------------------------------------------------------------------ |
| 175 |
| 176 /** |
| 177 * Extension of the compiler that enables the analysis of several libraries with |
| 178 * no particular entry point. |
| 179 */ |
| 180 class LibraryCompiler extends api.Compiler { |
| 181 LibraryCompiler(diagnostics.ReadStringFromUri provider, |
| 182 diagnostics.DiagnosticHandler handler, |
| 183 Uri libraryRoot, Uri packageRoot, |
| 184 List<String> options) |
| 185 : super(provider, handler, libraryRoot, packageRoot, options) { |
| 186 checker = new LibraryTypeCheckerTask(this); |
| 187 resolver = new LibraryResolverTask(this); |
| 188 } |
| 189 |
| 190 // TODO(johnniwinther): The following methods are added to enable the analysis |
| 191 // of a collection of libraries to be used for apidoc. Most of the methods |
| 192 // are based on copies of existing methods and could probably be implemented |
| 193 // such that the duplicate code is avoided. Not to affect the correctness and |
| 194 // speed of dart2js as is, the redundancy is accepted temporarily. |
| 195 |
| 196 /** |
| 197 * Run the compiler on a list of libraries. No entry point is used. |
| 198 */ |
| 199 bool runList(List<Uri> uriList) { |
| 200 bool success = _runList(uriList); |
| 201 for (final task in tasks) { |
| 202 log('${task.name} took ${task.timing}msec'); |
| 203 } |
| 204 return success; |
| 205 } |
| 206 |
| 207 bool _runList(List<Uri> uriList) { |
| 208 try { |
| 209 runCompilerList(uriList); |
| 210 } catch (CompilerCancelledException exception) { |
| 211 log(exception.toString()); |
| 212 log('compilation failed'); |
| 213 return false; |
| 214 } |
| 215 tracer.close(); |
| 216 log('compilation succeeded'); |
| 217 return true; |
| 218 } |
| 219 |
| 220 void runCompilerList(List<Uri> uriList) { |
| 221 scanBuiltinLibraries(); |
| 222 var elementList = <LibraryElement>[]; |
| 223 for (var uri in uriList) { |
| 224 elementList.add(scanner.loadLibrary(uri, null)); |
| 225 } |
| 226 |
| 227 world.populate(this, libraries.getValues()); |
| 228 |
| 229 log('Resolving...'); |
| 230 phase = Compiler.PHASE_RESOLVING; |
| 231 backend.enqueueHelpers(enqueuer.resolution); |
| 232 processQueueList(enqueuer.resolution, elementList); |
| 233 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
| 234 } |
| 235 |
| 236 void processQueueList(Enqueuer world, List<LibraryElement> elements) { |
| 237 backend.processNativeClasses(world, libraries.getValues()); |
| 238 for (var library in elements) { |
| 239 library.elements.forEach((_, element) { |
| 240 world.addToWorkList(element); |
| 241 }); |
| 242 } |
| 243 progress.reset(); |
| 244 world.forEach((WorkItem work) { |
| 245 withCurrentElement(work.element, () => work.run(this, world)); |
| 246 }); |
| 247 //world.queueIsClosed = true; |
| 248 assert(world.checkNoEnqueuedInvokedInstanceMethods()); |
| 249 world.registerFieldClosureInvocations(); |
| 250 } |
| 251 |
| 252 String codegen(WorkItem work, Enqueuer world) { |
| 253 return null; |
| 254 } |
| 255 } |
| 256 |
| 257 // TODO(johnniwinther): The source for the apidoc includes calls to methods on |
| 258 // for instance [MathPrimitives] which are not resolved by dart2js. Since we |
| 259 // do not need to analyse the body of functions to produce the documenation |
| 260 // we use a specialized resolver which bypasses method bodies. |
| 261 class LibraryResolverTask extends ResolverTask { |
| 262 LibraryResolverTask(api.Compiler compiler) : super(compiler); |
| 263 |
| 264 void visitBody(ResolverVisitor visitor, Statement body) {} |
| 265 } |
| 266 |
| 267 // TODO(johnniwinther): As a side-effect of bypassing method bodies in |
| 268 // [LibraryResolveTask] we can not perform the typecheck. |
| 269 class LibraryTypeCheckerTask extends TypeCheckerTask { |
| 270 LibraryTypeCheckerTask(api.Compiler compiler) : super(compiler); |
| 271 |
| 272 void check(Node tree, TreeElements elements) {} |
| 273 } |
| 274 |
| 275 //------------------------------------------------------------------------------ |
173 // Compilation implementation | 276 // Compilation implementation |
174 //------------------------------------------------------------------------------ | 277 //------------------------------------------------------------------------------ |
175 | 278 |
176 class Dart2jsCompilation implements Compilation { | 279 class Dart2JsCompilation implements Compilation { |
177 api.Compiler _compiler; | 280 api.Compiler _compiler; |
178 Uri cwd; | 281 Uri cwd; |
179 bool isAborting = false; | 282 bool isAborting = false; |
180 Map<String, SourceFile> sourceFiles; | 283 Map<String, SourceFile> sourceFiles; |
181 | 284 |
182 Future<String> provider(Uri uri) { | 285 Future<String> provider(Uri uri) { |
183 if (uri.scheme != 'file') { | 286 if (uri.scheme != 'file') { |
184 throw new IllegalArgumentException(uri); | 287 throw new IllegalArgumentException(uri); |
185 } | 288 } |
186 String source; | 289 String source; |
(...skipping 19 matching lines...) Expand all Loading... |
206 } | 309 } |
207 print(message); | 310 print(message); |
208 throw message; | 311 throw message; |
209 } else if (fatal) { | 312 } else if (fatal) { |
210 SourceFile file = sourceFiles[uri.toString()]; | 313 SourceFile file = sourceFiles[uri.toString()]; |
211 print(file.getLocationMessage(message, begin, end, true, (s) => s)); | 314 print(file.getLocationMessage(message, begin, end, true, (s) => s)); |
212 throw message; | 315 throw message; |
213 } | 316 } |
214 } | 317 } |
215 | 318 |
216 Dart2jsCompilation(String script, String libraryRoot, | 319 Dart2JsCompilation(String script, String libraryRoot, |
217 [String packageRoot, List<String> opts = const <String>[]]) | 320 [String packageRoot, List<String> opts = const <String>[]]) |
218 : cwd = getCurrentDirectory(), sourceFiles = <SourceFile>{} { | 321 : cwd = getCurrentDirectory(), sourceFiles = <SourceFile>{} { |
219 var libraryUri = cwd.resolve(nativeToUriPath(libraryRoot)); | 322 var libraryUri = cwd.resolve(nativeToUriPath(libraryRoot)); |
220 var packageUri; | 323 var packageUri; |
221 if (packageRoot !== null) { | 324 if (packageRoot !== null) { |
222 packageUri = cwd.resolve(nativeToUriPath(packageRoot)); | 325 packageUri = cwd.resolve(nativeToUriPath(packageRoot)); |
223 } else { | 326 } else { |
224 packageUri = libraryUri; | 327 packageUri = libraryUri; |
225 } | 328 } |
226 _compiler = new api.Compiler(provider, handler, | 329 _compiler = new api.Compiler(provider, handler, |
227 libraryUri, packageUri, <String>[]); | 330 libraryUri, packageUri, <String>[]); |
228 var scriptUri = cwd.resolve(nativeToUriPath(script)); | 331 var scriptUri = cwd.resolve(nativeToUriPath(script)); |
229 // TODO(johnniwinther): Detect file not found | 332 // TODO(johnniwinther): Detect file not found |
230 _compiler.run(scriptUri); | 333 _compiler.run(scriptUri); |
231 } | 334 } |
232 | 335 |
| 336 Dart2JsCompilation.library(List<String> libraries, String libraryRoot, |
| 337 [String packageRoot, List<String> opts = const []]) |
| 338 : cwd = getCurrentDirectory(), sourceFiles = <SourceFile>{} { |
| 339 var libraryUri = cwd.resolve(nativeToUriPath(libraryRoot)); |
| 340 var packageUri; |
| 341 if (packageRoot !== null) { |
| 342 packageUri = cwd.resolve(nativeToUriPath(packageRoot)); |
| 343 } else { |
| 344 packageUri = libraryUri; |
| 345 } |
| 346 _compiler = new LibraryCompiler(provider, handler, |
| 347 libraryUri, packageUri, <String>[]); |
| 348 var librariesUri = <Uri>[]; |
| 349 for (var library in libraries) { |
| 350 librariesUri.add(cwd.resolve(nativeToUriPath(library))); |
| 351 // TODO(johnniwinther): Detect file not found |
| 352 } |
| 353 _compiler.runList(librariesUri); |
| 354 } |
| 355 |
233 void addLibrary(String path) { | 356 void addLibrary(String path) { |
234 var uri = cwd.resolve(nativeToUriPath(path)); | 357 var uri = cwd.resolve(nativeToUriPath(path)); |
235 _compiler.scanner.loadLibrary(uri, null); | 358 _compiler.scanner.loadLibrary(uri, null); |
236 } | 359 } |
237 | 360 |
238 MirrorSystem mirrors() => new Dart2jsMirrorSystem(_compiler); | 361 MirrorSystem mirrors() => new Dart2JsMirrorSystem(_compiler); |
239 } | 362 } |
240 | 363 |
241 | 364 |
242 //------------------------------------------------------------------------------ | 365 //------------------------------------------------------------------------------ |
243 // Dart2js specific extensions of mirror interfaces | 366 // Dart2Js specific extensions of mirror interfaces |
244 //------------------------------------------------------------------------------ | 367 //------------------------------------------------------------------------------ |
245 | 368 |
246 interface Dart2jsMirror extends Mirror { | 369 interface Dart2JsMirror extends Mirror { |
247 /** | 370 /** |
248 * A unique name used as the key in maps. | 371 * A unique name used as the key in maps. |
249 */ | 372 */ |
250 final String canonicalName; | 373 final String canonicalName; |
251 final Dart2jsMirrorSystem system; | 374 final Dart2JsMirrorSystem system; |
252 } | 375 } |
253 | 376 |
254 interface Dart2jsMemberMirror extends Dart2jsMirror, MemberMirror { | 377 interface Dart2JsMemberMirror extends Dart2JsMirror, MemberMirror { |
255 | 378 |
256 } | 379 } |
257 | 380 |
258 interface Dart2jsTypeMirror extends Dart2jsMirror, TypeMirror { | 381 interface Dart2JsTypeMirror extends Dart2JsMirror, TypeMirror { |
259 | 382 |
260 } | 383 } |
261 | 384 |
262 abstract class Dart2jsElementMirror implements Dart2jsMirror { | 385 abstract class Dart2JsElementMirror implements Dart2JsMirror { |
263 final Dart2jsMirrorSystem system; | 386 final Dart2JsMirrorSystem system; |
264 final Element _element; | 387 final Element _element; |
265 | 388 |
266 Dart2jsElementMirror(this.system, this._element) { | 389 Dart2JsElementMirror(this.system, this._element) { |
267 assert (system !== null); | 390 assert (system !== null); |
268 assert (_element !== null); | 391 assert (_element !== null); |
269 } | 392 } |
270 | 393 |
271 String simpleName() => _element.name.slowToString(); | 394 String simpleName() => _element.name.slowToString(); |
272 | 395 |
273 Location location() => new Dart2jsLocation( | 396 Location location() => new Dart2JsLocation( |
274 _element.getCompilationUnit().script, | 397 _element.getCompilationUnit().script, |
275 system.compiler.spanFromElement(_element)); | 398 system.compiler.spanFromElement(_element)); |
276 | 399 |
277 String toString() => _element.toString(); | 400 String toString() => _element.toString(); |
| 401 |
| 402 int hashCode() => qualifiedName().hashCode(); |
278 } | 403 } |
279 | 404 |
280 abstract class Dart2jsProxyMirror implements Dart2jsMirror { | 405 abstract class Dart2JsProxyMirror implements Dart2JsMirror { |
281 final Dart2jsMirrorSystem system; | 406 final Dart2JsMirrorSystem system; |
282 | 407 |
283 Dart2jsProxyMirror(this.system); | 408 Dart2JsProxyMirror(this.system); |
| 409 |
| 410 int hashCode() => qualifiedName().hashCode(); |
284 } | 411 } |
285 | 412 |
286 /////////////////////////////////////////////////////// | 413 //------------------------------------------------------------------------------ |
287 // implementation | 414 // Mirror system implementation. |
288 /////////////////////////////////////////////////////// | 415 //------------------------------------------------------------------------------ |
289 | 416 |
290 class Dart2jsMirrorSystem implements MirrorSystem, Dart2jsMirror { | 417 class Dart2JsMirrorSystem implements MirrorSystem, Dart2JsMirror { |
291 final api.Compiler compiler; | 418 final api.Compiler compiler; |
292 Map<String, Dart2jsLibraryMirror> _libraries; | 419 Map<String, Dart2JsLibraryMirror> _libraries; |
293 Map<LibraryElement, Dart2jsLibraryMirror> _libraryMap; | 420 Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap; |
294 | 421 |
295 Dart2jsMirrorSystem(this.compiler) | 422 Dart2JsMirrorSystem(this.compiler) |
296 : _libraryMap = new Map<LibraryElement, Dart2jsLibraryMirror>(); | 423 : _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>(); |
297 | 424 |
298 void _ensureLibraries() { | 425 void _ensureLibraries() { |
299 if (_libraries == null) { | 426 if (_libraries == null) { |
300 _libraries = <Dart2jsLibraryMirror>{}; | 427 _libraries = <Dart2JsLibraryMirror>{}; |
301 compiler.libraries.forEach((_, LibraryElement v) { | 428 compiler.libraries.forEach((_, LibraryElement v) { |
302 var mirror = new Dart2jsLibraryMirror(system, v); | 429 var mirror = new Dart2JsLibraryMirror(system, v); |
303 _libraries[mirror.canonicalName] = mirror; | 430 _libraries[mirror.canonicalName] = mirror; |
304 _libraryMap[v] = mirror; | 431 _libraryMap[v] = mirror; |
305 }); | 432 }); |
306 } | 433 } |
307 } | 434 } |
308 | 435 |
309 Map<Object, LibraryMirror> libraries() { | 436 Map<Object, LibraryMirror> libraries() { |
310 _ensureLibraries(); | 437 _ensureLibraries(); |
311 return new ImmutableMapWrapper<Object, LibraryMirror>(_libraries); | 438 return new ImmutableMapWrapper<Object, LibraryMirror>(_libraries); |
312 } | 439 } |
313 | 440 |
314 Dart2jsLibraryMirror getLibrary(LibraryElement element) { | 441 Dart2JsLibraryMirror getLibrary(LibraryElement element) { |
315 return _libraryMap[element]; | 442 return _libraryMap[element]; |
316 } | 443 } |
317 | 444 |
318 Dart2jsMirrorSystem get system() => this; | 445 Dart2JsMirrorSystem get system() => this; |
319 | 446 |
320 String simpleName() => "mirror"; | 447 String simpleName() => "mirror"; |
321 String qualifiedName() => simpleName(); | 448 String qualifiedName() => simpleName(); |
322 | 449 |
323 String get canonicalName() => simpleName(); | 450 String get canonicalName() => simpleName(); |
| 451 |
| 452 // TODO(johnniwinther): Hack! Dart2JsMirrorSystem need not be a Mirror. |
| 453 int hashCode() => qualifiedName().hashCode(); |
324 } | 454 } |
325 | 455 |
326 abstract class Dart2jsObjectMirror extends Dart2jsElementMirror | 456 abstract class Dart2JsObjectMirror extends Dart2JsElementMirror |
327 implements ObjectMirror { | 457 implements ObjectMirror { |
328 Dart2jsObjectMirror(Dart2jsMirrorSystem system, Element element) | 458 Dart2JsObjectMirror(Dart2JsMirrorSystem system, Element element) |
329 : super(system, element); | 459 : super(system, element); |
330 } | 460 } |
331 | 461 |
332 class Dart2jsLibraryMirror extends Dart2jsObjectMirror | 462 class Dart2JsLibraryMirror extends Dart2JsObjectMirror |
333 implements LibraryMirror { | 463 implements LibraryMirror { |
334 Map<String, InterfaceMirror> _types; | 464 Map<String, InterfaceMirror> _types; |
335 Map<String, MemberMirror> _members; | 465 Map<String, MemberMirror> _members; |
336 | 466 |
337 Dart2jsLibraryMirror(Dart2jsMirrorSystem system, LibraryElement library) | 467 Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library) |
338 : super(system, library); | 468 : super(system, library); |
339 | 469 |
340 LibraryElement get _library() => _element; | 470 LibraryElement get _library() => _element; |
341 | 471 |
| 472 LibraryMirror library() => this; |
| 473 |
342 String get canonicalName() => simpleName(); | 474 String get canonicalName() => simpleName(); |
343 | 475 |
344 /** | 476 /** |
345 * Returns the library name (for libraries with a #library tag) or the script | 477 * Returns the library name (for libraries with a #library tag) or the script |
346 * file name (for scripts without a #library tag). The latter case is used to | 478 * file name (for scripts without a #library tag). The latter case is used to |
347 * provide a 'library name' for scripts, to use for instance in dartdoc. | 479 * provide a 'library name' for scripts, to use for instance in dartdoc. |
348 */ | 480 */ |
349 String simpleName() { | 481 String simpleName() { |
350 if (_library.libraryTag !== null) { | 482 if (_library.libraryTag !== null) { |
351 return _library.libraryTag.argument.dartString.slowToString(); | 483 return _library.libraryTag.argument.dartString.slowToString(); |
352 } else { | 484 } else { |
353 // Use the file name as script name. | 485 // Use the file name as script name. |
354 String path = _library.script.uri.path; | 486 String path = _library.script.uri.path; |
355 return path.substring(path.lastIndexOf('/') + 1); | 487 return path.substring(path.lastIndexOf('/') + 1); |
356 } | 488 } |
357 } | 489 } |
358 | 490 |
359 String qualifiedName() => simpleName(); | 491 String qualifiedName() => simpleName(); |
360 | 492 |
361 void _ensureTypes() { | 493 void _ensureTypes() { |
362 if (_types == null) { | 494 if (_types == null) { |
363 _types = <InterfaceMirror>{}; | 495 _types = <InterfaceMirror>{}; |
364 _library.forEachExport((Element e) { | 496 _library.forEachExport((Element e) { |
365 if (e.getLibrary() == _library) { | 497 if (e.getLibrary() == _library) { |
366 if (e.isClass()) { | 498 if (e.isClass()) { |
367 var type = new Dart2jsInterfaceMirror.fromLibrary(this, e); | 499 var type = new Dart2JsInterfaceMirror.fromLibrary(this, e); |
368 _types[type.canonicalName] = type; | 500 _types[type.canonicalName] = type; |
369 } else if (e.isTypedef()) { | 501 } else if (e.isTypedef()) { |
370 var type = new Dart2jsTypedefMirror.fromLibrary(this, e); | 502 var type = new Dart2JsTypedefMirror.fromLibrary(this, e); |
371 _types[type.canonicalName] = type; | 503 _types[type.canonicalName] = type; |
372 } | 504 } |
373 } | 505 } |
374 }); | 506 }); |
375 } | 507 } |
376 } | 508 } |
377 | 509 |
378 void _ensureMembers() { | 510 void _ensureMembers() { |
379 if (_members == null) { | 511 if (_members == null) { |
380 _members = <MemberMirror>{}; | 512 _members = <MemberMirror>{}; |
(...skipping 12 matching lines...) Expand all Loading... |
393 return new ImmutableMapWrapper<Object, MemberMirror>(_members); | 525 return new ImmutableMapWrapper<Object, MemberMirror>(_members); |
394 } | 526 } |
395 | 527 |
396 Map<Object, InterfaceMirror> types() { | 528 Map<Object, InterfaceMirror> types() { |
397 _ensureTypes(); | 529 _ensureTypes(); |
398 return new ImmutableMapWrapper<Object, InterfaceMirror>(_types); | 530 return new ImmutableMapWrapper<Object, InterfaceMirror>(_types); |
399 } | 531 } |
400 | 532 |
401 Location location() { | 533 Location location() { |
402 var script = _library.getCompilationUnit().script; | 534 var script = _library.getCompilationUnit().script; |
403 return new Dart2jsLocation( | 535 return new Dart2JsLocation( |
404 script, | 536 script, |
405 new SourceSpan(script.uri, 0, script.text.length)); | 537 new SourceSpan(script.uri, 0, script.text.length)); |
406 } | 538 } |
407 } | 539 } |
408 | 540 |
409 class Dart2jsLocation implements Location { | 541 class Dart2JsLocation implements Location { |
410 Script _script; | 542 Script _script; |
411 SourceSpan _span; | 543 SourceSpan _span; |
412 | 544 |
413 Dart2jsLocation(this._script, this._span); | 545 Dart2JsLocation(this._script, this._span); |
414 | 546 |
415 int start() => _span.begin; | 547 int start() => _span.begin; |
416 int end() => _span.end; | 548 int end() => _span.end; |
417 Source source() => new Dart2jsSource(_script); | 549 Source source() => new Dart2JsSource(_script); |
418 | 550 |
419 String text() => _script.text.substring(start(), end()); | 551 String text() => _script.text.substring(start(), end()); |
420 } | 552 } |
421 | 553 |
422 class Dart2jsSource implements Source { | 554 class Dart2JsSource implements Source { |
423 Script _script; | 555 Script _script; |
424 | 556 |
425 Dart2jsSource(this._script); | 557 Dart2JsSource(this._script); |
426 | 558 |
427 Uri uri() => _script.uri; | 559 Uri uri() => _script.uri; |
428 String text() => _script.text; | 560 String text() => _script.text; |
429 } | 561 } |
430 | 562 |
431 class Dart2jsParameterMirror extends Dart2jsElementMirror | 563 class Dart2JsParameterMirror extends Dart2JsElementMirror |
432 implements ParameterMirror { | 564 implements ParameterMirror { |
433 final MethodMirror _method; | 565 final MethodMirror _method; |
434 final bool _isOptional; | 566 final bool _isOptional; |
435 | 567 |
436 Dart2jsParameterMirror(Dart2jsMirrorSystem system, | 568 Dart2JsParameterMirror(Dart2JsMirrorSystem system, |
437 this._method, | 569 this._method, |
438 VariableElement element, | 570 VariableElement element, |
439 this._isOptional) | 571 this._isOptional) |
440 : super(system, element); | 572 : super(system, element); |
441 | 573 |
442 VariableElement get _variableElement() => _element; | 574 VariableElement get _variableElement() => _element; |
443 | 575 |
444 String get canonicalName() => simpleName(); | 576 String get canonicalName() => simpleName(); |
445 | 577 |
446 String qualifiedName() => '${_method.qualifiedName()}#${simpleName()}'; | 578 String qualifiedName() => '${_method.qualifiedName()}#${simpleName()}'; |
447 | 579 |
448 // TODO(johnniwinther): Provide | 580 // TODO(johnniwinther): Provide |
449 // [:_variableElement.variables.functionSignature:] instead of [:null:]. | 581 // [:_variableElement.variables.functionSignature:] instead of [:null:]. |
450 TypeMirror type() => _convertTypeToTypeMirror(system, | 582 TypeMirror type() => _convertTypeToTypeMirror(system, |
451 _variableElement.computeType(system.compiler), | 583 _variableElement.computeType(system.compiler), |
452 system.compiler.dynamicClass.computeType(system.compiler), | 584 system.compiler.dynamicClass.computeType(system.compiler), |
453 null); | 585 null); |
454 | 586 |
455 String defaultValue() => null; // TODO(johnniwinther): How to compute this? | 587 String defaultValue() => null; // TODO(johnniwinther): How to compute this? |
456 | 588 |
457 bool hasDefaultValue() => false; // TODO(johnniwinther): How to compute this? | 589 bool hasDefaultValue() => false; // TODO(johnniwinther): How to compute this? |
458 | 590 |
459 bool isOptional() => _isOptional; | 591 bool isOptional() => _isOptional; |
460 } | 592 } |
461 | 593 |
462 //------------------------------------------------------------------------------ | 594 //------------------------------------------------------------------------------ |
463 // Declarations | 595 // Declarations |
464 //------------------------------------------------------------------------------ | 596 //------------------------------------------------------------------------------ |
465 class Dart2jsInterfaceMirror extends Dart2jsObjectMirror | 597 class Dart2JsInterfaceMirror extends Dart2JsObjectMirror |
466 implements Dart2jsTypeMirror, InterfaceMirror { | 598 implements Dart2JsTypeMirror, InterfaceMirror { |
467 final Dart2jsLibraryMirror _library; | 599 final Dart2JsLibraryMirror _library; |
468 Map<String, Dart2jsMemberMirror> _members; | 600 Map<String, Dart2JsMemberMirror> _members; |
469 List<TypeVariableMirror> _typeVariables; | 601 List<TypeVariableMirror> _typeVariables; |
470 | 602 |
471 Dart2jsInterfaceMirror(Dart2jsMirrorSystem system, ClassElement _class) | 603 Dart2JsInterfaceMirror(Dart2JsMirrorSystem system, ClassElement _class) |
472 : this._library = system.getLibrary(_class.getLibrary()), | 604 : this._library = system.getLibrary(_class.getLibrary()), |
473 super(system, _class); | 605 super(system, _class); |
474 | 606 |
475 ClassElement get _class() => _element; | 607 ClassElement get _class() => _element; |
476 | 608 |
477 | 609 |
478 Dart2jsInterfaceMirror.fromLibrary(Dart2jsLibraryMirror library, | 610 Dart2JsInterfaceMirror.fromLibrary(Dart2JsLibraryMirror library, |
479 ClassElement _class) | 611 ClassElement _class) |
480 : this._library = library, | 612 : this._library = library, |
481 super(library.system, _class); | 613 super(library.system, _class); |
482 | 614 |
483 String get canonicalName() => simpleName(); | 615 String get canonicalName() => simpleName(); |
484 | 616 |
485 String qualifiedName() => '${library().qualifiedName()}.${simpleName()}'; | 617 String qualifiedName() => '${library().qualifiedName()}.${simpleName()}'; |
486 | 618 |
487 Location location() { | 619 Location location() { |
488 if (_class is PartialClassElement) { | 620 if (_class is PartialClassElement) { |
489 var node = _class.parseNode(_diagnosticListener); | 621 var node = _class.parseNode(_diagnosticListener); |
490 if (node !== null) { | 622 if (node !== null) { |
491 var script = _class.getCompilationUnit().script; | 623 var script = _class.getCompilationUnit().script; |
492 var span = system.compiler.spanFromNode(node, script.uri); | 624 var span = system.compiler.spanFromNode(node, script.uri); |
493 return new Dart2jsLocation(script, span); | 625 return new Dart2JsLocation(script, span); |
494 } | 626 } |
495 } | 627 } |
496 return super.location(); | 628 return super.location(); |
497 } | 629 } |
498 | 630 |
499 void _ensureMembers() { | 631 void _ensureMembers() { |
500 if (_members == null) { | 632 if (_members == null) { |
501 _members = <Dart2jsMemberMirror>{}; | 633 _members = <Dart2JsMemberMirror>{}; |
502 _class.constructors.forEach((_, e) { | 634 _class.constructors.forEach((_, e) { |
503 for (var member in _convertElementMemberToMemberMirrors(this, e)) { | 635 for (var member in _convertElementMemberToMemberMirrors(this, e)) { |
504 _members[member.canonicalName] = member; | 636 _members[member.canonicalName] = member; |
505 } | 637 } |
506 }); | 638 }); |
507 _class.localMembers.forEach((_, e) { | 639 _class.localMembers.forEach((_, e) { |
508 for (var member in _convertElementMemberToMemberMirrors(this, e)) { | 640 for (var member in _convertElementMemberToMemberMirrors(this, e)) { |
509 _members[member.canonicalName] = member; | 641 _members[member.canonicalName] = member; |
510 } | 642 } |
511 }); | 643 }); |
(...skipping 18 matching lines...) Expand all Loading... |
530 bool get isTypeVariable() => false; | 662 bool get isTypeVariable() => false; |
531 | 663 |
532 bool get isTypedef() => false; | 664 bool get isTypedef() => false; |
533 | 665 |
534 bool get isFunction() => false; | 666 bool get isFunction() => false; |
535 | 667 |
536 InterfaceMirror get declaration() => this; | 668 InterfaceMirror get declaration() => this; |
537 | 669 |
538 InterfaceMirror superclass() { | 670 InterfaceMirror superclass() { |
539 if (_class.supertype != null) { | 671 if (_class.supertype != null) { |
540 return new Dart2jsInterfaceTypeMirror(system, _class.supertype); | 672 return new Dart2JsInterfaceTypeMirror(system, _class.supertype); |
541 } | 673 } |
542 return null; | 674 return null; |
543 } | 675 } |
544 | 676 |
545 Map<Object, InterfaceMirror> interfaces() { | 677 Map<Object, InterfaceMirror> interfaces() { |
546 var map = new Map<String, InterfaceMirror>(); | 678 var map = new Map<String, InterfaceMirror>(); |
547 Link<Type> link = _class.interfaces; | 679 Link<Type> link = _class.interfaces; |
548 while (!link.isEmpty()) { | 680 while (!link.isEmpty()) { |
549 var type = _convertTypeToTypeMirror(system, link.head, | 681 var type = _convertTypeToTypeMirror(system, link.head, |
550 system.compiler.dynamicClass.computeType(system.compiler)); | 682 system.compiler.dynamicClass.computeType(system.compiler)); |
(...skipping 14 matching lines...) Expand all Loading... |
565 List<TypeMirror> typeArguments() { | 697 List<TypeMirror> typeArguments() { |
566 throw new UnsupportedOperationException( | 698 throw new UnsupportedOperationException( |
567 'Declarations do not have type arguments'); | 699 'Declarations do not have type arguments'); |
568 } | 700 } |
569 | 701 |
570 List<TypeVariableMirror> typeVariables() { | 702 List<TypeVariableMirror> typeVariables() { |
571 if (_typeVariables == null) { | 703 if (_typeVariables == null) { |
572 _typeVariables = <TypeVariableMirror>[]; | 704 _typeVariables = <TypeVariableMirror>[]; |
573 _class.typeParameters.forEach((_,parameter) { | 705 _class.typeParameters.forEach((_,parameter) { |
574 _typeVariables.add( | 706 _typeVariables.add( |
575 new Dart2jsTypeVariableMirror(system, | 707 new Dart2JsTypeVariableMirror(system, |
576 parameter.computeType(system.compiler))); | 708 parameter.computeType(system.compiler))); |
577 }); | 709 }); |
578 } | 710 } |
579 return _typeVariables; | 711 return _typeVariables; |
580 } | 712 } |
581 | 713 |
582 Map<Object, MethodMirror> constructors() { | 714 Map<Object, MethodMirror> constructors() { |
583 _ensureMembers(); | 715 _ensureMembers(); |
584 return new AsFilteredImmutableMap<Object, MemberMirror, MethodMirror>( | 716 return new AsFilteredImmutableMap<Object, MemberMirror, MethodMirror>( |
585 _members, (m) => m.isConstructor ? m : null); | 717 _members, (m) => m.isConstructor ? m : null); |
586 } | 718 } |
587 | 719 |
588 /** | 720 /** |
589 * Returns the default type for this interface. | 721 * Returns the default type for this interface. |
590 */ | 722 */ |
591 InterfaceMirror defaultType() { | 723 InterfaceMirror defaultType() { |
592 if (_class.defaultClass != null) { | 724 if (_class.defaultClass != null) { |
593 return new Dart2jsInterfaceTypeMirror(system, _class.defaultClass); | 725 return new Dart2JsInterfaceTypeMirror(system, _class.defaultClass); |
594 } | 726 } |
595 return null; | 727 return null; |
596 } | 728 } |
597 | 729 |
598 bool operator ==(Object other) { | 730 bool operator ==(Object other) { |
599 if (this === other) { | 731 if (this === other) { |
600 return true; | 732 return true; |
601 } | 733 } |
602 if (other is! InterfaceMirror) { | 734 if (other is! InterfaceMirror) { |
603 return false; | 735 return false; |
604 } | 736 } |
605 if (library() != other.library()) { | 737 if (library() != other.library()) { |
606 return false; | 738 return false; |
607 } | 739 } |
608 if (isDeclaration !== other.isDeclaration) { | 740 if (isDeclaration !== other.isDeclaration) { |
609 return false; | 741 return false; |
610 } | 742 } |
611 return qualifiedName() == other.qualifiedName(); | 743 return qualifiedName() == other.qualifiedName(); |
612 } | 744 } |
613 } | 745 } |
614 | 746 |
615 class Dart2jsTypedefMirror extends Dart2jsElementMirror | 747 class Dart2JsTypedefMirror extends Dart2JsElementMirror |
616 implements Dart2jsTypeMirror, TypedefMirror { | 748 implements Dart2JsTypeMirror, TypedefMirror { |
617 final Dart2jsLibraryMirror _library; | 749 final Dart2JsLibraryMirror _library; |
618 List<TypeVariableMirror> _typeVariables; | 750 List<TypeVariableMirror> _typeVariables; |
619 TypeMirror _definition; | 751 TypeMirror _definition; |
620 | 752 |
621 Dart2jsTypedefMirror(Dart2jsMirrorSystem system, TypedefElement _typedef) | 753 Dart2JsTypedefMirror(Dart2JsMirrorSystem system, TypedefElement _typedef) |
622 : this._library = system.getLibrary(_typedef.getLibrary()), | 754 : this._library = system.getLibrary(_typedef.getLibrary()), |
623 super(system, _typedef); | 755 super(system, _typedef); |
624 | 756 |
625 Dart2jsTypedefMirror.fromLibrary(Dart2jsLibraryMirror library, | 757 Dart2JsTypedefMirror.fromLibrary(Dart2JsLibraryMirror library, |
626 TypedefElement _typedef) | 758 TypedefElement _typedef) |
627 : this._library = library, | 759 : this._library = library, |
628 super(library.system, _typedef); | 760 super(library.system, _typedef); |
629 | 761 |
630 TypedefElement get _typedef() => _element; | 762 TypedefElement get _typedef() => _element; |
631 | 763 |
632 String get canonicalName() => simpleName(); | 764 String get canonicalName() => simpleName(); |
633 | 765 |
634 String qualifiedName() => '${library().qualifiedName()}.${simpleName()}'; | 766 String qualifiedName() => '${library().qualifiedName()}.${simpleName()}'; |
635 | 767 |
636 Location location() { | 768 Location location() { |
637 var node = _typedef.parseNode(_diagnosticListener); | 769 var node = _typedef.parseNode(_diagnosticListener); |
638 if (node !== null) { | 770 if (node !== null) { |
639 var script = _typedef.getCompilationUnit().script; | 771 var script = _typedef.getCompilationUnit().script; |
640 var span = system.compiler.spanFromNode(node, script.uri); | 772 var span = system.compiler.spanFromNode(node, script.uri); |
641 return new Dart2jsLocation(script, span); | 773 return new Dart2JsLocation(script, span); |
642 } | 774 } |
643 return super.location(); | 775 return super.location(); |
644 } | 776 } |
645 | 777 |
646 LibraryMirror library() => _library; | 778 LibraryMirror library() => _library; |
647 | 779 |
648 bool get isObject() => false; | 780 bool get isObject() => false; |
649 | 781 |
650 bool get isDynamic() => false; | 782 bool get isDynamic() => false; |
651 | 783 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 | 826 |
695 bool get isPrivate() => _isPrivate(simpleName()); | 827 bool get isPrivate() => _isPrivate(simpleName()); |
696 | 828 |
697 bool get isDeclaration() => true; | 829 bool get isDeclaration() => true; |
698 | 830 |
699 Map<Object, MethodMirror> constructors() => const <MethodMirror>{}; | 831 Map<Object, MethodMirror> constructors() => const <MethodMirror>{}; |
700 | 832 |
701 InterfaceMirror defaultType() => null; | 833 InterfaceMirror defaultType() => null; |
702 } | 834 } |
703 | 835 |
704 class Dart2jsTypeVariableMirror extends Dart2jsTypeElementMirror | 836 class Dart2JsTypeVariableMirror extends Dart2JsTypeElementMirror |
705 implements TypeVariableMirror { | 837 implements TypeVariableMirror { |
706 final TypeVariableType _typeVariableType; | 838 final TypeVariableType _typeVariableType; |
707 InterfaceMirror _declarer; | 839 InterfaceMirror _declarer; |
708 | 840 |
709 Dart2jsTypeVariableMirror(Dart2jsMirrorSystem system, | 841 Dart2JsTypeVariableMirror(Dart2JsMirrorSystem system, |
710 TypeVariableType typeVariableType) | 842 TypeVariableType typeVariableType) |
711 : this._typeVariableType = typeVariableType, | 843 : this._typeVariableType = typeVariableType, |
712 super(system, typeVariableType) { | 844 super(system, typeVariableType) { |
713 assert(_typeVariableType !== null); | 845 assert(_typeVariableType !== null); |
714 } | 846 } |
715 | 847 |
716 | 848 |
717 String qualifiedName() => '${declarer().qualifiedName()}.${simpleName()}'; | 849 String qualifiedName() => '${declarer().qualifiedName()}.${simpleName()}'; |
718 | 850 |
719 InterfaceMirror declarer() { | 851 InterfaceMirror declarer() { |
720 if (_declarer === null) { | 852 if (_declarer === null) { |
721 if (_typeVariableType.element.enclosingElement.isClass()) { | 853 if (_typeVariableType.element.enclosingElement.isClass()) { |
722 _declarer = new Dart2jsInterfaceMirror(system, | 854 _declarer = new Dart2JsInterfaceMirror(system, |
723 _typeVariableType.element.enclosingElement); | 855 _typeVariableType.element.enclosingElement); |
724 } else if (_typeVariableType.element.enclosingElement.isTypedef()) { | 856 } else if (_typeVariableType.element.enclosingElement.isTypedef()) { |
725 _declarer = new Dart2jsTypedefMirror(system, | 857 _declarer = new Dart2JsTypedefMirror(system, |
726 _typeVariableType.element.enclosingElement); | 858 _typeVariableType.element.enclosingElement); |
727 } | 859 } |
728 } | 860 } |
729 return _declarer; | 861 return _declarer; |
730 } | 862 } |
731 | 863 |
732 LibraryMirror library() => declarer().library(); | 864 LibraryMirror library() => declarer().library(); |
733 | 865 |
734 bool get isObject() => false; | 866 bool get isObject() => false; |
735 | 867 |
(...skipping 24 matching lines...) Expand all Loading... |
760 } | 892 } |
761 return qualifiedName() == other.qualifiedName(); | 893 return qualifiedName() == other.qualifiedName(); |
762 } | 894 } |
763 } | 895 } |
764 | 896 |
765 | 897 |
766 //------------------------------------------------------------------------------ | 898 //------------------------------------------------------------------------------ |
767 // Types | 899 // Types |
768 //------------------------------------------------------------------------------ | 900 //------------------------------------------------------------------------------ |
769 | 901 |
770 abstract class Dart2jsTypeElementMirror extends Dart2jsProxyMirror | 902 abstract class Dart2JsTypeElementMirror extends Dart2JsProxyMirror |
771 implements Dart2jsTypeMirror { | 903 implements Dart2JsTypeMirror { |
772 final Type _type; | 904 final Type _type; |
773 | 905 |
774 Dart2jsTypeElementMirror(Dart2jsMirrorSystem system, this._type) | 906 Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, this._type) |
775 : super(system); | 907 : super(system); |
776 | 908 |
777 String simpleName() => _type.name.slowToString(); | 909 String simpleName() => _type.name.slowToString(); |
778 | 910 |
779 String get canonicalName() => simpleName(); | 911 String get canonicalName() => simpleName(); |
780 | 912 |
781 Location location() { | 913 Location location() { |
782 var script = _type.element.getCompilationUnit().script; | 914 var script = _type.element.getCompilationUnit().script; |
783 return new Dart2jsLocation(script, | 915 return new Dart2JsLocation(script, |
784 system.compiler.spanFromElement(_type.element)); | 916 system.compiler.spanFromElement(_type.element)); |
785 } | 917 } |
786 | 918 |
787 LibraryMirror library() { | 919 LibraryMirror library() { |
788 return system.getLibrary(_type.element.getLibrary()); | 920 return system.getLibrary(_type.element.getLibrary()); |
789 } | 921 } |
790 | 922 |
791 String toString() => _type.element.toString(); | 923 String toString() => _type.element.toString(); |
792 } | 924 } |
793 | 925 |
794 class Dart2jsInterfaceTypeMirror extends Dart2jsTypeElementMirror | 926 class Dart2JsInterfaceTypeMirror extends Dart2JsTypeElementMirror |
795 implements InterfaceMirror { | 927 implements InterfaceMirror { |
796 List<TypeMirror> _typeArguments; | 928 List<TypeMirror> _typeArguments; |
797 | 929 |
798 Dart2jsInterfaceTypeMirror(Dart2jsMirrorSystem system, | 930 Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system, |
799 InterfaceType interfaceType) | 931 InterfaceType interfaceType) |
800 : super(system, interfaceType); | 932 : super(system, interfaceType); |
801 | 933 |
802 InterfaceType get _interfaceType() => _type; | 934 InterfaceType get _interfaceType() => _type; |
803 | 935 |
804 String qualifiedName() => declaration.qualifiedName(); | 936 String qualifiedName() => declaration.qualifiedName(); |
805 | 937 |
806 // TODO(johnniwinther): Substitute type arguments for type variables. | 938 // TODO(johnniwinther): Substitute type arguments for type variables. |
807 Map<Object, MemberMirror> declaredMembers() => declaration.declaredMembers(); | 939 Map<Object, MemberMirror> declaredMembers() => declaration.declaredMembers(); |
808 | 940 |
809 bool get isObject() => system.compiler.objectClass == _type.element; | 941 bool get isObject() => system.compiler.objectClass == _type.element; |
810 | 942 |
811 bool get isDynamic() => system.compiler.dynamicClass == _type.element; | 943 bool get isDynamic() => system.compiler.dynamicClass == _type.element; |
812 | 944 |
813 bool get isTypeVariable() => false; | 945 bool get isTypeVariable() => false; |
814 | 946 |
815 bool get isVoid() => false; | 947 bool get isVoid() => false; |
816 | 948 |
817 bool get isTypedef() => false; | 949 bool get isTypedef() => false; |
818 | 950 |
819 bool get isFunction() => false; | 951 bool get isFunction() => false; |
820 | 952 |
821 InterfaceMirror get declaration() | 953 InterfaceMirror get declaration() |
822 => new Dart2jsInterfaceMirror(system, _type.element); | 954 => new Dart2JsInterfaceMirror(system, _type.element); |
823 | 955 |
824 // TODO(johnniwinther): Substitute type arguments for type variables. | 956 // TODO(johnniwinther): Substitute type arguments for type variables. |
825 InterfaceMirror superclass() => declaration.superclass(); | 957 InterfaceMirror superclass() => declaration.superclass(); |
826 | 958 |
827 // TODO(johnniwinther): Substitute type arguments for type variables. | 959 // TODO(johnniwinther): Substitute type arguments for type variables. |
828 Map<Object, InterfaceMirror> interfaces() => declaration.interfaces(); | 960 Map<Object, InterfaceMirror> interfaces() => declaration.interfaces(); |
829 | 961 |
830 bool get isClass() => declaration.isClass; | 962 bool get isClass() => declaration.isClass; |
831 | 963 |
832 bool get isInterface() => declaration.isInterface; | 964 bool get isInterface() => declaration.isInterface; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 while (thisTypeArguments.hasNext() && otherTypeArguments.hasNext()) { | 1006 while (thisTypeArguments.hasNext() && otherTypeArguments.hasNext()) { |
875 if (thisTypeArguments.next() != otherTypeArguments.next()) { | 1007 if (thisTypeArguments.next() != otherTypeArguments.next()) { |
876 return false; | 1008 return false; |
877 } | 1009 } |
878 } | 1010 } |
879 return !thisTypeArguments.hasNext() && !otherTypeArguments.hasNext(); | 1011 return !thisTypeArguments.hasNext() && !otherTypeArguments.hasNext(); |
880 } | 1012 } |
881 } | 1013 } |
882 | 1014 |
883 | 1015 |
884 class Dart2jsFunctionTypeMirror extends Dart2jsTypeElementMirror | 1016 class Dart2JsFunctionTypeMirror extends Dart2JsTypeElementMirror |
885 implements FunctionTypeMirror { | 1017 implements FunctionTypeMirror { |
886 final FunctionSignature _functionSignature; | 1018 final FunctionSignature _functionSignature; |
887 List<ParameterMirror> _parameters; | 1019 List<ParameterMirror> _parameters; |
888 | 1020 |
889 Dart2jsFunctionTypeMirror(Dart2jsMirrorSystem system, | 1021 Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system, |
890 FunctionType functionType, this._functionSignature) | 1022 FunctionType functionType, this._functionSignature) |
891 : super(system, functionType) { | 1023 : super(system, functionType) { |
892 assert (_functionSignature !== null); | 1024 assert (_functionSignature !== null); |
893 } | 1025 } |
894 | 1026 |
895 FunctionType get _functionType() => _type; | 1027 FunctionType get _functionType() => _type; |
896 | 1028 |
897 // TODO(johnniwinther): Is this the qualified name of a function type? | 1029 // TODO(johnniwinther): Is this the qualified name of a function type? |
898 String qualifiedName() => declaration.qualifiedName(); | 1030 String qualifiedName() => declaration.qualifiedName(); |
899 | 1031 |
(...skipping 21 matching lines...) Expand all Loading... |
921 | 1053 |
922 bool get isTypedef() => false; | 1054 bool get isTypedef() => false; |
923 | 1055 |
924 bool get isFunction() => true; | 1056 bool get isFunction() => true; |
925 | 1057 |
926 MethodMirror callMethod() => _convertElementMethodToMethodMirror( | 1058 MethodMirror callMethod() => _convertElementMethodToMethodMirror( |
927 system.getLibrary(_functionType.element.getLibrary()), | 1059 system.getLibrary(_functionType.element.getLibrary()), |
928 _functionType.element); | 1060 _functionType.element); |
929 | 1061 |
930 InterfaceMirror get declaration() | 1062 InterfaceMirror get declaration() |
931 => new Dart2jsInterfaceMirror(system, system.compiler.functionClass); | 1063 => new Dart2JsInterfaceMirror(system, system.compiler.functionClass); |
932 | 1064 |
933 // TODO(johnniwinther): Substitute type arguments for type variables. | 1065 // TODO(johnniwinther): Substitute type arguments for type variables. |
934 InterfaceMirror superclass() => declaration.superclass(); | 1066 InterfaceMirror superclass() => declaration.superclass(); |
935 | 1067 |
936 // TODO(johnniwinther): Substitute type arguments for type variables. | 1068 // TODO(johnniwinther): Substitute type arguments for type variables. |
937 Map<Object, InterfaceMirror> interfaces() => declaration.interfaces(); | 1069 Map<Object, InterfaceMirror> interfaces() => declaration.interfaces(); |
938 | 1070 |
939 bool get isClass() => declaration.isClass; | 1071 bool get isClass() => declaration.isClass; |
940 | 1072 |
941 bool get isInterface() => declaration.isInterface; | 1073 bool get isInterface() => declaration.isInterface; |
(...skipping 17 matching lines...) Expand all Loading... |
959 | 1091 |
960 List<ParameterMirror> parameters() { | 1092 List<ParameterMirror> parameters() { |
961 if (_parameters === null) { | 1093 if (_parameters === null) { |
962 _parameters = _parametersFromFunctionSignature(system, callMethod(), | 1094 _parameters = _parametersFromFunctionSignature(system, callMethod(), |
963 _functionSignature); | 1095 _functionSignature); |
964 } | 1096 } |
965 return _parameters; | 1097 return _parameters; |
966 } | 1098 } |
967 } | 1099 } |
968 | 1100 |
969 class Dart2jsVoidMirror extends Dart2jsTypeElementMirror { | 1101 class Dart2JsVoidMirror extends Dart2JsTypeElementMirror { |
970 | 1102 |
971 Dart2jsVoidMirror(Dart2jsMirrorSystem system, VoidType voidType) | 1103 Dart2JsVoidMirror(Dart2JsMirrorSystem system, VoidType voidType) |
972 : super(system, voidType); | 1104 : super(system, voidType); |
973 | 1105 |
974 VoidType get _voidType() => _type; | 1106 VoidType get _voidType() => _type; |
975 | 1107 |
976 String qualifiedName() => simpleName(); | 1108 String qualifiedName() => simpleName(); |
977 | 1109 |
978 /** | 1110 /** |
979 * The void type has no location. | 1111 * The void type has no location. |
980 */ | 1112 */ |
981 Location location() => null; | 1113 Location location() => null; |
(...skipping 19 matching lines...) Expand all Loading... |
1001 if (this === other) { | 1133 if (this === other) { |
1002 return true; | 1134 return true; |
1003 } | 1135 } |
1004 if (other is! TypeMirror) { | 1136 if (other is! TypeMirror) { |
1005 return false; | 1137 return false; |
1006 } | 1138 } |
1007 return other.isVoid; | 1139 return other.isVoid; |
1008 } | 1140 } |
1009 } | 1141 } |
1010 | 1142 |
1011 /////////////////////////////////////////////////////// | 1143 //------------------------------------------------------------------------------ |
1012 // members | 1144 // Member mirrors implementation. |
1013 /////////////////////////////////////////////////////// | 1145 //------------------------------------------------------------------------------ |
1014 | 1146 |
1015 class Dart2jsMethodMirror extends Dart2jsElementMirror | 1147 class Dart2JsMethodMirror extends Dart2JsElementMirror |
1016 implements Dart2jsMemberMirror, MethodMirror { | 1148 implements Dart2JsMemberMirror, MethodMirror { |
1017 final Dart2jsObjectMirror _objectMirror; | 1149 final Dart2JsObjectMirror _objectMirror; |
1018 String _name; | 1150 String _name; |
1019 String _constructorName; | 1151 String _constructorName; |
1020 String _operatorName; | 1152 String _operatorName; |
1021 Dart2jsMethodKind _kind; | 1153 Dart2JsMethodKind _kind; |
1022 String _canonicalName; | 1154 String _canonicalName; |
1023 | 1155 |
1024 Dart2jsMethodMirror(Dart2jsObjectMirror objectMirror, | 1156 Dart2JsMethodMirror(Dart2JsObjectMirror objectMirror, |
1025 FunctionElement function, | 1157 FunctionElement function, |
1026 [Dart2jsMethodKind kind = null]) | 1158 [Dart2JsMethodKind kind = null]) |
1027 : this._objectMirror = objectMirror, | 1159 : this._objectMirror = objectMirror, |
1028 this._kind = kind, | 1160 this._kind = kind, |
1029 super(objectMirror.system, function) { | 1161 super(objectMirror.system, function) { |
1030 _name = _element.name.slowToString(); | 1162 _name = _element.name.slowToString(); |
1031 if (kind == null) { | 1163 if (kind == null) { |
1032 if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) { | 1164 if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) { |
1033 _constructorName = ''; | 1165 _constructorName = ''; |
1034 int dollarPos = _name.indexOf('\$'); | 1166 int dollarPos = _name.indexOf('\$'); |
1035 if (dollarPos != -1) { | 1167 if (dollarPos != -1) { |
1036 _constructorName = _name.substring(dollarPos+1); | 1168 _constructorName = _name.substring(dollarPos+1); |
1037 _name = _name.substring(0, dollarPos); | 1169 _name = _name.substring(0, dollarPos); |
1038 // canonical name is TypeName.constructorName | 1170 // canonical name is TypeName.constructorName |
1039 _canonicalName = '$_name.$_constructorName'; | 1171 _canonicalName = '$_name.$_constructorName'; |
1040 } else { | 1172 } else { |
1041 // canonical name is TypeName | 1173 // canonical name is TypeName |
1042 _canonicalName = _name; | 1174 _canonicalName = _name; |
1043 } | 1175 } |
1044 if (_function.modifiers !== null && _function.modifiers.isConst()) { | 1176 if (_function.modifiers !== null && _function.modifiers.isConst()) { |
1045 _kind = Dart2jsMethodKind.CONST; | 1177 _kind = Dart2JsMethodKind.CONST; |
1046 } else { | 1178 } else { |
1047 _kind = Dart2jsMethodKind.CONSTRUCTOR; | 1179 _kind = Dart2JsMethodKind.CONSTRUCTOR; |
1048 } | 1180 } |
1049 } else if (_function.modifiers !== null | 1181 } else if (_function.modifiers !== null |
1050 && _function.modifiers.isFactory()) { | 1182 && _function.modifiers.isFactory()) { |
1051 _constructorName = ''; | 1183 _constructorName = ''; |
1052 int dollarPos = _name.indexOf('\$'); | 1184 int dollarPos = _name.indexOf('\$'); |
1053 if (dollarPos != -1) { | 1185 if (dollarPos != -1) { |
1054 _constructorName = _name.substring(dollarPos+1); | 1186 _constructorName = _name.substring(dollarPos+1); |
1055 _name = _name.substring(0, dollarPos); | 1187 _name = _name.substring(0, dollarPos); |
1056 } | 1188 } |
1057 _kind = Dart2jsMethodKind.FACTORY; | 1189 _kind = Dart2JsMethodKind.FACTORY; |
1058 // canonical name is TypeName.constructorName | 1190 // canonical name is TypeName.constructorName |
1059 _canonicalName = '$_name.$_constructorName'; | 1191 _canonicalName = '$_name.$_constructorName'; |
1060 } else if (_name.startsWith('operator\$')) { | 1192 } else if (_name.startsWith('operator\$')) { |
1061 String str = _name.substring(9); | 1193 String str = _name.substring(9); |
1062 _name = 'operator'; | 1194 _name = 'operator'; |
1063 _kind = Dart2jsMethodKind.OPERATOR; | 1195 _kind = Dart2JsMethodKind.OPERATOR; |
1064 _operatorName = _getOperatorFromOperatorName(str); | 1196 _operatorName = _getOperatorFromOperatorName(str); |
1065 // canonical name is 'operator operatorName' | 1197 // canonical name is 'operator operatorName' |
1066 _canonicalName = 'operator $_operatorName'; | 1198 _canonicalName = 'operator $_operatorName'; |
1067 } else { | 1199 } else { |
1068 _kind = Dart2jsMethodKind.NORMAL; | 1200 _kind = Dart2JsMethodKind.NORMAL; |
1069 _canonicalName = _name; | 1201 _canonicalName = _name; |
1070 } | 1202 } |
1071 } else if (kind == Dart2jsMethodKind.GETTER) { | 1203 } else if (kind == Dart2JsMethodKind.GETTER) { |
1072 _canonicalName = _name; | 1204 _canonicalName = _name; |
1073 } else if (kind == Dart2jsMethodKind.SETTER) { | 1205 } else if (kind == Dart2JsMethodKind.SETTER) { |
1074 _canonicalName = '$_name='; | 1206 _canonicalName = '$_name='; |
1075 } else { | 1207 } else { |
1076 assert(false); | 1208 assert(false); |
1077 } | 1209 } |
1078 } | 1210 } |
1079 | 1211 |
1080 FunctionElement get _function() => _element; | 1212 FunctionElement get _function() => _element; |
1081 | 1213 |
1082 String simpleName() => _name; | 1214 String simpleName() => _name; |
1083 | 1215 |
1084 String qualifiedName() | 1216 String qualifiedName() |
1085 => '${surroundingDeclaration().qualifiedName()}.$canonicalName'; | 1217 => '${surroundingDeclaration().qualifiedName()}.$canonicalName'; |
1086 | 1218 |
1087 String get canonicalName() => _canonicalName; | 1219 String get canonicalName() => _canonicalName; |
1088 | 1220 |
1089 ObjectMirror surroundingDeclaration() => _objectMirror; | 1221 ObjectMirror surroundingDeclaration() => _objectMirror; |
1090 | 1222 |
1091 bool get isTopLevel() => _objectMirror is LibraryMirror; | 1223 bool get isTopLevel() => _objectMirror is LibraryMirror; |
1092 | 1224 |
1093 bool get isConstructor() | 1225 bool get isConstructor() |
1094 => _kind == Dart2jsMethodKind.CONSTRUCTOR || isConst || isFactory; | 1226 => _kind == Dart2JsMethodKind.CONSTRUCTOR || isConst || isFactory; |
1095 | 1227 |
1096 bool get isField() => false; | 1228 bool get isField() => false; |
1097 | 1229 |
1098 bool get isMethod() => !isConstructor; | 1230 bool get isMethod() => !isConstructor; |
1099 | 1231 |
1100 bool get isPrivate() => _isPrivate(simpleName()); | 1232 bool get isPrivate() => _isPrivate(simpleName()); |
1101 | 1233 |
1102 bool get isStatic() => | 1234 bool get isStatic() => |
1103 _function.modifiers !== null && _function.modifiers.isStatic(); | 1235 _function.modifiers !== null && _function.modifiers.isStatic(); |
1104 | 1236 |
1105 List<ParameterMirror> parameters() { | 1237 List<ParameterMirror> parameters() { |
1106 return _parametersFromFunctionSignature(system, this, | 1238 return _parametersFromFunctionSignature(system, this, |
1107 _function.computeSignature(system.compiler)); | 1239 _function.computeSignature(system.compiler)); |
1108 } | 1240 } |
1109 | 1241 |
1110 TypeMirror returnType() => _convertTypeToTypeMirror( | 1242 TypeMirror returnType() => _convertTypeToTypeMirror( |
1111 system, _function.computeSignature(system.compiler).returnType, | 1243 system, _function.computeSignature(system.compiler).returnType, |
1112 system.compiler.dynamicClass.computeType(system.compiler)); | 1244 system.compiler.dynamicClass.computeType(system.compiler)); |
1113 | 1245 |
1114 bool get isConst() => _kind == Dart2jsMethodKind.CONST; | 1246 bool get isConst() => _kind == Dart2JsMethodKind.CONST; |
1115 | 1247 |
1116 bool get isFactory() => _kind == Dart2jsMethodKind.FACTORY; | 1248 bool get isFactory() => _kind == Dart2JsMethodKind.FACTORY; |
1117 | 1249 |
1118 String get constructorName() => _constructorName; | 1250 String get constructorName() => _constructorName; |
1119 | 1251 |
1120 bool get isGetter() => _kind == Dart2jsMethodKind.GETTER; | 1252 bool get isGetter() => _kind == Dart2JsMethodKind.GETTER; |
1121 | 1253 |
1122 bool get isSetter() => _kind == Dart2jsMethodKind.SETTER; | 1254 bool get isSetter() => _kind == Dart2JsMethodKind.SETTER; |
1123 | 1255 |
1124 bool get isOperator() => _kind == Dart2jsMethodKind.OPERATOR; | 1256 bool get isOperator() => _kind == Dart2JsMethodKind.OPERATOR; |
1125 | 1257 |
1126 String get operatorName() => _operatorName; | 1258 String get operatorName() => _operatorName; |
1127 | 1259 |
1128 Location location() { | 1260 Location location() { |
1129 var node = _function.parseNode(_diagnosticListener); | 1261 var node = _function.parseNode(_diagnosticListener); |
1130 if (node !== null) { | 1262 if (node !== null) { |
1131 var script = _function.getCompilationUnit().script; | 1263 var script = _function.getCompilationUnit().script; |
1132 var span = system.compiler.spanFromNode(node, script.uri); | 1264 var span = system.compiler.spanFromNode(node, script.uri); |
1133 return new Dart2jsLocation(script, span); | 1265 return new Dart2JsLocation(script, span); |
1134 } | 1266 } |
1135 return super.location(); | 1267 return super.location(); |
1136 } | 1268 } |
1137 | 1269 |
1138 } | 1270 } |
1139 | 1271 |
1140 class Dart2jsFieldMirror extends Dart2jsElementMirror | 1272 class Dart2JsFieldMirror extends Dart2JsElementMirror |
1141 implements Dart2jsMemberMirror, FieldMirror { | 1273 implements Dart2JsMemberMirror, FieldMirror { |
1142 Dart2jsObjectMirror _objectMirror; | 1274 Dart2JsObjectMirror _objectMirror; |
1143 VariableElement _variable; | 1275 VariableElement _variable; |
1144 | 1276 |
1145 Dart2jsFieldMirror(Dart2jsObjectMirror objectMirror, | 1277 Dart2JsFieldMirror(Dart2JsObjectMirror objectMirror, |
1146 VariableElement variable) | 1278 VariableElement variable) |
1147 : this._objectMirror = objectMirror, | 1279 : this._objectMirror = objectMirror, |
1148 this._variable = variable, | 1280 this._variable = variable, |
1149 super(objectMirror.system, variable); | 1281 super(objectMirror.system, variable); |
1150 | 1282 |
1151 String qualifiedName() | 1283 String qualifiedName() |
1152 => '${surroundingDeclaration().qualifiedName()}.$canonicalName'; | 1284 => '${surroundingDeclaration().qualifiedName()}.$canonicalName'; |
1153 | 1285 |
1154 String get canonicalName() => simpleName(); | 1286 String get canonicalName() => simpleName(); |
1155 | 1287 |
(...skipping 15 matching lines...) Expand all Loading... |
1171 | 1303 |
1172 TypeMirror type() => _convertTypeToTypeMirror(system, | 1304 TypeMirror type() => _convertTypeToTypeMirror(system, |
1173 _variable.computeType(system.compiler), | 1305 _variable.computeType(system.compiler), |
1174 system.compiler.dynamicClass.computeType(system.compiler)); | 1306 system.compiler.dynamicClass.computeType(system.compiler)); |
1175 | 1307 |
1176 Location location() { | 1308 Location location() { |
1177 var script = _variable.getCompilationUnit().script; | 1309 var script = _variable.getCompilationUnit().script; |
1178 var node = _variable.variables.parseNode(_diagnosticListener); | 1310 var node = _variable.variables.parseNode(_diagnosticListener); |
1179 if (node !== null) { | 1311 if (node !== null) { |
1180 var span = system.compiler.spanFromNode(node, script.uri); | 1312 var span = system.compiler.spanFromNode(node, script.uri); |
1181 return new Dart2jsLocation(script, span); | 1313 return new Dart2JsLocation(script, span); |
1182 } else { | 1314 } else { |
1183 var span = system.compiler.spanFromElement(_variable); | 1315 var span = system.compiler.spanFromElement(_variable); |
1184 return new Dart2jsLocation(script, span); | 1316 return new Dart2JsLocation(script, span); |
1185 } | 1317 } |
1186 } | 1318 } |
1187 } | 1319 } |
1188 | 1320 |
OLD | NEW |