@@ -875,12 +875,12 @@ class Field extends ModelElement
875875 void _setModelType () {
876876 if (hasGetter) {
877877 var t = _field.getter.returnType;
878- _modelType = new ElementType (t,
879- new ModelElement .from (t.element, package. _getLibraryFor (t.element)));
878+ _modelType = new ElementType (
879+ t, new ModelElement .from (t.element, _findLibraryFor (t.element)));
880880 } else {
881881 var s = _field.setter.parameters.first.type;
882- _modelType = new ElementType (s,
883- new ModelElement .from (s.element, package. _getLibraryFor (s.element)));
882+ _modelType = new ElementType (
883+ s, new ModelElement .from (s.element, _findLibraryFor (s.element)));
884884 }
885885 }
886886}
@@ -1532,36 +1532,35 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
15321532
15331533 String linkedParams (
15341534 {bool showMetadata: true , bool showNames: true , String separator: ', ' }) {
1535- String renderParam (Parameter p) {
1535+
1536+ String renderParam (Parameter param, String suffix) {
15361537 StringBuffer buf = new StringBuffer ();
1537- buf.write ('<span class="parameter" id="${p .htmlId }">' );
1538- if (showMetadata && p.hasAnnotations) {
1539- buf.write ('<ol class="annotation-list">' );
1540- p.annotations.forEach ((String annotation) {
1541- buf.write ('<li>$annotation </li>' );
1538+ buf.write ('<span class="parameter" id="${param .htmlId }">' );
1539+ if (showMetadata && param.hasAnnotations) {
1540+ param.annotations.forEach ((String annotation) {
1541+ buf.write ('<span>@$annotation </span> ' );
15421542 });
1543- buf.write ('</ol> ' );
15441543 }
1545- if (p .modelType.isFunctionType) {
1544+ if (param .modelType.isFunctionType) {
15461545 var returnTypeName;
1547- bool isTypedef = p .modelType.element is Typedef ;
1546+ bool isTypedef = param .modelType.element is Typedef ;
15481547 if (isTypedef) {
1549- returnTypeName = p .modelType.linkedName;
1548+ returnTypeName = param .modelType.linkedName;
15501549 } else {
1551- returnTypeName = p .modelType.createLinkedReturnTypeName ();
1550+ returnTypeName = param .modelType.createLinkedReturnTypeName ();
15521551 }
15531552 buf.write ('<span class="type-annotation">${returnTypeName }</span>' );
15541553 if (showNames) {
1555- buf.write (' <span class="parameter-name">${p .name }</span>' );
1554+ buf.write (' <span class="parameter-name">${param .name }</span>' );
15561555 }
15571556 if (! isTypedef) {
15581557 buf.write ('(' );
1559- buf.write (p .modelType.element
1558+ buf.write (param .modelType.element
15601559 .linkedParams (showNames: showNames, showMetadata: showMetadata));
15611560 buf.write (')' );
15621561 }
1563- } else if (p .modelType != null && p .modelType.element != null ) {
1564- var mt = p .modelType;
1562+ } else if (param .modelType != null && param .modelType.element != null ) {
1563+ var mt = param .modelType;
15651564 String typeName = "" ;
15661565 if (mt != null && ! mt.isDynamic) {
15671566 typeName = mt.linkedName;
@@ -1570,46 +1569,71 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
15701569 buf.write ('<span class="type-annotation">$typeName </span> ' );
15711570 }
15721571 if (showNames) {
1573- buf.write ('<span class="parameter-name">${p .name }</span>' );
1572+ buf.write ('<span class="parameter-name">${param .name }</span>' );
15741573 }
15751574 }
15761575
1577- if (p .hasDefaultValue) {
1578- if (p .isOptionalNamed) {
1576+ if (param .hasDefaultValue) {
1577+ if (param .isOptionalNamed) {
15791578 buf.write (': ' );
15801579 } else {
15811580 buf.write (' = ' );
15821581 }
1583- buf.write ('<span class="default-value">${p .defaultValue }</span>' );
1582+ buf.write ('<span class="default-value">${param .defaultValue }</span>' );
15841583 }
1585- buf.write ('</span>' );
1584+ buf.write ('${ suffix } </span>' );
15861585 return buf.toString ();
15871586 }
15881587
1589- String renderParams (Iterable <Parameter > params,
1590- {String open: '' , String close: '' }) {
1591- return '$open ${params .map (renderParam ).join (separator )}$close ' ;
1592- }
1588+ List <Parameter > requiredParams =
1589+ parameters.where ((Parameter p) => ! p.isOptional).toList ();
1590+ List <Parameter > positionalParams =
1591+ parameters.where ((Parameter p) => p.isOptionalPositional).toList ();
1592+ List <Parameter > namedParams =
1593+ parameters.where ((Parameter p) => p.isOptionalNamed).toList ();
15931594
1594- Iterable <Parameter > requiredParams =
1595- parameters.where ((Parameter p) => ! p.isOptional);
1596- Iterable <Parameter > positionalParams =
1597- parameters.where ((Parameter p) => p.isOptionalPositional);
1598- Iterable <Parameter > namedParams =
1599- parameters.where ((Parameter p) => p.isOptionalNamed);
1595+ StringBuffer builder = new StringBuffer ();
1596+
1597+ // prefix
1598+ if (requiredParams.isEmpty && positionalParams.isNotEmpty) {
1599+ builder.write ('[' );
1600+ } else if (requiredParams.isEmpty && namedParams.isNotEmpty) {
1601+ builder.write ('{' );
1602+ }
16001603
1601- List <String > fragments = [];
1602- if (requiredParams.isNotEmpty) {
1603- fragments.add (renderParams (requiredParams));
1604+ // index over params
1605+ for (Parameter param in requiredParams) {
1606+ bool isLast = param == requiredParams.last;
1607+ String ext;
1608+ if (isLast && positionalParams.isNotEmpty) {
1609+ ext = ', [' ;
1610+ } else if (isLast && namedParams.isNotEmpty) {
1611+ ext = ', {' ;
1612+ } else {
1613+ ext = isLast ? '' : ', ' ;
1614+ }
1615+ builder.write (renderParam (param, ext));
1616+ builder.write (' ' );
16041617 }
1605- if (positionalParams.isNotEmpty) {
1606- fragments.add (renderParams (positionalParams, open: '[' , close: ']' ));
1618+ for (Parameter param in positionalParams) {
1619+ bool isLast = param == positionalParams.last;
1620+ builder.write (renderParam (param, isLast ? '' : ', ' ));
1621+ builder.write (' ' );
16071622 }
1623+ for (Parameter param in namedParams) {
1624+ bool isLast = param == namedParams.last;
1625+ builder.write (renderParam (param, isLast ? '' : ', ' ));
1626+ builder.write (' ' );
1627+ }
1628+
1629+ // suffix
16081630 if (namedParams.isNotEmpty) {
1609- fragments.add (renderParams (namedParams, open: '{' , close: '}' ));
1631+ builder.write ('}' );
1632+ } else if (positionalParams.isNotEmpty) {
1633+ builder.write (']' );
16101634 }
16111635
1612- return fragments. join (separator );
1636+ return builder. toString (). trim ( );
16131637 }
16141638
16151639 @override
@@ -1655,6 +1679,19 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
16551679 return '<a ${classContent }href="${href }">$name </a>' ;
16561680 }
16571681
1682+ // TODO(keertip): consolidate all the find library methods
1683+ Library _findLibraryFor (Element e) {
1684+ var element = e.getAncestor ((l) => l is LibraryElement );
1685+ var lib;
1686+ if (element != null ) {
1687+ lib = package.findLibraryFor (element);
1688+ }
1689+ if (lib == null ) {
1690+ lib = package._getLibraryFor (e);
1691+ }
1692+ return lib;
1693+ }
1694+
16581695 // process the {@example ...} in comments and inject the example
16591696 // code into the doc commment.
16601697 // {@example core/ts/bootstrap/bootstrap.ts region='bootstrap'}
@@ -1904,12 +1941,13 @@ class Package implements Nameable, Documentable {
19041941 return null ;
19051942 }
19061943
1907- Library lib = elementLibaryMap['${e .kind }.${e .name }' ];
1944+ Library lib = elementLibaryMap['${e .kind }.${e .name }.${ e . enclosingElement } ' ];
19081945 if (lib != null ) return lib;
19091946 lib =
19101947 libraries.firstWhere ((l) => l.hasInExportedNamespace (e), orElse: () {});
19111948 if (lib != null ) {
1912- elementLibaryMap.putIfAbsent ('${e .kind }.${e .name }' , () => lib);
1949+ elementLibaryMap.putIfAbsent (
1950+ '${e .kind }.${e .name }.${e .enclosingElement }' , () => lib);
19131951 return lib;
19141952 }
19151953 return new Library (e.library, this );
@@ -1933,7 +1971,7 @@ class Parameter extends ModelElement implements EnclosedElement {
19331971 : super (element, library) {
19341972 var t = _parameter.type;
19351973 _modelType = new ElementType (
1936- t, new ModelElement .from (t.element, package. _getLibraryFor (t.element)));
1974+ t, new ModelElement .from (t.element, _findLibraryFor (t.element)));
19371975 }
19381976
19391977 String get defaultValue {
0 commit comments