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

Side by Side Diff: pkg/docgen/lib/docgen.dart

Issue 21699002: annotation with parameters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 /** 5 /**
6 * **docgen** is a tool for creating machine readable representations of Dart 6 * **docgen** is a tool for creating machine readable representations of Dart
7 * code metadata, including: classes, members, comments and annotations. 7 * code metadata, including: classes, members, comments and annotations.
8 * 8 *
9 * docgen is run on a `.dart` file or a directory containing `.dart` files. 9 * docgen is run on a `.dart` file or a directory containing `.dart` files.
10 * 10 *
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 // results. 231 // results.
232 _writeToFile(filteredEntities.map((e) => e.qualifiedName).join('\n'), 232 _writeToFile(filteredEntities.map((e) => e.qualifiedName).join('\n'),
233 'index.txt', append: append); 233 'index.txt', append: append);
234 } 234 }
235 235
236 Library generateLibrary(dart2js.Dart2JsLibraryMirror library) { 236 Library generateLibrary(dart2js.Dart2JsLibraryMirror library) {
237 _currentLibrary = library; 237 _currentLibrary = library;
238 var result = new Library(library.qualifiedName, _commentToHtml(library), 238 var result = new Library(library.qualifiedName, _commentToHtml(library),
239 _variables(library.variables), 239 _variables(library.variables),
240 _methods(library.functions), 240 _methods(library.functions),
241 _classes(library.classes), _isPrivate(library)); 241 _classes(library.classes), _isHidden(library));
242 logger.fine('Generated library for ${result.name}'); 242 logger.fine('Generated library for ${result.name}');
243 return result; 243 return result;
244 } 244 }
245 245
246 void _writeIndexableToFile(Indexable result, bool outputToYaml) { 246 void _writeIndexableToFile(Indexable result, bool outputToYaml) {
247 if (outputToYaml) { 247 if (outputToYaml) {
248 _writeToFile(getYamlString(result.toMap()), '${result.qualifiedName}.yaml'); 248 _writeToFile(getYamlString(result.toMap()), '${result.qualifiedName}.yaml');
249 } else { 249 } else {
250 _writeToFile(stringify(result.toMap()), '${result.qualifiedName}.json'); 250 _writeToFile(stringify(result.toMap()), '${result.qualifiedName}.json');
251 } 251 }
(...skipping 10 matching lines...) Expand all
262 bool _isLibraryPrivate(LibraryMirror mirror) { 262 bool _isLibraryPrivate(LibraryMirror mirror) {
263 if (mirror.simpleName.startsWith('_') || mirror.simpleName.contains('._')) { 263 if (mirror.simpleName.startsWith('_') || mirror.simpleName.contains('._')) {
264 return true; 264 return true;
265 } 265 }
266 return false; 266 return false;
267 } 267 }
268 268
269 /** 269 /**
270 * A declaration is private if itself is private, or the owner is private. 270 * A declaration is private if itself is private, or the owner is private.
271 */ 271 */
272 bool _isPrivate(DeclarationMirror mirror) { 272 // Issue(12202) - A declaration is public even if it's owner is private.
273 bool _isHidden(DeclarationMirror mirror) {
273 if (mirror is LibraryMirror) { 274 if (mirror is LibraryMirror) {
274 return _isLibraryPrivate(mirror); 275 return _isLibraryPrivate(mirror);
275 } else if (mirror.owner is LibraryMirror) { 276 } else if (mirror.owner is LibraryMirror) {
276 return (mirror.isPrivate || _isLibraryPrivate(mirror.owner)); 277 return (mirror.isPrivate || _isLibraryPrivate(mirror.owner));
277 } else { 278 } else {
278 return (mirror.isPrivate || _isPrivate(mirror.owner)); 279 return (mirror.isPrivate || _isHidden(mirror.owner));
279 } 280 }
280 } 281 }
281 282
282 bool _isVisible(Indexable item) { 283 bool _isVisible(Indexable item) {
283 return _includePrivate || !item.isPrivate; 284 return _includePrivate || !item.isPrivate;
284 } 285 }
285 286
286 /** 287 /**
287 * Returns a list of meta annotations assocated with a mirror. 288 * Returns a list of meta annotations assocated with a mirror.
288 */ 289 */
289 List<String> _annotations(DeclarationMirror mirror) { 290 List<String> _annotations(DeclarationMirror mirror) {
290 var annotations = mirror.metadata.where((e) => 291 var annotationMirrors = mirror.metadata.where((e) =>
291 e is dart2js.Dart2JsConstructedConstantMirror); 292 e is dart2js.Dart2JsConstructedConstantMirror);
292 return annotations.map((e) => e.type.qualifiedName).toList(); 293 var annotations = [];
294 annotationMirrors.forEach((annotation) {
295 var parameterList = annotation.type.variables.values
296 .where((e) => e.isFinal)
297 .map((e) => annotation.getField(e.simpleName).reflectee)
298 .where((e) => e != null)
299 .toList();
300 annotations.add(new Annotation(annotation.type.qualifiedName,
301 parameterList));
302 });
303 return annotations;
293 } 304 }
294 305
295 /** 306 /**
296 * Returns any documentation comments associated with a mirror with 307 * Returns any documentation comments associated with a mirror with
297 * simple markdown converted to html. 308 * simple markdown converted to html.
298 */ 309 */
299 String _commentToHtml(DeclarationMirror mirror) { 310 String _commentToHtml(DeclarationMirror mirror) {
300 String commentText; 311 String commentText;
301 mirror.metadata.forEach((metadata) { 312 mirror.metadata.forEach((metadata) {
302 if (metadata is CommentInstanceMirror) { 313 if (metadata is CommentInstanceMirror) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 346
336 /** 347 /**
337 * Returns a map of [Variable] objects constructed from [mirrorMap]. 348 * Returns a map of [Variable] objects constructed from [mirrorMap].
338 */ 349 */
339 Map<String, Variable> _variables(Map<String, VariableMirror> mirrorMap) { 350 Map<String, Variable> _variables(Map<String, VariableMirror> mirrorMap) {
340 var data = {}; 351 var data = {};
341 // TODO(janicejl): When map to map feature is created, replace the below with 352 // TODO(janicejl): When map to map feature is created, replace the below with
342 // a filter. Issue(#9590). 353 // a filter. Issue(#9590).
343 mirrorMap.forEach((String mirrorName, VariableMirror mirror) { 354 mirrorMap.forEach((String mirrorName, VariableMirror mirror) {
344 _currentMember = mirror; 355 _currentMember = mirror;
345 if (_includePrivate || !_isPrivate(mirror)) { 356 if (_includePrivate || !_isHidden(mirror)) {
346 entityMap[mirror.qualifiedName] = new Variable(mirrorName, mirror.isFinal, 357 entityMap[mirror.qualifiedName] = new Variable(mirrorName, mirror.isFinal,
347 mirror.isStatic, mirror.isConst, _type(mirror.type), 358 mirror.isStatic, mirror.isConst, _type(mirror.type),
348 _commentToHtml(mirror), _annotations(mirror), mirror.qualifiedName, 359 _commentToHtml(mirror), _annotations(mirror), mirror.qualifiedName,
349 _isPrivate(mirror), mirror.owner.qualifiedName); 360 _isHidden(mirror), mirror.owner.qualifiedName);
350 data[mirrorName] = entityMap[mirror.qualifiedName]; 361 data[mirrorName] = entityMap[mirror.qualifiedName];
351 } 362 }
352 }); 363 });
353 return data; 364 return data;
354 } 365 }
355 366
356 /** 367 /**
357 * Returns a map of [Method] objects constructed from [mirrorMap]. 368 * Returns a map of [Method] objects constructed from [mirrorMap].
358 */ 369 */
359 MethodGroup _methods(Map<String, MethodMirror> mirrorMap) { 370 MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
360 var group = new MethodGroup(); 371 var group = new MethodGroup();
361 mirrorMap.forEach((String mirrorName, MethodMirror mirror) { 372 mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
362 if (_includePrivate || !_isPrivate(mirror)) { 373 if (_includePrivate || !_isHidden(mirror)) {
363 group.addMethod(mirror); 374 group.addMethod(mirror);
364 } 375 }
365 }); 376 });
366 return group; 377 return group;
367 } 378 }
368 379
369 /** 380 /**
370 * Returns the [Class] for the given [mirror] has already been created, and if 381 * Returns the [Class] for the given [mirror] has already been created, and if
371 * it does not exist, creates it. 382 * it does not exist, creates it.
372 */ 383 */
373 Class _class(ClassMirror mirror) { 384 Class _class(ClassMirror mirror) {
374 var clazz = entityMap[mirror.qualifiedName]; 385 var clazz = entityMap[mirror.qualifiedName];
375 if (clazz == null) { 386 if (clazz == null) {
376 var superclass = mirror.superclass != null ? 387 var superclass = mirror.superclass != null ?
377 _class(mirror.superclass) : null; 388 _class(mirror.superclass) : null;
378 var interfaces = 389 var interfaces =
379 mirror.superinterfaces.map((interface) => _class(interface)); 390 mirror.superinterfaces.map((interface) => _class(interface));
380 clazz = new Class(mirror.simpleName, superclass, _commentToHtml(mirror), 391 clazz = new Class(mirror.simpleName, superclass, _commentToHtml(mirror),
381 interfaces.toList(), _variables(mirror.variables), 392 interfaces.toList(), _variables(mirror.variables),
382 _methods(mirror.methods), _annotations(mirror), _generics(mirror), 393 _methods(mirror.methods), _annotations(mirror), _generics(mirror),
383 mirror.qualifiedName, _isPrivate(mirror), mirror.owner.qualifiedName); 394 mirror.qualifiedName, _isHidden(mirror), mirror.owner.qualifiedName);
384 entityMap[mirror.qualifiedName] = clazz; 395 entityMap[mirror.qualifiedName] = clazz;
385 } 396 }
386 return clazz; 397 return clazz;
387 } 398 }
388 399
389 /** 400 /**
390 * Returns a map of [Class] objects constructed from [mirrorMap]. 401 * Returns a map of [Class] objects constructed from [mirrorMap].
391 */ 402 */
392 ClassGroup _classes(Map<String, ClassMirror> mirrorMap) { 403 ClassGroup _classes(Map<String, ClassMirror> mirrorMap) {
393 var group = new ClassGroup(); 404 var group = new ClassGroup();
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 if (_isVisible(superclass)) return superclass.qualifiedName; 640 if (_isVisible(superclass)) return superclass.qualifiedName;
630 return superclass.validSuperclass(); 641 return superclass.validSuperclass();
631 } 642 }
632 643
633 /// Generates a map describing the [Class] object. 644 /// Generates a map describing the [Class] object.
634 Map toMap() => { 645 Map toMap() => {
635 'name': name, 646 'name': name,
636 'qualifiedname': qualifiedName, 647 'qualifiedname': qualifiedName,
637 'comment': comment, 648 'comment': comment,
638 'superclass': validSuperclass(), 649 'superclass': validSuperclass(),
639 'implements': new List.from(interfaces.where(_isVisible) 650 'implements': interfaces.where(_isVisible)
640 .map((e) => e.qualifiedName)), 651 .map((e) => e.qualifiedName).toList(),
641 'subclass': new List.from(subclasses), 652 'subclass': subclasses,
642 'variables': recurseMap(variables), 653 'variables': recurseMap(variables),
643 'inheritedvariables': recurseMap(inheritedVariables), 654 'inheritedvariables': recurseMap(inheritedVariables),
644 'methods': methods.toMap(), 655 'methods': methods.toMap(),
645 'inheritedmethods': inheritedMethods.toMap(), 656 'inheritedmethods': inheritedMethods.toMap(),
646 'annotations': new List.from(annotations), 657 'annotations': annotations.map((a) => a.toMap()).toList(),
647 'generics': recurseMap(generics) 658 'generics': recurseMap(generics)
648 }; 659 };
649 } 660 }
650 661
651 /** 662 /**
652 * A container to categorize classes into the following groups: abstract 663 * A container to categorize classes into the following groups: abstract
653 * classes, regular classes, typedefs, and errors. 664 * classes, regular classes, typedefs, and errors.
654 */ 665 */
655 class ClassGroup { 666 class ClassGroup {
656 Map<String, Class> abstractClasses = {}; 667 Map<String, Class> abstractClasses = {};
(...skipping 13 matching lines...) Expand all
670 clazz.addInherited(parent); 681 clazz.addInherited(parent);
671 }); 682 });
672 683
673 if (isError(mirror.qualifiedName)) { 684 if (isError(mirror.qualifiedName)) {
674 errors[mirror.simpleName] = clazz; 685 errors[mirror.simpleName] = clazz;
675 } else if (mirror.isTypedef) { 686 } else if (mirror.isTypedef) {
676 if (_includePrivate || !mirror.isPrivate) { 687 if (_includePrivate || !mirror.isPrivate) {
677 entityMap[mirror.qualifiedName] = new Typedef(mirror.simpleName, 688 entityMap[mirror.qualifiedName] = new Typedef(mirror.simpleName,
678 mirror.value.returnType.qualifiedName, _commentToHtml(mirror), 689 mirror.value.returnType.qualifiedName, _commentToHtml(mirror),
679 _generics(mirror), _parameters(mirror.value.parameters), 690 _generics(mirror), _parameters(mirror.value.parameters),
680 _annotations(mirror), mirror.qualifiedName, _isPrivate(mirror), 691 _annotations(mirror), mirror.qualifiedName, _isHidden(mirror),
681 mirror.owner.qualifiedName); 692 mirror.owner.qualifiedName);
682 typedefs[mirror.simpleName] = entityMap[mirror.qualifiedName]; 693 typedefs[mirror.simpleName] = entityMap[mirror.qualifiedName];
683 } 694 }
684 } else if (mirror.isAbstract) { 695 } else if (mirror.isAbstract) {
685 abstractClasses[mirror.simpleName] = clazz; 696 abstractClasses[mirror.simpleName] = clazz;
686 } else if (mirror.isClass) { 697 } else if (mirror.isClass) {
687 regularClasses[mirror.simpleName] = clazz; 698 regularClasses[mirror.simpleName] = clazz;
688 } else { 699 } else {
689 throw new ArgumentError('${mirror.simpleName} - no class type match. '); 700 throw new ArgumentError('${mirror.simpleName} - no class type match. ');
690 } 701 }
691 } 702 }
692 703
693 /** 704 /**
694 * Checks if the given name is a key for any of the Class Maps. 705 * Checks if the given name is a key for any of the Class Maps.
695 */ 706 */
696 bool containsKey(String name) { 707 bool containsKey(String name) {
697 return abstractClasses.containsKey(name) || 708 return abstractClasses.containsKey(name) ||
698 regularClasses.containsKey(name) || 709 regularClasses.containsKey(name) ||
699 errors.containsKey(name); 710 errors.containsKey(name);
700 } 711 }
701 712
702 Map toMap() => { 713 Map toMap() => {
703 'abstract': new List.from(abstractClasses.values 714 'abstract': abstractClasses.values.where(_isVisible)
704 .where(_isVisible).map((e) => e.qualifiedName)), 715 .map((e) => e.qualifiedName).toList(),
705 'class': new List.from(regularClasses.values 716 'class': regularClasses.values.where(_isVisible)
706 .where(_isVisible).map((e) => e.qualifiedName)), 717 .map((e) => e.qualifiedName).toList(),
707 'typedef': recurseMap(typedefs), 718 'typedef': recurseMap(typedefs),
708 'error': new List.from(errors.values 719 'error': errors.values.where(_isVisible)
709 .where(_isVisible).map((e) => e.qualifiedName)) 720 .map((e) => e.qualifiedName).toList()
710 }; 721 };
711 } 722 }
712 723
713 class Typedef extends Indexable { 724 class Typedef extends Indexable {
714 String returnType; 725 String returnType;
715 726
716 Map<String, Parameter> parameters; 727 Map<String, Parameter> parameters;
717 728
718 /// Generic information about the typedef. 729 /// Generic information about the typedef.
719 Map<String, Generic> generics; 730 Map<String, Generic> generics;
720 731
721 /// List of the meta annotations on the typedef. 732 /// List of the meta annotations on the typedef.
722 List<String> annotations; 733 List<String> annotations;
723 734
724 Typedef(String name, this.returnType, String comment, this.generics, 735 Typedef(String name, this.returnType, String comment, this.generics,
725 this.parameters, this.annotations, 736 this.parameters, this.annotations,
726 String qualifiedName, bool isPrivate, String owner) : super(name, comment, 737 String qualifiedName, bool isPrivate, String owner) : super(name, comment,
727 qualifiedName, isPrivate, owner) {} 738 qualifiedName, isPrivate, owner) {}
728 739
729 Map toMap() => { 740 Map toMap() => {
730 'name': name, 741 'name': name,
731 'qualifiedname': qualifiedName, 742 'qualifiedname': qualifiedName,
732 'comment': comment, 743 'comment': comment,
733 'return': returnType, 744 'return': returnType,
734 'parameters': recurseMap(parameters), 745 'parameters': recurseMap(parameters),
735 'annotations': new List.from(annotations), 746 'annotations': annotations.map((a) => a.toMap()).toList(),
736 'generics': recurseMap(generics) 747 'generics': recurseMap(generics)
737 }; 748 };
738 } 749 }
739 750
740 /** 751 /**
741 * A class containing properties of a Dart variable. 752 * A class containing properties of a Dart variable.
742 */ 753 */
743 class Variable extends Indexable { 754 class Variable extends Indexable {
744 755
745 bool isFinal; 756 bool isFinal;
(...skipping 10 matching lines...) Expand all
756 767
757 /// Generates a map describing the [Variable] object. 768 /// Generates a map describing the [Variable] object.
758 Map toMap() => { 769 Map toMap() => {
759 'name': name, 770 'name': name,
760 'qualifiedname': qualifiedName, 771 'qualifiedname': qualifiedName,
761 'comment': comment, 772 'comment': comment,
762 'final': isFinal.toString(), 773 'final': isFinal.toString(),
763 'static': isStatic.toString(), 774 'static': isStatic.toString(),
764 'constant': isConst.toString(), 775 'constant': isConst.toString(),
765 'type': new List.filled(1, type.toMap()), 776 'type': new List.filled(1, type.toMap()),
766 'annotations': new List.from(annotations) 777 'annotations': annotations.map((a) => a.toMap()).toList()
767 }; 778 };
768 } 779 }
769 780
770 /** 781 /**
771 * A class containing properties of a Dart method. 782 * A class containing properties of a Dart method.
772 */ 783 */
773 class Method extends Indexable { 784 class Method extends Indexable {
774 785
775 /// Parameters for this method. 786 /// Parameters for this method.
776 Map<String, Parameter> parameters; 787 Map<String, Parameter> parameters;
(...skipping 14 matching lines...) Expand all
791 /// Generates a map describing the [Method] object. 802 /// Generates a map describing the [Method] object.
792 Map toMap() => { 803 Map toMap() => {
793 'name': name, 804 'name': name,
794 'qualifiedname': qualifiedName, 805 'qualifiedname': qualifiedName,
795 'comment': comment, 806 'comment': comment,
796 'static': isStatic.toString(), 807 'static': isStatic.toString(),
797 'abstract': isAbstract.toString(), 808 'abstract': isAbstract.toString(),
798 'constant': isConst.toString(), 809 'constant': isConst.toString(),
799 'return': new List.filled(1, returnType.toMap()), 810 'return': new List.filled(1, returnType.toMap()),
800 'parameters': recurseMap(parameters), 811 'parameters': recurseMap(parameters),
801 'annotations': new List.from(annotations) 812 'annotations': annotations.map((a) => a.toMap()).toList()
802 }; 813 };
803 } 814 }
804 815
805 /** 816 /**
806 * A container to categorize methods into the following groups: setters, 817 * A container to categorize methods into the following groups: setters,
807 * getters, constructors, operators, regular methods. 818 * getters, constructors, operators, regular methods.
808 */ 819 */
809 class MethodGroup { 820 class MethodGroup {
810 Map<String, Method> setters = {}; 821 Map<String, Method> setters = {};
811 Map<String, Method> getters = {}; 822 Map<String, Method> getters = {};
812 Map<String, Method> constructors = {}; 823 Map<String, Method> constructors = {};
813 Map<String, Method> operators = {}; 824 Map<String, Method> operators = {};
814 Map<String, Method> regularMethods = {}; 825 Map<String, Method> regularMethods = {};
815 826
816 void addMethod(MethodMirror mirror) { 827 void addMethod(MethodMirror mirror) {
817 var method = new Method(mirror.simpleName, mirror.isStatic, 828 var method = new Method(mirror.simpleName, mirror.isStatic,
818 mirror.isAbstract, mirror.isConstConstructor, _type(mirror.returnType), 829 mirror.isAbstract, mirror.isConstConstructor, _type(mirror.returnType),
819 _commentToHtml(mirror), _parameters(mirror.parameters), 830 _commentToHtml(mirror), _parameters(mirror.parameters),
820 _annotations(mirror), mirror.qualifiedName, _isPrivate(mirror), 831 _annotations(mirror), mirror.qualifiedName, _isHidden(mirror),
821 mirror.owner.qualifiedName); 832 mirror.owner.qualifiedName);
822 entityMap[mirror.qualifiedName] = method; 833 entityMap[mirror.qualifiedName] = method;
823 _currentMember = mirror; 834 _currentMember = mirror;
824 if (mirror.isSetter) { 835 if (mirror.isSetter) {
825 setters[mirror.simpleName] = method; 836 setters[mirror.simpleName] = method;
826 } else if (mirror.isGetter) { 837 } else if (mirror.isGetter) {
827 getters[mirror.simpleName] = method; 838 getters[mirror.simpleName] = method;
828 } else if (mirror.isConstructor) { 839 } else if (mirror.isConstructor) {
829 constructors[mirror.simpleName] = method; 840 constructors[mirror.simpleName] = method;
830 } else if (mirror.isOperator) { 841 } else if (mirror.isOperator) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 this.type, this.defaultValue, this.annotations); 888 this.type, this.defaultValue, this.annotations);
878 889
879 /// Generates a map describing the [Parameter] object. 890 /// Generates a map describing the [Parameter] object.
880 Map toMap() => { 891 Map toMap() => {
881 'name': name, 892 'name': name,
882 'optional': isOptional.toString(), 893 'optional': isOptional.toString(),
883 'named': isNamed.toString(), 894 'named': isNamed.toString(),
884 'default': hasDefaultValue.toString(), 895 'default': hasDefaultValue.toString(),
885 'type': new List.filled(1, type.toMap()), 896 'type': new List.filled(1, type.toMap()),
886 'value': defaultValue, 897 'value': defaultValue,
887 'annotations': new List.from(annotations) 898 'annotations': annotations.map((a) => a.toMap()).toList()
888 }; 899 };
889 } 900 }
890 901
891 /** 902 /**
892 * A class containing properties of a Generic. 903 * A class containing properties of a Generic.
893 */ 904 */
894 class Generic { 905 class Generic {
895 String name; 906 String name;
896 String type; 907 String type;
897 908
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 * "inner" : 945 * "inner" :
935 */ 946 */
936 class Type { 947 class Type {
937 String outer; 948 String outer;
938 List<Type> inner; 949 List<Type> inner;
939 950
940 Type(this.outer, this.inner); 951 Type(this.outer, this.inner);
941 952
942 Map toMap() => { 953 Map toMap() => {
943 'outer': outer, 954 'outer': outer,
944 'inner': new List.from(inner.map((e) => e.toMap())) 955 'inner': inner.map((e) => e.toMap()).toList()
956 };
957 }
958
959 /**
960 * Holds the name of the annotation, and its parameters.
961 */
962 class Annotation {
963 String qualifiedName;
964 List<String> parameters;
965
966 Annotation(this.qualifiedName, this.parameters);
967
968 Map toMap() => {
969 'name': qualifiedName,
970 'parameters': parameters
945 }; 971 };
946 } 972 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698