| 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 dart2js.mirrors; | 5 library dart2js.mirrors; |
| 6 | 6 |
| 7 import 'dart:collection' show UnmodifiableListView; | 7 import 'dart:collection' show UnmodifiableListView, UnmodifiableMapView; |
| 8 | 8 |
| 9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
| 10 import '../scanner/scannerlib.dart'; | 10 import '../scanner/scannerlib.dart'; |
| 11 import '../resolution/resolution.dart' show Scope; | 11 import '../resolution/resolution.dart' show Scope; |
| 12 import '../dart2jslib.dart'; | 12 import '../dart2jslib.dart'; |
| 13 import '../dart_types.dart'; | 13 import '../dart_types.dart'; |
| 14 import '../tree/tree.dart'; | 14 import '../tree/tree.dart'; |
| 15 import '../util/util.dart' | 15 import '../util/util.dart' |
| 16 show Spannable, | 16 show Link, |
| 17 Link, | 17 LinkBuilder; |
| 18 LinkBuilder, | |
| 19 NO_LOCATION_SPANNABLE; | |
| 20 import '../util/characters.dart' show $CR, $LF; | 18 import '../util/characters.dart' show $CR, $LF; |
| 21 | 19 |
| 22 import 'source_mirrors.dart'; | 20 import 'source_mirrors.dart'; |
| 23 import 'mirrors_util.dart'; | 21 import 'mirrors_util.dart'; |
| 24 import 'util.dart'; | |
| 25 | 22 |
| 26 part 'dart2js_library_mirror.dart'; | 23 part 'dart2js_library_mirror.dart'; |
| 27 part 'dart2js_type_mirrors.dart'; | 24 part 'dart2js_type_mirrors.dart'; |
| 28 part 'dart2js_member_mirrors.dart'; | 25 part 'dart2js_member_mirrors.dart'; |
| 29 part 'dart2js_instance_mirrors.dart'; | 26 part 'dart2js_instance_mirrors.dart'; |
| 30 | 27 |
| 31 //------------------------------------------------------------------------------ | 28 //------------------------------------------------------------------------------ |
| 32 // Utility types and functions for the dart2js mirror system | 29 // Utility types and functions for the dart2js mirror system |
| 33 //------------------------------------------------------------------------------ | 30 //------------------------------------------------------------------------------ |
| 34 | 31 |
| 32 bool _includeLibrary(Dart2JsLibraryMirror mirror) { |
| 33 return const bool.fromEnvironment("list_all_libraries") || |
| 34 !mirror._element.isInternalLibrary; |
| 35 } |
| 36 |
| 35 bool _isPrivate(String name) { | 37 bool _isPrivate(String name) { |
| 36 return name.startsWith('_'); | 38 return name.startsWith('_'); |
| 37 } | 39 } |
| 38 | 40 |
| 39 List<ParameterMirror> _parametersFromFunctionSignature( | 41 List<ParameterMirror> _parametersFromFunctionSignature( |
| 40 Dart2JsDeclarationMirror owner, | 42 Dart2JsDeclarationMirror owner, |
| 41 FunctionSignature signature) { | 43 FunctionSignature signature) { |
| 42 var parameters = <ParameterMirror>[]; | 44 var parameters = <ParameterMirror>[]; |
| 43 Link<Element> link = signature.requiredParameters; | 45 Link<Element> link = signature.requiredParameters; |
| 44 while (!link.isEmpty) { | 46 while (!link.isEmpty) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 return 13 * _element.hashCode + 17 * owner.hashCode; | 277 return 13 * _element.hashCode + 17 * owner.hashCode; |
| 276 } | 278 } |
| 277 } | 279 } |
| 278 | 280 |
| 279 //------------------------------------------------------------------------------ | 281 //------------------------------------------------------------------------------ |
| 280 // Mirror system implementation. | 282 // Mirror system implementation. |
| 281 //------------------------------------------------------------------------------ | 283 //------------------------------------------------------------------------------ |
| 282 | 284 |
| 283 class Dart2JsMirrorSystem extends MirrorSystem { | 285 class Dart2JsMirrorSystem extends MirrorSystem { |
| 284 final Compiler compiler; | 286 final Compiler compiler; |
| 285 Map<Uri, Dart2JsLibraryMirror> _libraries; | |
| 286 Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap; | 287 Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap; |
| 288 UnmodifiableMapView<Uri, LibraryMirror> _filteredLibraries; |
| 287 | 289 |
| 288 Dart2JsMirrorSystem(this.compiler) | 290 Dart2JsMirrorSystem(this.compiler); |
| 289 : _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>(); | |
| 290 | 291 |
| 291 IsolateMirror get isolate => null; | 292 IsolateMirror get isolate => null; |
| 292 | 293 |
| 293 void _ensureLibraries() { | 294 void _ensureLibraries() { |
| 294 if (_libraries == null) { | 295 if (_filteredLibraries == null) { |
| 295 _libraries = new Map<Uri, Dart2JsLibraryMirror>(); | 296 var filteredLibs = new Map<Uri, LibraryMirror>(); |
| 297 _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>(); |
| 296 compiler.libraries.forEach((_, LibraryElement v) { | 298 compiler.libraries.forEach((_, LibraryElement v) { |
| 297 var mirror = new Dart2JsLibraryMirror(mirrorSystem, v); | 299 var mirror = new Dart2JsLibraryMirror(mirrorSystem, v); |
| 298 _libraries[mirror.uri] = mirror; | 300 if (_includeLibrary(mirror)) { |
| 301 filteredLibs[mirror.uri] = mirror; |
| 302 } |
| 299 _libraryMap[v] = mirror; | 303 _libraryMap[v] = mirror; |
| 300 }); | 304 }); |
| 305 |
| 306 _filteredLibraries = |
| 307 new UnmodifiableMapView<Uri, LibraryMirror>(filteredLibs); |
| 301 } | 308 } |
| 302 } | 309 } |
| 303 | 310 |
| 304 Map<Uri, LibraryMirror> get libraries { | 311 Map<Uri, LibraryMirror> get libraries { |
| 305 _ensureLibraries(); | 312 _ensureLibraries(); |
| 306 return new FilteredImmutableMap<Uri, LibraryMirror>(_libraries, | 313 return _filteredLibraries; |
| 307 (library) => const bool.fromEnvironment("list_all_libraries") || | |
| 308 !library._element.isInternalLibrary); | |
| 309 } | 314 } |
| 310 | 315 |
| 311 Dart2JsLibraryMirror _getLibrary(LibraryElement element) => | 316 Dart2JsLibraryMirror _getLibrary(LibraryElement element) => |
| 312 _libraryMap[element]; | 317 _libraryMap[element]; |
| 313 | 318 |
| 314 Dart2JsMirrorSystem get mirrorSystem => this; | 319 Dart2JsMirrorSystem get mirrorSystem => this; |
| 315 | 320 |
| 316 TypeMirror get dynamicType => | 321 TypeMirror get dynamicType => |
| 317 _convertTypeToTypeMirror(compiler.types.dynamicType); | 322 _convertTypeToTypeMirror(compiler.types.dynamicType); |
| 318 | 323 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 return new Dart2JsClassDeclarationMirror(this, element.thisType); | 358 return new Dart2JsClassDeclarationMirror(this, element.thisType); |
| 354 } else if (element.isTypedef()) { | 359 } else if (element.isTypedef()) { |
| 355 return new Dart2JsTypedefDeclarationMirror(this, element.thisType); | 360 return new Dart2JsTypedefDeclarationMirror(this, element.thisType); |
| 356 } | 361 } |
| 357 compiler.internalError(element, "Unexpected element $element."); | 362 compiler.internalError(element, "Unexpected element $element."); |
| 358 return null; | 363 return null; |
| 359 } | 364 } |
| 360 } | 365 } |
| 361 | 366 |
| 362 abstract class ContainerMixin { | 367 abstract class ContainerMixin { |
| 363 Map<Symbol, DeclarationMirror> _declarations; | 368 UnmodifiableMapView<Symbol, DeclarationMirror> _declarations; |
| 364 | 369 |
| 365 void _ensureDeclarations() { | 370 void _ensureDeclarations() { |
| 366 if (_declarations == null) { | 371 if (_declarations == null) { |
| 367 _declarations = <Symbol, DeclarationMirror>{}; | 372 var declarations = <Symbol, DeclarationMirror>{}; |
| 368 _forEachElement((Element element) { | 373 _forEachElement((Element element) { |
| 369 for (DeclarationMirror mirror in _getDeclarationMirrors(element)) { | 374 for (DeclarationMirror mirror in _getDeclarationMirrors(element)) { |
| 370 assert(invariant(_element, | 375 assert(invariant(_element, |
| 371 !_declarations.containsKey(mirror.simpleName), | 376 !declarations.containsKey(mirror.simpleName), |
| 372 message: "Declaration name '${nameOf(mirror)}' " | 377 message: "Declaration name '${nameOf(mirror)}' " |
| 373 "is not unique in $_element.")); | 378 "is not unique in $_element.")); |
| 374 _declarations[mirror.simpleName] = mirror; | 379 declarations[mirror.simpleName] = mirror; |
| 375 } | 380 } |
| 376 }); | 381 }); |
| 382 _declarations = |
| 383 new UnmodifiableMapView<Symbol, DeclarationMirror>(declarations); |
| 377 } | 384 } |
| 378 } | 385 } |
| 379 | 386 |
| 380 Element get _element; | 387 Element get _element; |
| 381 | 388 |
| 382 void _forEachElement(f(Element element)); | 389 void _forEachElement(f(Element element)); |
| 383 | 390 |
| 384 Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element); | 391 Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element); |
| 385 | 392 |
| 386 Map<Symbol, DeclarationMirror> get declarations { | 393 Map<Symbol, DeclarationMirror> get declarations { |
| 387 _ensureDeclarations(); | 394 _ensureDeclarations(); |
| 388 return new ImmutableMapWrapper<Symbol, DeclarationMirror>(_declarations); | 395 return _declarations; |
| 389 } | 396 } |
| 390 } | 397 } |
| 391 | 398 |
| 392 /** | 399 /** |
| 393 * Converts [element] into its corresponding [DeclarationMirror], if any. | 400 * Converts [element] into its corresponding [DeclarationMirror], if any. |
| 394 * | 401 * |
| 395 * If [element] is an [AbstractFieldElement] the mirror for its getter is | 402 * If [element] is an [AbstractFieldElement] the mirror for its getter is |
| 396 * returned or, if not present, the mirror for its setter. | 403 * returned or, if not present, the mirror for its setter. |
| 397 */ | 404 */ |
| 398 DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system, | 405 DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 426 container._getDeclarationMirrors(element); | 433 container._getDeclarationMirrors(element); |
| 427 if (members.isEmpty) return null; | 434 if (members.isEmpty) return null; |
| 428 return members.first; | 435 return members.first; |
| 429 } | 436 } |
| 430 | 437 |
| 431 /** | 438 /** |
| 432 * Experimental API for accessing compilation units defined in a | 439 * Experimental API for accessing compilation units defined in a |
| 433 * library. | 440 * library. |
| 434 */ | 441 */ |
| 435 // TODO(ahe): Superclasses? Is this really a mirror? | 442 // TODO(ahe): Superclasses? Is this really a mirror? |
| 436 class Dart2JsCompilationUnitMirror extends Dart2JsMirror | 443 class Dart2JsCompilationUnitMirror extends Dart2JsMirror with ContainerMixin { |
| 437 with ContainerMixin { | |
| 438 final Dart2JsLibraryMirror _library; | 444 final Dart2JsLibraryMirror _library; |
| 439 final CompilationUnitElement _element; | 445 final CompilationUnitElement _element; |
| 440 | 446 |
| 441 Dart2JsCompilationUnitMirror(this._element, this._library); | 447 Dart2JsCompilationUnitMirror(this._element, this._library); |
| 442 | 448 |
| 443 Dart2JsMirrorSystem get mirrorSystem => _library.mirrorSystem; | 449 Dart2JsMirrorSystem get mirrorSystem => _library.mirrorSystem; |
| 444 | 450 |
| 445 // TODO(johnniwinther): make sure that these are returned in declaration | 451 // TODO(johnniwinther): make sure that these are returned in declaration |
| 446 // order. | 452 // order. |
| 447 void _forEachElement(f(Element element)) => _element.forEachLocalMember(f); | 453 void _forEachElement(f(Element element)) => _element.forEachLocalMember(f); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 458 * | 464 * |
| 459 * All API in this class is experimental. | 465 * All API in this class is experimental. |
| 460 */ | 466 */ |
| 461 class BackDoor { | 467 class BackDoor { |
| 462 /// Return the compilation units comprising [library]. | 468 /// Return the compilation units comprising [library]. |
| 463 static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) { | 469 static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) { |
| 464 return library._element.compilationUnits.toList().map( | 470 return library._element.compilationUnits.toList().map( |
| 465 (cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList(); | 471 (cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList(); |
| 466 } | 472 } |
| 467 } | 473 } |
| OLD | NEW |