@@ -1530,36 +1530,35 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
15301530
15311531 String linkedParams (
15321532 {bool showMetadata: true , bool showNames: true , String separator: ', ' }) {
1533- String renderParam (Parameter p) {
1533+
1534+ String renderParam (Parameter param, String suffix) {
15341535 StringBuffer buf = new StringBuffer ();
1535- buf.write ('<span class="parameter" id="${p .htmlId }">' );
1536- if (showMetadata && p.hasAnnotations) {
1537- buf.write ('<ol class="annotation-list">' );
1538- p.annotations.forEach ((String annotation) {
1539- buf.write ('<li>$annotation </li>' );
1536+ buf.write ('<span class="parameter" id="${param .htmlId }">' );
1537+ if (showMetadata && param.hasAnnotations) {
1538+ param.annotations.forEach ((String annotation) {
1539+ buf.write ('<span>@$annotation </span> ' );
15401540 });
1541- buf.write ('</ol> ' );
15421541 }
1543- if (p .modelType.isFunctionType) {
1542+ if (param .modelType.isFunctionType) {
15441543 var returnTypeName;
1545- bool isTypedef = p .modelType.element is Typedef ;
1544+ bool isTypedef = param .modelType.element is Typedef ;
15461545 if (isTypedef) {
1547- returnTypeName = p .modelType.linkedName;
1546+ returnTypeName = param .modelType.linkedName;
15481547 } else {
1549- returnTypeName = p .modelType.createLinkedReturnTypeName ();
1548+ returnTypeName = param .modelType.createLinkedReturnTypeName ();
15501549 }
15511550 buf.write ('<span class="type-annotation">${returnTypeName }</span>' );
15521551 if (showNames) {
1553- buf.write (' <span class="parameter-name">${p .name }</span>' );
1552+ buf.write (' <span class="parameter-name">${param .name }</span>' );
15541553 }
15551554 if (! isTypedef) {
15561555 buf.write ('(' );
1557- buf.write (p .modelType.element
1556+ buf.write (param .modelType.element
15581557 .linkedParams (showNames: showNames, showMetadata: showMetadata));
15591558 buf.write (')' );
15601559 }
1561- } else if (p .modelType != null && p .modelType.element != null ) {
1562- var mt = p .modelType;
1560+ } else if (param .modelType != null && param .modelType.element != null ) {
1561+ var mt = param .modelType;
15631562 String typeName = "" ;
15641563 if (mt != null && ! mt.isDynamic) {
15651564 typeName = mt.linkedName;
@@ -1568,46 +1567,71 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
15681567 buf.write ('<span class="type-annotation">$typeName </span> ' );
15691568 }
15701569 if (showNames) {
1571- buf.write ('<span class="parameter-name">${p .name }</span>' );
1570+ buf.write ('<span class="parameter-name">${param .name }</span>' );
15721571 }
15731572 }
15741573
1575- if (p .hasDefaultValue) {
1576- if (p .isOptionalNamed) {
1574+ if (param .hasDefaultValue) {
1575+ if (param .isOptionalNamed) {
15771576 buf.write (': ' );
15781577 } else {
15791578 buf.write (' = ' );
15801579 }
1581- buf.write ('<span class="default-value">${p .defaultValue }</span>' );
1580+ buf.write ('<span class="default-value">${param .defaultValue }</span>' );
15821581 }
1583- buf.write ('</span>' );
1582+ buf.write ('${ suffix } </span>' );
15841583 return buf.toString ();
15851584 }
15861585
1587- String renderParams (Iterable <Parameter > params,
1588- {String open: '' , String close: '' }) {
1589- return '$open ${params .map (renderParam ).join (separator )}$close ' ;
1590- }
1586+ List <Parameter > requiredParams =
1587+ parameters.where ((Parameter p) => ! p.isOptional).toList ();
1588+ List <Parameter > positionalParams =
1589+ parameters.where ((Parameter p) => p.isOptionalPositional).toList ();
1590+ List <Parameter > namedParams =
1591+ parameters.where ((Parameter p) => p.isOptionalNamed).toList ();
15911592
1592- Iterable <Parameter > requiredParams =
1593- parameters.where ((Parameter p) => ! p.isOptional);
1594- Iterable <Parameter > positionalParams =
1595- parameters.where ((Parameter p) => p.isOptionalPositional);
1596- Iterable <Parameter > namedParams =
1597- parameters.where ((Parameter p) => p.isOptionalNamed);
1593+ StringBuffer builder = new StringBuffer ();
1594+
1595+ // prefix
1596+ if (requiredParams.isEmpty && positionalParams.isNotEmpty) {
1597+ builder.write ('[' );
1598+ } else if (requiredParams.isEmpty && namedParams.isNotEmpty) {
1599+ builder.write ('{' );
1600+ }
15981601
1599- List <String > fragments = [];
1600- if (requiredParams.isNotEmpty) {
1601- fragments.add (renderParams (requiredParams));
1602+ // index over params
1603+ for (Parameter param in requiredParams) {
1604+ bool isLast = param == requiredParams.last;
1605+ String ext;
1606+ if (isLast && positionalParams.isNotEmpty) {
1607+ ext = ', [' ;
1608+ } else if (isLast && namedParams.isNotEmpty) {
1609+ ext = ', {' ;
1610+ } else {
1611+ ext = isLast ? '' : ', ' ;
1612+ }
1613+ builder.write (renderParam (param, ext));
1614+ builder.write (' ' );
16021615 }
1603- if (positionalParams.isNotEmpty) {
1604- fragments.add (renderParams (positionalParams, open: '[' , close: ']' ));
1616+ for (Parameter param in positionalParams) {
1617+ bool isLast = param == positionalParams.last;
1618+ builder.write (renderParam (param, isLast ? '' : ', ' ));
1619+ builder.write (' ' );
16051620 }
1621+ for (Parameter param in namedParams) {
1622+ bool isLast = param == namedParams.last;
1623+ builder.write (renderParam (param, isLast ? '' : ', ' ));
1624+ builder.write (' ' );
1625+ }
1626+
1627+ // suffix
16061628 if (namedParams.isNotEmpty) {
1607- fragments.add (renderParams (namedParams, open: '{' , close: '}' ));
1629+ builder.write ('}' );
1630+ } else if (positionalParams.isNotEmpty) {
1631+ builder.write (']' );
16081632 }
16091633
1610- return fragments. join (separator );
1634+ return builder. toString (). trim ( );
16111635 }
16121636
16131637 @override
0 commit comments