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

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

Issue 11571058: DeclarationMirror extended with metadata. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years 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 mirrors_dart2js; 5 library mirrors_dart2js;
6 6
7 import 'dart:io'; 7 import 'dart:io';
8 import 'dart:uri'; 8 import 'dart:uri';
9 9
10 import '../../compiler.dart' as diagnostics; 10 import '../../compiler.dart' as diagnostics;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 106
107 MethodMirror _convertElementMethodToMethodMirror(Dart2JsContainerMirror library, 107 MethodMirror _convertElementMethodToMethodMirror(Dart2JsContainerMirror library,
108 Element element) { 108 Element element) {
109 if (element is FunctionElement) { 109 if (element is FunctionElement) {
110 return new Dart2JsMethodMirror(library, element); 110 return new Dart2JsMethodMirror(library, element);
111 } else { 111 } else {
112 return null; 112 return null;
113 } 113 }
114 } 114 }
115 115
116 InstanceMirror _convertConstantToInstanceMirror(Dart2JsMirrorSystem mirrors,
117 Constant constant) {
118 if (constant is BoolConstant) {
119 return new Dart2JsBoolConstantMirror(mirrors, constant);
120 } else if (constant is NumConstant) {
121 return new Dart2JsNumConstantMirror(mirrors, constant);
122 } else if (constant is StringConstant) {
123 return new Dart2JsStringConstantMirror(mirrors, constant);
124 } else if (constant is ListConstant) {
125 return new Dart2JsListConstantMirror(mirrors, constant);
126 } else if (constant is MapConstant) {
127 return new Dart2JsMapConstantMirror(mirrors, constant);
128 } else if (constant is TypeConstant) {
129 return new Dart2JsTypeConstantMirror(mirrors, constant);
130 } else if (constant is FunctionConstant) {
131 return new Dart2JsConstantMirror(mirrors, constant);
132 } else if (constant is NullConstant) {
133 // TODO(johnniwinther): Introduce a special ClassMirror for the null type?
ahe 2012/12/19 15:44:03 Why? null is an instance of Null.
Johnni Winther 2012/12/20 11:30:35 Null is currently an internal class in js_helper,
134 return new Dart2JsNullConstantMirror(mirrors, constant);
135 } else if (constant is ConstructedConstant) {
136 return new Dart2JsConstructedConstantMirror(mirrors, constant);
137 }
138 throw new ArgumentError(
ahe 2012/12/19 15:44:03 This is an internal error as _convertConstantToIns
Johnni Winther 2012/12/20 11:30:35 Changed to InternalError (+ some more places).
139 "Unexpected constant $constant");
140 }
141
116 class Dart2JsMethodKind { 142 class Dart2JsMethodKind {
117 static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular"); 143 static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular");
118 static const Dart2JsMethodKind GENERATIVE = 144 static const Dart2JsMethodKind GENERATIVE =
119 const Dart2JsMethodKind("generative"); 145 const Dart2JsMethodKind("generative");
120 static const Dart2JsMethodKind REDIRECTING = 146 static const Dart2JsMethodKind REDIRECTING =
121 const Dart2JsMethodKind("redirecting"); 147 const Dart2JsMethodKind("redirecting");
122 static const Dart2JsMethodKind CONST = const Dart2JsMethodKind("const"); 148 static const Dart2JsMethodKind CONST = const Dart2JsMethodKind("const");
123 static const Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory"); 149 static const Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory");
124 static const Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter"); 150 static const Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter");
125 static const Dart2JsMethodKind SETTER = const Dart2JsMethodKind("setter"); 151 static const Dart2JsMethodKind SETTER = const Dart2JsMethodKind("setter");
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 476
451 String get displayName => simpleName; 477 String get displayName => simpleName;
452 478
453 SourceLocation get location => new Dart2JsSourceLocation( 479 SourceLocation get location => new Dart2JsSourceLocation(
454 _element.getCompilationUnit().script, 480 _element.getCompilationUnit().script,
455 mirrors.compiler.spanFromElement(_element)); 481 mirrors.compiler.spanFromElement(_element));
456 482
457 String toString() => _element.toString(); 483 String toString() => _element.toString();
458 484
459 int get hashCode => qualifiedName.hashCode; 485 int get hashCode => qualifiedName.hashCode;
486
487 List<InstanceMirror> get metadata {
488 var list = <InstanceMirror>[];
489 for (MetadataAnnotation metadata in _element.metadata) {
490 metadata.ensureResolved(mirrors.compiler);
491 list.add(_convertConstantToInstanceMirror(mirrors, metadata.value));
492 }
493 return list;
494 }
460 } 495 }
461 496
462 abstract class Dart2JsProxyMirror extends Dart2JsDeclarationMirror { 497 abstract class Dart2JsProxyMirror extends Dart2JsDeclarationMirror {
463 final Dart2JsMirrorSystem mirrors; 498 final Dart2JsMirrorSystem mirrors;
464 499
465 Dart2JsProxyMirror(this.mirrors); 500 Dart2JsProxyMirror(this.mirrors);
466 501
467 String get displayName => simpleName; 502 String get displayName => simpleName;
468 503
469 int get hashCode => qualifiedName.hashCode; 504 int get hashCode => qualifiedName.hashCode;
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 SourceLocation get location { 677 SourceLocation get location {
643 var script = _library.getCompilationUnit().script; 678 var script = _library.getCompilationUnit().script;
644 SourceSpan span; 679 SourceSpan span;
645 if (_library.libraryTag != null) { 680 if (_library.libraryTag != null) {
646 span = mirrors.compiler.spanFromNode(_library.libraryTag, script.uri); 681 span = mirrors.compiler.spanFromNode(_library.libraryTag, script.uri);
647 } else { 682 } else {
648 span = new SourceSpan(script.uri, 0, 0); 683 span = new SourceSpan(script.uri, 0, 0);
649 } 684 }
650 return new Dart2JsSourceLocation(script, span); 685 return new Dart2JsSourceLocation(script, span);
651 } 686 }
687
688
ahe 2012/12/19 15:44:03 Remove extra lines.
Johnni Winther 2012/12/20 11:30:35 Done.
652 } 689 }
653 690
654 class Dart2JsSourceLocation implements SourceLocation { 691 class Dart2JsSourceLocation implements SourceLocation {
655 final Script _script; 692 final Script _script;
656 final SourceSpan _span; 693 final SourceSpan _span;
657 int _line; 694 int _line;
658 int _column; 695 int _column;
659 696
660 Dart2JsSourceLocation(this._script, this._span); 697 Dart2JsSourceLocation(this._script, this._span);
661 698
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 1161
1125 Map<String, MethodMirror> get methods => const <String, MethodMirror>{}; 1162 Map<String, MethodMirror> get methods => const <String, MethodMirror>{};
1126 1163
1127 Map<String, MethodMirror> get getters => const <String, MethodMirror>{}; 1164 Map<String, MethodMirror> get getters => const <String, MethodMirror>{};
1128 1165
1129 Map<String, MethodMirror> get setters => const <String, MethodMirror>{}; 1166 Map<String, MethodMirror> get setters => const <String, MethodMirror>{};
1130 1167
1131 Map<String, VariableMirror> get variables => const <String, VariableMirror>{}; 1168 Map<String, VariableMirror> get variables => const <String, VariableMirror>{};
1132 1169
1133 ClassMirror get defaultFactory => null; 1170 ClassMirror get defaultFactory => null;
1171
1172 // TODO(johnniwinther): Should a type show the metadata of its declaration?
1173 List<InstanceMirror> get metadata {
ahe 2012/12/19 15:44:03 My personal opinion on style: I don't like getters
Johnni Winther 2012/12/20 11:30:35 I don't either. Currently dart2js_mirror generally
Johnni Winther 2012/12/20 11:30:35 I don't either. Currently dart2js_mirror generally
1174 var list = <InstanceMirror>[];
1175 for (MetadataAnnotation metadata in _type.element.metadata) {
1176 metadata.ensureResolved(mirrors.compiler);
1177 list.add(_convertConstantToInstanceMirror(mirrors, metadata.value));
1178 }
1179 return list;
1180 }
1134 } 1181 }
1135 1182
1136 class Dart2JsInterfaceTypeMirror extends Dart2JsTypeElementMirror 1183 class Dart2JsInterfaceTypeMirror extends Dart2JsTypeElementMirror
1137 implements ClassMirror { 1184 implements ClassMirror {
1138 List<TypeMirror> _typeArguments; 1185 List<TypeMirror> _typeArguments;
1139 1186
1140 Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system, 1187 Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
1141 InterfaceType interfaceType) 1188 InterfaceType interfaceType)
1142 : super(system, interfaceType); 1189 : super(system, interfaceType);
1143 1190
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 var node = _variable.variables.parseNode(_diagnosticListener); 1605 var node = _variable.variables.parseNode(_diagnosticListener);
1559 if (node != null) { 1606 if (node != null) {
1560 var span = mirrors.compiler.spanFromNode(node, script.uri); 1607 var span = mirrors.compiler.spanFromNode(node, script.uri);
1561 return new Dart2JsSourceLocation(script, span); 1608 return new Dart2JsSourceLocation(script, span);
1562 } else { 1609 } else {
1563 var span = mirrors.compiler.spanFromElement(_variable); 1610 var span = mirrors.compiler.spanFromElement(_variable);
1564 return new Dart2JsSourceLocation(script, span); 1611 return new Dart2JsSourceLocation(script, span);
1565 } 1612 }
1566 } 1613 }
1567 } 1614 }
1615
1616 ////////////////////////////////////////////////////////////////////////////////
1617 // Mirrors on constant values used for metadata.
ahe 2012/12/19 15:44:03 Section comments don't work. A separate file or l
Johnni Winther 2012/12/20 11:30:35 Will do a split into multiple files at some point.
1618 ////////////////////////////////////////////////////////////////////////////////
1619
1620 class Dart2JsConstantMirror extends InstanceMirror {
1621 final Dart2JsMirrorSystem mirrors;
ahe 2012/12/19 15:44:03 If you store the type in a final, you don't need m
Johnni Winther 2012/12/20 11:30:35 It is required by the implemented Mirror interface
ahe 2013/01/03 12:03:05 The Mirror interface needs to be changed, then. A
Johnni Winther 2013/01/04 09:14:39 Added a TODO.
gbracha 2013/01/04 19:34:30 This is interesting collateral damage from the cha
1622 final Constant _constant;
1623
1624 Dart2JsConstantMirror(this.mirrors, this._constant);
1625
1626 ClassMirror get type => new Dart2JsClassMirror(
ahe 2012/12/19 15:44:03 If it doesn't fit on one line, my personal prefere
Johnni Winther 2012/12/20 11:30:35 Changed to { }
1627 mirrors, _constant.computeType(mirrors.compiler).element);
1628
1629 bool get hasReflectee => false;
1630
1631 get reflectee {
1632 // TODO(johnniwinther): Which exception/error should be thrown here?
1633 throw new UnsupportedError('InstanceMirror does not have a reflectee');
1634 }
1635
1636 Future<InstanceMirror> getField(String fieldName) {
1637 throw new NoSuchMethodError(this, fieldName, [], null);
ahe 2012/12/19 15:44:03 Why are you throwing NoSuchMethod?
Johnni Winther 2012/12/20 11:30:35 Changed to UnsupportedError and added a TODO. I'm
1638 }
1639 }
1640
1641 class Dart2JsNullConstantMirror extends Dart2JsConstantMirror {
1642 Dart2JsNullConstantMirror(Dart2JsMirrorSystem mirrors, NullConstant constant)
1643 : super(mirrors, constant);
1644
1645 NullConstant get _constant => super._constant;
1646
1647 bool get hasReflectee => true;
1648
1649 get reflectee => null;
1650 }
1651
1652 class Dart2JsBoolConstantMirror extends Dart2JsConstantMirror {
1653 Dart2JsBoolConstantMirror(Dart2JsMirrorSystem mirrors, BoolConstant constant)
1654 : super(mirrors, constant);
1655
1656 BoolConstant get _constant => super._constant;
1657
1658 bool get hasReflectee => true;
1659
1660 get reflectee => _constant is TrueConstant;
1661 }
1662
1663 class Dart2JsStringConstantMirror extends Dart2JsConstantMirror {
1664 Dart2JsStringConstantMirror(Dart2JsMirrorSystem mirrors,
1665 StringConstant constant)
ahe 2012/12/19 15:44:03 Indentation.
Johnni Winther 2012/12/20 11:30:35 Done.
1666 : super(mirrors, constant);
1667
1668 StringConstant get _constant => super._constant;
1669
1670 bool get hasReflectee => true;
1671
1672 get reflectee => _constant.value.slowToString();
1673 }
1674
1675 class Dart2JsNumConstantMirror extends Dart2JsConstantMirror {
1676 Dart2JsNumConstantMirror(Dart2JsMirrorSystem mirrors,
1677 NumConstant constant)
1678 : super(mirrors, constant);
1679
1680 NumConstant get _constant => super._constant;
1681
1682 bool get hasReflectee => true;
1683
1684 get reflectee => _constant.value;
1685 }
1686
1687 class Dart2JsListConstantMirror extends Dart2JsConstantMirror
1688 implements ListInstanceMirror {
1689 Dart2JsListConstantMirror(Dart2JsMirrorSystem mirrors,
1690 ListConstant constant)
1691 : super(mirrors, constant);
1692
1693 ListConstant get _constant => super._constant;
1694
1695 int get length => _constant.length;
1696
1697 Future<InstanceMirror> operator[](int index) {
1698 if (index < 0) throw new RangeError('Negative index');
1699 if (index >= _constant.length) throw new RangeError('Index out of bounds');
1700 var completer = new Completer<InstanceMirror>();
ahe 2012/12/19 15:44:03 return new Future.immediate(_convertConstantToInst
Johnni Winther 2012/12/20 11:30:35 Done.
1701 completer.complete(
1702 _convertConstantToInstanceMirror(mirrors, _constant.entries[index]));
1703 return completer.future;
1704 }
1705 }
1706
1707 class Dart2JsMapConstantMirror extends Dart2JsConstantMirror
1708 implements MapInstanceMirror {
1709 List<String> _list;
1710
1711 Dart2JsMapConstantMirror(Dart2JsMirrorSystem mirrors,
1712 MapConstant constant)
1713 : super(mirrors, constant);
1714
1715 MapConstant get _constant => super._constant;
1716
1717 void _ensureKeyList() {
1718 if (_list == null) {
1719 _list = new List<String>();
ahe 2012/12/19 15:44:03 Could this be a fixed-size list?
Johnni Winther 2012/12/20 11:30:35 Done.
1720 for (StringConstant keyConstant in _constant.keys.entries) {
1721 _list.add(keyConstant.value.slowToString());
1722 }
1723 }
1724 }
1725
1726 int get length => _constant.length;
1727
1728 Collection<String> get keys {
1729 _ensureKeyList();
1730 // TODO(johnniwinther): Return an unmodifiable list.
1731 return _list;
ahe 2012/12/19 15:44:03 return new List<String>.from(_list)
Johnni Winther 2012/12/20 11:30:35 Done.
1732 }
1733
1734 Future<InstanceMirror> operator[](String key) {
1735 _ensureKeyList();
1736 int index = _list.indexOf(key);
ahe 2012/12/19 15:44:03 How about using "keys" instead. Then you don't ne
Johnni Winther 2012/12/20 11:30:35 I don't want to copy the keys list as is now done
ahe 2013/01/03 12:23:02 Sounds like you need a todo for updating this code
Johnni Winther 2013/01/04 09:14:39 Changed to _ensureKeyList to _getKeyList which ret
1737 if (index == -1) return null;
1738 var completer = new Completer<InstanceMirror>();
ahe 2012/12/19 15:44:03 Future.immediate
Johnni Winther 2012/12/20 11:30:35 Done.
1739 completer.complete(
1740 _convertConstantToInstanceMirror(mirrors, _constant.values[index]));
1741 return completer.future;
1742 }
1743 }
1744
1745 class Dart2JsTypeConstantMirror extends Dart2JsConstantMirror
1746 implements TypeInstanceMirror {
1747
1748 Dart2JsTypeConstantMirror(Dart2JsMirrorSystem mirrors,
1749 TypeConstant constant)
1750 : super(mirrors, constant);
1751
1752 TypeConstant get _constant => super._constant;
1753
1754 TypeMirror get representedType => _convertTypeToTypeMirror(
1755 mirrors, _constant.representedType, mirrors.compiler.types.dynamicType);
1756
ahe 2012/12/19 15:44:03 Extra line.
Johnni Winther 2012/12/20 11:30:35 Done.
1757 }
1758
1759 class Dart2JsConstructedConstantMirror extends Dart2JsConstantMirror {
1760
1761 Dart2JsConstructedConstantMirror(Dart2JsMirrorSystem mirrors,
1762 ConstructedConstant constant)
1763 : super(mirrors, constant);
1764
1765 ConstructedConstant get _constant => super._constant;
1766
1767 Future<InstanceMirror> getField(String fieldName) {
1768 if (identical(_constant.type.element.kind, ElementKind.CLASS)) {
1769 ClassElement element = _constant.type.element;
1770 var fieldConstant = null;
1771 var index = 0;
1772 element.forEachInstanceField((_, Element field) {
1773 if (field.name.slowToString() == fieldName) {
1774 fieldConstant = _constant.fields[index];
ahe 2012/12/19 15:44:03 You need to stop iterating when a match is found:
Johnni Winther 2012/12/20 11:30:35 Done.
Johnni Winther 2012/12/20 11:30:35 Changed to compute a field map instead.
1775 }
1776 index++;
1777 }, includeBackendMembers: true, includeSuperMembers: true);
1778 if (fieldConstant != null) {
1779 var completer = new Completer<InstanceMirror>();
ahe 2012/12/19 15:44:03 Future.immediate.
Johnni Winther 2012/12/20 11:30:35 Done.
1780 completer.complete(
1781 _convertConstantToInstanceMirror(mirrors, fieldConstant));
1782 return completer.future;
1783 }
1784 }
1785 return super.getField(fieldName);
1786 }
1787
ahe 2012/12/19 15:44:03 Extra line.
Johnni Winther 2012/12/20 11:30:35 Done.
1788 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698