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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart

Issue 258753004: Use UnmodifiableMapView in compiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: a few more nits Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698