From 7ef96f7c99ec2156890036155796d6e351d71a45 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Tue, 15 Oct 2024 11:28:19 -0700 Subject: [PATCH] Improve mustachio deduplication strategy Currently mustachio has a very rudimentary deduplication strategy that leaves a fair number of unused partial render functions dangling in the generated code. This is because we delete a partial renderer function without taking great care about what partial functions it might have rendered, and which maybe are no longer rendered. This occurs particularly with deduplicated renderer functions that then don't become used any more. This change introduces a renderer cache and a more formal 'reference-counting' strategy to know if a renderer becomes unused. Tracking all renderer functions (and the compilers that compiled them, and the used context stacks determined by compilers) in one place makes it possible to have a more accurate understanding of what renderer functions become unused through the deduplication process. The new strategy is documented pretty well in this change, in the README. --- .../templates.aot_renderers_for_html.dart | 4561 +++++++---------- test/mustachio/aot_compiler_builder_test.dart | 20 +- .../mustachio/foo.aot_renderers_for_html.dart | 24 +- .../runtime_renderer_render_test.dart | 1 + tool/mustachio/README.md | 64 +- tool/mustachio/codegen_aot_compiler.dart | 342 +- 6 files changed, 2127 insertions(+), 2885 deletions(-) diff --git a/lib/src/generator/templates.aot_renderers_for_html.dart b/lib/src/generator/templates.aot_renderers_for_html.dart index d9a1a9fee3..0b370f4e7b 100644 --- a/lib/src/generator/templates.aot_renderers_for_html.dart +++ b/lib/src/generator/templates.aot_renderers_for_html.dart @@ -32,7 +32,6 @@ import 'package:dartdoc/src/model/method.dart'; import 'package:dartdoc/src/model/mixin.dart'; import 'package:dartdoc/src/model/model_element.dart'; import 'package:dartdoc/src/model/model_function.dart'; -import 'package:dartdoc/src/model/operator.dart'; import 'package:dartdoc/src/model/package.dart'; import 'package:dartdoc/src/model/top_level_variable.dart'; import 'package:dartdoc/src/model/typedef.dart'; @@ -91,7 +90,7 @@ String renderCategory(CategoryTemplateData context0) { var context6 = context1.publicMixinsSorted; for (var context7 in context6) { buffer.write('\n '); - buffer.write(_renderCategory_partial_container_4(context7)); + buffer.write(_renderCategory_partial_container_3(context7)); } buffer.writeln(); buffer.write(''' @@ -166,7 +165,7 @@ String renderCategory(CategoryTemplateData context0) { var context16 = context1.publicEnumsSorted; for (var context17 in context16) { buffer.write('\n '); - buffer.write(_renderCategory_partial_container_9(context17)); + buffer.write(_renderCategory_partial_container_3(context17)); } buffer.writeln(); buffer.write(''' @@ -196,7 +195,7 @@ String renderCategory(CategoryTemplateData context0) { var context20 = context1.publicExceptionsSorted; for (var context21 in context20) { buffer.write('\n '); - buffer.write(_renderCategory_partial_container_11(context21)); + buffer.write(_renderCategory_partial_container_3(context21)); } buffer.writeln(); buffer.write(''' @@ -259,7 +258,8 @@ String renderClass(ClassTemplateData context0) { buffer.write(' '); buffer.write(_renderClass_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderClass_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context1)); buffer.write(''''''); buffer.writeln(); var context2 = context0.clazz; @@ -435,7 +435,8 @@ String renderEnum(EnumTemplateData context0) { buffer.write(' '); buffer.write(_renderEnum_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderEnum_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context1)); buffer.writeln(); buffer.write(''' '''); @@ -471,7 +472,8 @@ String renderEnum(EnumTemplateData context0) { var context3 = context2.publicEnumValues; for (var context4 in context3) { buffer.write('\n '); - buffer.write(_renderEnum_partial_constant_10(context4)); + buffer.write(__renderClass_partial_static_constants_16_partial_constant_0( + context4)); } buffer.writeln(); buffer.write(''' @@ -573,7 +575,8 @@ String renderExtension(ExtensionTemplateData context0) { buffer.write(' '); buffer.write(_renderExtension_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderExtension_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context1)); buffer.write(''''''); buffer.writeln(); var context2 = context0.extension; @@ -658,7 +661,8 @@ String renderExtensionType( buffer.write(' '); buffer.write(_renderExtensionType_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderExtensionType_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context1)); buffer.write(''''''); buffer.writeln(); var context2 = context0.extensionType; @@ -764,7 +768,8 @@ String renderFunction(FunctionTemplateData context0) { buffer.write(' '); buffer.write(_renderFunction_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderFunction_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_callable_8_partial_categorization_0(context1)); buffer.write(''''''); buffer.writeln(); var context2 = context0.function; @@ -773,7 +778,8 @@ String renderFunction(FunctionTemplateData context0) { '''); buffer.write(_renderFunction_partial_callable_multiline_4(context2)); buffer.write('\n '); - buffer.write(_renderFunction_partial_attributes_5(context2)); + buffer.write( + __renderCategory_partial_callable_8_partial_attributes_1(context2)); buffer.writeln(); buffer.write(''' '''); @@ -805,7 +811,7 @@ String renderFunction(FunctionTemplateData context0) { String renderIndex(PackageTemplateData context0) { final buffer = StringBuffer(); - buffer.write(_renderIndex_partial_head_0(context0)); + buffer.write(_renderError_partial_head_0(context0)); buffer.writeln(); buffer.write('''
'''); var context1 = context0.defaultPackage; @@ -832,7 +838,7 @@ String renderIndex(PackageTemplateData context0) { var context5 = context4.publicLibrariesSorted; for (var context6 in context5) { buffer.write('\n '); - buffer.write(_renderIndex_partial_library_2(context6)); + buffer.write(_renderCategory_partial_library_2(context6)); } var context7 = context3.categoriesWithPublicLibraries; for (var context8 in context7) { @@ -869,7 +875,7 @@ String renderIndex(PackageTemplateData context0) { var context11 = context8.publicLibrariesSorted; for (var context12 in context11) { buffer.write('\n '); - buffer.write(_renderIndex_partial_library_2(context12)); + buffer.write(_renderCategory_partial_library_2(context12)); } } buffer.writeln(); @@ -880,7 +886,7 @@ String renderIndex(PackageTemplateData context0) { buffer.write('''
'''); - buffer.write(_renderIndex_partial_footer_5(context0)); + buffer.write(_renderError_partial_footer_3(context0)); buffer.writeln(); return buffer.toString(); @@ -929,7 +935,8 @@ String renderLibrary(LibraryTemplateData context0) { buffer.write(' '); buffer.write(_renderLibrary_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderLibrary_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_library_2_partial_categorization_0(context1)); buffer.writeln(); buffer.write(''' '''); @@ -948,7 +955,7 @@ String renderLibrary(LibraryTemplateData context0) { var context5 = context4.publicClassesSorted; for (var context6 in context5) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_container_5(context6)); + buffer.write(_renderCategory_partial_container_3(context6)); } buffer.writeln(); buffer.write(''' @@ -965,7 +972,7 @@ String renderLibrary(LibraryTemplateData context0) { var context9 = context8.publicEnumsSorted; for (var context10 in context9) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_container_6(context10)); + buffer.write(_renderCategory_partial_container_3(context10)); } buffer.writeln(); buffer.write(''' @@ -982,7 +989,7 @@ String renderLibrary(LibraryTemplateData context0) { var context13 = context12.publicMixinsSorted; for (var context14 in context13) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_container_7(context14)); + buffer.write(_renderCategory_partial_container_3(context14)); } buffer.writeln(); buffer.write(''' @@ -1017,7 +1024,7 @@ String renderLibrary(LibraryTemplateData context0) { var context21 = context20.publicExtensionsSorted; for (var context22 in context21) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_extension_9(context22)); + buffer.write(_renderCategory_partial_extension_5(context22)); } buffer.writeln(); buffer.write(''' @@ -1034,7 +1041,7 @@ String renderLibrary(LibraryTemplateData context0) { var context25 = context24.publicConstantsSorted; for (var context26 in context25) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_constant_10(context26)); + buffer.write(_renderCategory_partial_constant_6(context26)); } buffer.writeln(); buffer.write(''' @@ -1051,7 +1058,7 @@ String renderLibrary(LibraryTemplateData context0) { var context29 = context28.publicPropertiesSorted; for (var context30 in context29) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_property_11(context30)); + buffer.write(_renderCategory_partial_property_7(context30)); } buffer.writeln(); buffer.write(''' @@ -1068,7 +1075,7 @@ String renderLibrary(LibraryTemplateData context0) { var context33 = context32.publicFunctionsSorted; for (var context34 in context33) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_callable_12(context34)); + buffer.write(_renderCategory_partial_callable_8(context34)); } buffer.writeln(); buffer.write(''' @@ -1085,7 +1092,7 @@ String renderLibrary(LibraryTemplateData context0) { var context37 = context36.publicTypedefsSorted; for (var context38 in context37) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_typedef_13(context38)); + buffer.write(_renderCategory_partial_typedef_10(context38)); } buffer.writeln(); buffer.write(''' @@ -1102,7 +1109,7 @@ String renderLibrary(LibraryTemplateData context0) { var context41 = context40.publicExceptionsSorted; for (var context42 in context41) { buffer.write('\n '); - buffer.write(_renderLibrary_partial_container_14(context42)); + buffer.write(_renderCategory_partial_container_3(context42)); } buffer.writeln(); buffer.write(''' @@ -1202,7 +1209,9 @@ String renderMethod(MethodTemplateData context0) { '''); buffer.write(_renderMethod_partial_callable_multiline_3(context2)); buffer.write('\n '); - buffer.write(_renderMethod_partial_attributes_4(context2)); + buffer.write( + ___renderClass_partial_instance_methods_12_partial_callable_0_partial_attributes_1( + context2)); buffer.writeln(); buffer.write(''' '''); @@ -1269,7 +1278,8 @@ String renderMixin(MixinTemplateData context0) { buffer.write(' '); buffer.write(_renderMixin_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderMixin_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context1)); buffer.write(''''''); buffer.writeln(); var context2 = context0.mixin; @@ -1394,7 +1404,9 @@ String renderProperty(PropertyTemplateData context0) { buffer.write('\n '); buffer.write(_renderProperty_partial_name_summary_4(context2)); buffer.write('\n '); - buffer.write(_renderProperty_partial_attributes_5(context2)); + buffer.write( + ___renderClass_partial_instance_fields_11_partial_property_0_partial_attributes_1( + context2)); buffer.writeln(); buffer.write(''' '''); @@ -1451,13 +1463,13 @@ String renderProperty(PropertyTemplateData context0) { String renderSearchPage(PackageTemplateData context0) { final buffer = StringBuffer(); - buffer.write(_renderSearchPage_partial_head_0(context0)); + buffer.write(_renderError_partial_head_0(context0)); buffer.writeln(); buffer.write('''
'''); - buffer.write(_renderSearchPage_partial_footer_3(context0)); + buffer.write(_renderError_partial_footer_3(context0)); buffer.writeln(); return buffer.toString(); @@ -1571,7 +1583,7 @@ String renderSidebarForContainer( for (var context11 in context10) { buffer.write('\n '); buffer.write( - _renderSidebarForContainer_partial_container_sidebar_item_2( + _renderSidebarForContainer_partial_container_sidebar_item_1( context11)); } } @@ -1844,7 +1856,8 @@ String renderTopLevelProperty(TopLevelPropertyTemplateData context0) { buffer.write(' '); buffer.write(_renderTopLevelProperty_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderTopLevelProperty_partial_categorization_3(context1)); + buffer.write( + __renderCategory_partial_constant_6_partial_categorization_0(context1)); buffer.write(''' '''); if (!context1.hasGetterOrSetter) { @@ -1857,7 +1870,8 @@ String renderTopLevelProperty(TopLevelPropertyTemplateData context0) { buffer.write('\n '); buffer.write(_renderTopLevelProperty_partial_name_summary_5(context1)); buffer.write('\n '); - buffer.write(_renderTopLevelProperty_partial_attributes_6(context1)); + buffer.write( + __renderCategory_partial_constant_6_partial_attributes_1(context1)); buffer.writeln(); buffer.write(''' '''); @@ -1921,7 +1935,9 @@ String renderTypedef(TypedefTemplateData context0) { buffer.write(' '); buffer.write(_renderTypedef_partial_feature_set_2(context1)); buffer.write(' '); - buffer.write(_renderTypedef_partial_categorization_3(context1)); + buffer.write( + ___renderCategory_partial_typedef_10_partial_type_2_partial_categorization_0( + context1)); buffer.write(''''''); buffer.writeln(); buffer.write('''
'''); @@ -1958,1777 +1974,303 @@ String renderTypedef(TypedefTemplateData context0) { return buffer.toString(); } -String _renderCategory_partial_head_0(CategoryTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderCategory_partial_documentation_1(Category context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderCategory_partial_library_2(Library context2) => - _deduplicated_lib_templates__library_html(context2); - -String _renderCategory_partial_container_3(Container context2) => - _deduplicated_lib_templates__container_html(context2); - -String _renderCategory_partial_container_4(Mixin context2) => - _deduplicated_lib_templates__container_html(context2); - -String _renderCategory_partial_extension_5(Extension context2) => - _deduplicated_lib_templates__extension_html(context2); - -String _renderCategory_partial_constant_6(TopLevelVariable context2) => - _deduplicated_lib_templates__constant_html(context2); - -String _renderCategory_partial_property_7(TopLevelVariable context2) { +String _deduplicated__accessor_getter(GetterSetterCombo context0) { final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context2.linkedName); - buffer.write(''' - '''); - buffer.write(context2.arrow); - buffer.write(' '); - buffer.write(context2.modelType.linkedName); - buffer.write(''' - '''); - buffer.write( - __renderCategory_partial_property_7_partial_categorization_0(context2)); - buffer.writeln(); - buffer.write('''
-'''); - if (context2.isProvidedByExtension) { - var context3 = context2.enclosingExtension; + var context1 = context0.getter; + if (context1 != null) { buffer.writeln(); - buffer.write('''

- Available on '''); - buffer.write(context3.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context3.linkedName); - buffer.write(''' extension -

'''); + buffer.write('''
+
+ '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_annotations_0( + context1)); + buffer.writeln(); + buffer.write(''' '''); + buffer.write(context1.modelType.returnType.linkedName); + buffer.write(''' + get + '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_name_summary_1( + context1)); + buffer.write('\n '); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_attributes_2( + context1)); + buffer.writeln(); + buffer.write('''
+ '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_documentation_3( + context1)); + buffer.write('\n '); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_source_code_4( + context1)); + buffer.writeln(); + buffer.write('''
'''); } - buffer.write('\n '); - buffer.write(context2.oneLineDoc); - buffer.write('\n '); - buffer.write( - __renderCategory_partial_property_7_partial_attributes_1(context2)); buffer.writeln(); - buffer.write(''' -'''); return buffer.toString(); } -String __renderCategory_partial_property_7_partial_categorization_0( - TopLevelVariable context2) => - _deduplicated_lib_templates__categorization_html(context2); - -String __renderCategory_partial_property_7_partial_attributes_1( - TopLevelVariable context2) => - _deduplicated_lib_templates__attributes_html(context2); - -String _renderCategory_partial_callable_8(ModelFunctionTyped context2) { +String _deduplicated__accessor_setter(GetterSetterCombo context0) { final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context2.linkedName); - buffer.write(''''''); - buffer.write(context2.linkedGenericParameters); - buffer.write('''('''); - buffer.write(context2.linkedParamsNoMetadata); - buffer.write(''') - → '''); - buffer.write(context2.modelType.returnType.linkedName); - buffer.write(''' - - '''); - buffer.write( - __renderCategory_partial_callable_8_partial_categorization_0(context2)); - buffer.writeln(); - buffer.write('''
-'''); - if (context2.isProvidedByExtension) { - var context3 = context2.enclosingExtension; + var context1 = context0.setter; + if (context1 != null) { buffer.writeln(); - buffer.write('''

- Available on '''); - buffer.write(context3.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context3.linkedName); - buffer.write(''' extension -

'''); + buffer.write('''
+
+ '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_annotations_0( + context1)); + buffer.writeln(); + buffer.write(''' set + '''); + buffer.writeEscaped(context1.definingCombo.name); + buffer.write(''' + ('''); + buffer.write(context1.linkedParamsNoMetadata); + buffer.write(''') + '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_attributes_2( + context1)); + buffer.writeln(); + buffer.write('''
+ '''); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_documentation_3( + context1)); + buffer.write('\n '); + buffer.write( + __renderTopLevelProperty_partial_accessor_getter_9_partial_source_code_4( + context1)); + buffer.writeln(); + buffer.write('''
'''); } - buffer.write('\n '); - buffer.write(context2.oneLineDoc); - buffer.write('\n '); - buffer.write( - __renderCategory_partial_callable_8_partial_attributes_1(context2)); buffer.writeln(); - buffer.write(''' -'''); return buffer.toString(); } -String __renderCategory_partial_callable_8_partial_categorization_0( - ModelFunctionTyped context2) => - _deduplicated_lib_templates__categorization_html(context2); - -String __renderCategory_partial_callable_8_partial_attributes_1( - ModelFunctionTyped context2) => - _deduplicated_lib_templates__attributes_html(context2); - -String _renderCategory_partial_container_9(Enum context2) => - _deduplicated_lib_templates__container_html(context2); - -String _renderCategory_partial_typedef_10(Typedef context2) => - _deduplicated_lib_templates__typedef_html(context2); - -String _renderCategory_partial_container_11(Class context2) => - _deduplicated_lib_templates__container_html(context2); - -String _renderCategory_partial_search_sidebar_12( - CategoryTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderCategory_partial_packages_13(CategoryTemplateData context0) => - _deduplicated_lib_templates__packages_html(context0); - -String _renderCategory_partial_sidebar_for_category_14( - CategoryTemplateData context0) { +String _deduplicated__annotations(ModelElement context0) { final buffer = StringBuffer(); - buffer.write('''
    '''); - var context1 = context0.self; - if (context1.hasPublicLibraries) { + if (context0.hasAnnotations) { buffer.writeln(); - buffer.write('''
  1. Libraries
  2. '''); - var context2 = context0.self; - var context3 = context2.publicLibrariesSorted; - for (var context4 in context3) { + buffer.write('''
    +
      '''); + var context1 = context0.annotations; + for (var context2 in context1) { buffer.writeln(); - buffer.write('''
    1. '''); - buffer.write(context4.linkedName); + buffer.write('''
    2. '''); + buffer.write(context2.linkedNameWithParameters); buffer.write('''
    3. '''); } + buffer.writeln(); + buffer.write('''
    +
    '''); + } + + return buffer.toString(); +} + +String _deduplicated__attributes(ModelElement context0) { + final buffer = StringBuffer(); + if (context0.hasAttributes) { + buffer.write('''
    '''); + buffer.write(context0.attributesAsString); + buffer.write('''
    '''); } buffer.writeln(); - var context5 = context0.self; - if (context5.hasPublicClasses) { + + return buffer.toString(); +} + +String _deduplicated__available_extensions(InheritingContainer context0) { + final buffer = StringBuffer(); + if (context0.hasPotentiallyApplicableExtensions) { buffer.writeln(); - buffer.write('''
  3. Classes
  4. '''); - var context6 = context0.self; - var context7 = context6.publicClassesSorted; - for (var context8 in context7) { + buffer.write('''
    Available extensions
    +
      '''); + var context1 = context0.potentiallyApplicableExtensionsSorted; + for (var context2 in context1) { buffer.writeln(); buffer.write('''
    • '''); - buffer.write(context8.linkedName); + buffer.write(context2.linkedName); buffer.write('''
    • '''); } - } - buffer.writeln(); - var context9 = context0.self; - if (context9.hasPublicEnums) { buffer.writeln(); - buffer.write('''
    • Enums
    • '''); - var context10 = context0.self; - var context11 = context10.publicEnumsSorted; - for (var context12 in context11) { - buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context12.linkedName); - buffer.write('''
    • '''); - } + buffer.write('''
    '''); } - buffer.writeln(); - var context13 = context0.self; - if (context13.hasPublicMixins) { - buffer.writeln(); - buffer.write('''
  5. Mixins
  6. '''); - var context14 = context0.self; - var context15 = context14.publicMixinsSorted; - for (var context16 in context15) { - buffer.writeln(); - buffer.write('''
  7. '''); - buffer.write(context16.linkedName); - buffer.write('''
  8. '''); + + return buffer.toString(); +} + +String _deduplicated__categorization(ModelElement context0) { + final buffer = StringBuffer(); + if (context0.hasCategoryNames) { + var context1 = context0.displayedCategories; + for (var context2 in context1) { + buffer.write('\n '); + buffer.write(context2!.categoryLabel); } } buffer.writeln(); - var context17 = context0.self; - if (context17.hasPublicExtensionTypes) { + + return buffer.toString(); +} + +String _deduplicated__constant(GetterSetterCombo context0) { + final buffer = StringBuffer(); + buffer.write('''
    '''); + if (context0.isEnumValue) { buffer.writeln(); - buffer.write('''
  9. Extension Types
  10. '''); - var context18 = context0.self; - var context19 = context18.publicExtensionTypesSorted; - for (var context20 in context19) { - buffer.writeln(); - buffer.write('''
  11. '''); - buffer.write(context20.linkedName); - buffer.write('''
  12. '''); + buffer.write(''' '''); + buffer.write(context0.name); + buffer.write(''''''); } - buffer.writeln(); - var context21 = context0.self; - if (context21.hasPublicConstants) { + if (!context0.isEnumValue) { buffer.writeln(); - buffer.write('''
  13. Constants
  14. '''); - var context22 = context0.self; - var context23 = context22.publicConstantsSorted; - for (var context24 in context23) { - buffer.writeln(); - buffer.write('''
  15. '''); - buffer.write(context24.linkedName); - buffer.write('''
  16. '''); + buffer.write(''' '''); + buffer.write(context0.linkedName); + buffer.write(''''''); } buffer.writeln(); - var context25 = context0.self; - if (context25.hasPublicProperties) { - buffer.writeln(); - buffer.write('''
  17. Properties
  18. '''); - var context26 = context0.self; - var context27 = context26.publicPropertiesSorted; - for (var context28 in context27) { - buffer.writeln(); - buffer.write('''
  19. '''); - buffer.write(context28.linkedName); - buffer.write('''
  20. '''); - } - } + buffer.write(''' → const '''); + buffer.write(context0.modelType.linkedName); + buffer.write(''' + '''); + buffer.write(_deduplicated__categorization(context0)); buffer.writeln(); - var context29 = context0.self; - if (context29.hasPublicFunctions) { + buffer.write('''
    +
    + '''); + buffer.write(context0.oneLineDoc); + buffer.write('\n '); + buffer.write(_deduplicated__attributes(context0)); + if (context0.hasConstantValueForDisplay) { buffer.writeln(); - buffer.write('''
  21. Functions
  22. '''); - var context30 = context0.self; - var context31 = context30.publicFunctionsSorted; - for (var context32 in context31) { - buffer.writeln(); - buffer.write('''
  23. '''); - buffer.write(context32.linkedName); - buffer.write('''
  24. '''); - } + buffer.write('''
    + '''); + buffer.write(context0.constantValueTruncated); + buffer.write(''' +
    '''); } buffer.writeln(); - var context33 = context0.self; - if (context33.hasPublicTypedefs) { + buffer.write('''
    +'''); + + return buffer.toString(); +} + +String _deduplicated__constructors(Constructable context0) { + final buffer = StringBuffer(); + if (context0.hasPublicConstructors) { buffer.writeln(); - buffer.write('''
  25. Typedefs
  26. '''); - var context34 = context0.self; - var context35 = context34.publicTypedefsSorted; - for (var context36 in context35) { + buffer.write('''
    +

    Constructors

    +
    '''); + var context1 = context0.publicConstructorsSorted; + for (var context2 in context1) { buffer.writeln(); - buffer.write('''
  27. '''); - buffer.write(context36.linkedName); - buffer.write('''
  28. '''); - } - } - buffer.writeln(); - var context37 = context0.self; - if (context37.hasPublicExceptions) { - buffer.writeln(); - buffer.write('''
  29. Exceptions
  30. '''); - var context38 = context0.self; - var context39 = context38.publicExceptionsSorted; - for (var context40 in context39) { + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write('''('''); + buffer.write(context2.linkedParams); + buffer.write(''') +
    +
    + '''); + buffer.write(context2.oneLineDoc); + if (context2.isConst) { + buffer.writeln(); + buffer.write( + '''
    const
    '''); + } + if (context2.isFactory) { + buffer.writeln(); + buffer.write( + '''
    factory
    '''); + } buffer.writeln(); - buffer.write('''
  31. '''); - buffer.write(context40.linkedName); - buffer.write('''
  32. '''); + buffer.write('''
    '''); } - } - buffer.writeln(); - var context41 = context0.self; - if (context41.hasPublicExtensions) { buffer.writeln(); - buffer.write('''
  33. Extensions
  34. '''); - var context42 = context0.self; - var context43 = context42.publicExtensionsSorted; - for (var context44 in context43) { - buffer.writeln(); - buffer.write('''
  35. '''); - buffer.write(context44.linkedName); - buffer.write('''
  36. '''); - } + buffer.write('''
    +
    '''); } - buffer.writeln(); - buffer.write('''
-'''); return buffer.toString(); } -String _renderCategory_partial_footer_15(CategoryTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderClass_partial_head_0(ClassTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderClass_partial_source_link_1(Class context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderClass_partial_feature_set_2(Class context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderClass_partial_categorization_3(Class context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderClass_partial_documentation_4(Class context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderClass_partial_super_chain_5(Class context1) => - _deduplicated_lib_templates__super_chain_html(context1); - -String _renderClass_partial_interfaces_6(Class context1) => - _deduplicated_lib_templates__interfaces_html(context1); - -String _renderClass_partial_mixed_in_types_7(Class context1) { +String _deduplicated__container_annotations(Container context0) { final buffer = StringBuffer(); - if (context1.hasPublicMixedInTypes) { + if (context0.hasAnnotations) { buffer.writeln(); - buffer.write('''
Mixed-in types
+ buffer.write('''
Annotations
-
    '''); - var context2 = context1.publicMixedInTypes; - for (var context3 in context2) { + var context1 = context0.annotations; + for (var context2 in context1) { buffer.writeln(); buffer.write('''
  • '''); - buffer.write(context3.linkedName); + buffer.write(context2.linkedNameWithParameters); buffer.write('''
  • '''); } buffer.writeln(); buffer.write('''
'''); } + buffer.write('\n\n'); return buffer.toString(); } -String _renderClass_partial_available_extensions_8(Class context1) => - _deduplicated_lib_templates__available_extensions_html(context1); - -String _renderClass_partial_container_annotations_9(Class context1) => - _deduplicated_lib_templates__container_annotations_html(context1); - -String _renderClass_partial_constructors_10(Class context1) => - _deduplicated_lib_templates__constructors_html(context1); - -String _renderClass_partial_instance_fields_11(Class context1) => - _deduplicated_lib_templates__instance_fields_html(context1); - -String _renderClass_partial_instance_methods_12(Class context1) => - _deduplicated_lib_templates__instance_methods_html(context1); - -String _renderClass_partial_instance_operators_13(Class context1) => - _deduplicated_lib_templates__instance_operators_html(context1); - -String _renderClass_partial_static_properties_14(Class context1) => - _deduplicated_lib_templates__static_properties_html(context1); - -String _renderClass_partial_static_methods_15(Class context1) => - _deduplicated_lib_templates__static_methods_html(context1); - -String _renderClass_partial_static_constants_16(Class context1) => - _deduplicated_lib_templates__static_constants_html(context1); - -String _renderClass_partial_search_sidebar_17(ClassTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderClass_partial_footer_18(ClassTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderConstructor_partial_head_0(ConstructorTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderConstructor_partial_source_link_1(Constructor context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderConstructor_partial_feature_set_2(Constructor context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderConstructor_partial_annotations_3(Constructor context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String _renderConstructor_partial_documentation_4(Constructor context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderConstructor_partial_source_code_5(Constructor context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderConstructor_partial_search_sidebar_6( - ConstructorTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderConstructor_partial_footer_7(ConstructorTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderEnum_partial_head_0(EnumTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderEnum_partial_source_link_1(Enum context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderEnum_partial_feature_set_2(Enum context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderEnum_partial_categorization_3(Enum context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderEnum_partial_documentation_4(Enum context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderEnum_partial_super_chain_5(Enum context1) => - _deduplicated_lib_templates__super_chain_html(context1); - -String _renderEnum_partial_interfaces_6(Enum context1) => - _deduplicated_lib_templates__interfaces_html(context1); - -String _renderEnum_partial_mixed_in_types_7(Enum context1) { - final buffer = StringBuffer(); - if (context1.hasPublicMixedInTypes) { - buffer.writeln(); - buffer.write('''
Mixed-in types
-
-
    '''); - var context2 = context1.publicMixedInTypes; - for (var context3 in context2) { - buffer.writeln(); - buffer.write('''
  • '''); - buffer.write(context3.linkedName); - buffer.write('''
  • '''); - } - buffer.writeln(); - buffer.write('''
-
'''); - } - - return buffer.toString(); -} - -String _renderEnum_partial_available_extensions_8(Enum context1) => - _deduplicated_lib_templates__available_extensions_html(context1); - -String _renderEnum_partial_container_annotations_9(Enum context1) => - _deduplicated_lib_templates__container_annotations_html(context1); - -String _renderEnum_partial_constant_10(Field context2) => - _deduplicated_lib_templates__constant_html(context2); - -String _renderEnum_partial_instance_fields_11(Enum context1) => - _deduplicated_lib_templates__instance_fields_html(context1); - -String _renderEnum_partial_instance_methods_12(Enum context1) => - _deduplicated_lib_templates__instance_methods_html(context1); - -String _renderEnum_partial_instance_operators_13(Enum context1) => - _deduplicated_lib_templates__instance_operators_html(context1); - -String _renderEnum_partial_static_properties_14(Enum context1) => - _deduplicated_lib_templates__static_properties_html(context1); - -String _renderEnum_partial_static_methods_15(Enum context1) => - _deduplicated_lib_templates__static_methods_html(context1); - -String _renderEnum_partial_static_constants_16(Enum context1) => - _deduplicated_lib_templates__static_constants_html(context1); - -String _renderEnum_partial_search_sidebar_17(EnumTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderEnum_partial_footer_18(EnumTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderError_partial_head_0(PackageTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderError_partial_search_sidebar_1(PackageTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderError_partial_packages_2(PackageTemplateData context0) => - _deduplicated_lib_templates__packages_html(context0); - -String _renderError_partial_footer_3(PackageTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderExtension_partial_head_0( - ExtensionTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderExtension_partial_source_link_1(Extension context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderExtension_partial_feature_set_2(Extension context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderExtension_partial_categorization_3(Extension context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderExtension_partial_documentation_4(Extension context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderExtension_partial_container_annotations_5(Extension context1) => - _deduplicated_lib_templates__container_annotations_html(context1); - -String _renderExtension_partial_instance_fields_6(Extension context1) => - _deduplicated_lib_templates__instance_fields_html(context1); - -String _renderExtension_partial_instance_methods_7(Extension context1) => - _deduplicated_lib_templates__instance_methods_html(context1); - -String _renderExtension_partial_instance_operators_8(Extension context1) => - _deduplicated_lib_templates__instance_operators_html(context1); - -String _renderExtension_partial_static_properties_9(Extension context1) => - _deduplicated_lib_templates__static_properties_html(context1); - -String _renderExtension_partial_static_methods_10(Extension context1) => - _deduplicated_lib_templates__static_methods_html(context1); - -String _renderExtension_partial_static_constants_11(Extension context1) => - _deduplicated_lib_templates__static_constants_html(context1); - -String _renderExtension_partial_search_sidebar_12( - ExtensionTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderExtension_partial_footer_13( - ExtensionTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderExtensionType_partial_head_0( - ExtensionTypeTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderExtensionType_partial_source_link_1(ExtensionType context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderExtensionType_partial_feature_set_2(ExtensionType context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderExtensionType_partial_categorization_3(ExtensionType context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderExtensionType_partial_documentation_4(ExtensionType context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderExtensionType_partial_interfaces_5(ExtensionType context1) => - _deduplicated_lib_templates__interfaces_html(context1); - -String _renderExtensionType_partial_available_extensions_6( - ExtensionType context1) => - _deduplicated_lib_templates__available_extensions_html(context1); - -String _renderExtensionType_partial_container_annotations_7( - ExtensionType context1) => - _deduplicated_lib_templates__container_annotations_html(context1); - -String _renderExtensionType_partial_constructors_8(ExtensionType context1) => - _deduplicated_lib_templates__constructors_html(context1); - -String _renderExtensionType_partial_instance_fields_9(ExtensionType context1) => - _deduplicated_lib_templates__instance_fields_html(context1); - -String _renderExtensionType_partial_instance_methods_10( - ExtensionType context1) => - _deduplicated_lib_templates__instance_methods_html(context1); - -String _renderExtensionType_partial_instance_operators_11( - ExtensionType context1) => - _deduplicated_lib_templates__instance_operators_html(context1); - -String _renderExtensionType_partial_static_properties_12( - ExtensionType context1) => - _deduplicated_lib_templates__static_properties_html(context1); - -String _renderExtensionType_partial_static_methods_13(ExtensionType context1) => - _deduplicated_lib_templates__static_methods_html(context1); - -String _renderExtensionType_partial_static_constants_14( - ExtensionType context1) => - _deduplicated_lib_templates__static_constants_html(context1); - -String _renderExtensionType_partial_search_sidebar_15( - ExtensionTypeTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderExtensionType_partial_footer_16( - ExtensionTypeTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderFunction_partial_head_0(FunctionTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderFunction_partial_source_link_1(ModelFunction context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderFunction_partial_feature_set_2(ModelFunction context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderFunction_partial_categorization_3(ModelFunction context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderFunction_partial_callable_multiline_4(ModelFunction context1) { - final buffer = StringBuffer(); - buffer.write( - __renderFunction_partial_callable_multiline_4_partial_annotations_0( - context1)); - buffer.writeln(); - buffer.write(''''''); - buffer.write(context1.modelType.returnType.linkedName); - buffer.write(''' -'''); - buffer.write( - __renderFunction_partial_callable_multiline_4_partial_name_summary_1( - context1)); - buffer.write(context1.genericParameters); - buffer.write('''('''); - if (context1.hasParameters) { - buffer.write(context1.linkedParamsLines); - } - buffer.write(''') -'''); - - return buffer.toString(); -} - -String __renderFunction_partial_callable_multiline_4_partial_annotations_0( - ModelFunction context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String __renderFunction_partial_callable_multiline_4_partial_name_summary_1( - ModelFunction context1) => - _deduplicated_lib_templates__name_summary_html(context1); - -String _renderFunction_partial_attributes_5(ModelFunction context1) => - _deduplicated_lib_templates__attributes_html(context1); - -String _renderFunction_partial_documentation_6(ModelFunction context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderFunction_partial_source_code_7(ModelFunction context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderFunction_partial_search_sidebar_8( - FunctionTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderFunction_partial_footer_9(FunctionTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderIndex_partial_head_0(PackageTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderIndex_partial_documentation_1(Package context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderIndex_partial_library_2(Library context3) => - _deduplicated_lib_templates__library_html(context3); - -String _renderIndex_partial_search_sidebar_3(PackageTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderIndex_partial_packages_4(PackageTemplateData context0) => - _deduplicated_lib_templates__packages_html(context0); - -String _renderIndex_partial_footer_5(PackageTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderLibrary_partial_head_0(LibraryTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderLibrary_partial_source_link_1(Library context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderLibrary_partial_feature_set_2(Library context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderLibrary_partial_categorization_3(Library context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderLibrary_partial_documentation_4(Library context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderLibrary_partial_container_5(Container context3) => - _deduplicated_lib_templates__container_html(context3); - -String _renderLibrary_partial_container_6(Enum context3) => - _deduplicated_lib_templates__container_html(context3); - -String _renderLibrary_partial_container_7(Mixin context3) => - _deduplicated_lib_templates__container_html(context3); - -String _renderLibrary_partial_extension_type_8(ExtensionType context3) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context3.linkedName); - buffer.write(''' '''); - buffer.write( - __renderLibrary_partial_extension_type_8_partial_categorization_0( - context3)); - buffer.writeln(); - buffer.write('''
-
- '''); - buffer.write(context3.oneLineDoc); - buffer.writeln(); - buffer.write('''
-'''); - - return buffer.toString(); -} - -String __renderLibrary_partial_extension_type_8_partial_categorization_0( - ExtensionType context3) => - _deduplicated_lib_templates__categorization_html(context3); - -String _renderLibrary_partial_extension_9(Extension context3) => - _deduplicated_lib_templates__extension_html(context3); - -String _renderLibrary_partial_constant_10(TopLevelVariable context3) => - _deduplicated_lib_templates__constant_html(context3); - -String _renderLibrary_partial_property_11(TopLevelVariable context3) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context3.linkedName); - buffer.write(''' - '''); - buffer.write(context3.arrow); - buffer.write(' '); - buffer.write(context3.modelType.linkedName); - buffer.write(''' - '''); - buffer.write( - __renderLibrary_partial_property_11_partial_categorization_0(context3)); - buffer.writeln(); - buffer.write('''
-'''); - if (context3.isProvidedByExtension) { - var context4 = context3.enclosingExtension; - buffer.writeln(); - buffer.write('''

- Available on '''); - buffer.write(context4.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context4.linkedName); - buffer.write(''' extension -

'''); - } - buffer.write('\n '); - buffer.write(context3.oneLineDoc); - buffer.write('\n '); - buffer.write( - __renderLibrary_partial_property_11_partial_attributes_1(context3)); - buffer.writeln(); - buffer.write(''' -'''); - - return buffer.toString(); -} - -String __renderLibrary_partial_property_11_partial_categorization_0( - TopLevelVariable context3) => - _deduplicated_lib_templates__categorization_html(context3); - -String __renderLibrary_partial_property_11_partial_attributes_1( - TopLevelVariable context3) => - _deduplicated_lib_templates__attributes_html(context3); - -String _renderLibrary_partial_callable_12(ModelFunctionTyped context3) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context3.linkedName); - buffer.write(''''''); - buffer.write(context3.linkedGenericParameters); - buffer.write('''('''); - buffer.write(context3.linkedParamsNoMetadata); - buffer.write(''') - → '''); - buffer.write(context3.modelType.returnType.linkedName); - buffer.write(''' - - '''); - buffer.write( - __renderLibrary_partial_callable_12_partial_categorization_0(context3)); - buffer.writeln(); - buffer.write('''
-'''); - if (context3.isProvidedByExtension) { - var context4 = context3.enclosingExtension; - buffer.writeln(); - buffer.write('''

- Available on '''); - buffer.write(context4.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context4.linkedName); - buffer.write(''' extension -

'''); - } - buffer.write('\n '); - buffer.write(context3.oneLineDoc); - buffer.write('\n '); - buffer.write( - __renderLibrary_partial_callable_12_partial_attributes_1(context3)); - buffer.writeln(); - buffer.write(''' -'''); - - return buffer.toString(); -} - -String __renderLibrary_partial_callable_12_partial_categorization_0( - ModelFunctionTyped context3) => - _deduplicated_lib_templates__categorization_html(context3); - -String __renderLibrary_partial_callable_12_partial_attributes_1( - ModelFunctionTyped context3) => - _deduplicated_lib_templates__attributes_html(context3); - -String _renderLibrary_partial_typedef_13(Typedef context3) => - _deduplicated_lib_templates__typedef_html(context3); - -String _renderLibrary_partial_container_14(Class context3) => - _deduplicated_lib_templates__container_html(context3); - -String _renderLibrary_partial_search_sidebar_15(LibraryTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderLibrary_partial_packages_16(LibraryTemplateData context0) => - _deduplicated_lib_templates__packages_html(context0); - -String _renderLibrary_partial_footer_17(LibraryTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderMethod_partial_head_0(MethodTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderMethod_partial_source_link_1(Method context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderMethod_partial_feature_set_2(Method context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderMethod_partial_callable_multiline_3(Method context1) { - final buffer = StringBuffer(); - buffer.write( - __renderMethod_partial_callable_multiline_3_partial_annotations_0( - context1)); - buffer.writeln(); - buffer.write(''''''); - buffer.write(context1.modelType.returnType.linkedName); - buffer.write(''' -'''); - buffer.write( - __renderMethod_partial_callable_multiline_3_partial_name_summary_1( - context1)); - buffer.write(context1.genericParameters); - buffer.write('''('''); - if (context1.hasParameters) { - buffer.write(context1.linkedParamsLines); - } - buffer.write(''') -'''); - - return buffer.toString(); -} - -String __renderMethod_partial_callable_multiline_3_partial_annotations_0( - Method context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String __renderMethod_partial_callable_multiline_3_partial_name_summary_1( - Method context1) => - _deduplicated_lib_templates__name_summary_html(context1); - -String _renderMethod_partial_attributes_4(Method context1) => - _deduplicated_lib_templates__attributes_html(context1); - -String _renderMethod_partial_documentation_5(Method context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderMethod_partial_source_code_6(Method context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderMethod_partial_search_sidebar_7(MethodTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderMethod_partial_footer_8(MethodTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderMixin_partial_head_0(MixinTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderMixin_partial_source_link_1(Mixin context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderMixin_partial_feature_set_2(Mixin context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderMixin_partial_categorization_3(Mixin context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderMixin_partial_documentation_4(Mixin context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderMixin_partial_super_chain_5(Mixin context1) => - _deduplicated_lib_templates__super_chain_html(context1); - -String _renderMixin_partial_interfaces_6(Mixin context1) => - _deduplicated_lib_templates__interfaces_html(context1); - -String _renderMixin_partial_available_extensions_7(Mixin context1) => - _deduplicated_lib_templates__available_extensions_html(context1); - -String _renderMixin_partial_annotations_8(Mixin context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String _renderMixin_partial_instance_fields_9(Mixin context1) => - _deduplicated_lib_templates__instance_fields_html(context1); - -String _renderMixin_partial_instance_methods_10(Mixin context1) => - _deduplicated_lib_templates__instance_methods_html(context1); - -String _renderMixin_partial_instance_operators_11(Mixin context1) => - _deduplicated_lib_templates__instance_operators_html(context1); - -String _renderMixin_partial_static_properties_12(Mixin context1) => - _deduplicated_lib_templates__static_properties_html(context1); - -String _renderMixin_partial_static_methods_13(Mixin context1) => - _deduplicated_lib_templates__static_methods_html(context1); - -String _renderMixin_partial_static_constants_14(Mixin context1) => - _deduplicated_lib_templates__static_constants_html(context1); - -String _renderMixin_partial_search_sidebar_15(MixinTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderMixin_partial_footer_16(MixinTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderProperty_partial_head_0(PropertyTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderProperty_partial_source_link_1(Field context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderProperty_partial_feature_set_2(Field context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderProperty_partial_annotations_3(Field context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String _renderProperty_partial_name_summary_4(Field context1) => - _deduplicated_lib_templates__name_summary_html(context1); - -String _renderProperty_partial_attributes_5(Field context1) => - _deduplicated_lib_templates__attributes_html(context1); - -String _renderProperty_partial_documentation_6(Field context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderProperty_partial_source_code_7(Field context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderProperty_partial_accessor_getter_8(Field context1) => - _deduplicated_lib_templates__accessor_getter_html(context1); - -String _renderProperty_partial_accessor_setter_9(Field context1) => - _deduplicated_lib_templates__accessor_setter_html(context1); - -String _renderProperty_partial_search_sidebar_10( - PropertyTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderProperty_partial_footer_11(PropertyTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderSearchPage_partial_head_0(PackageTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderSearchPage_partial_search_sidebar_1( - PackageTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderSearchPage_partial_packages_2(PackageTemplateData context0) => - _deduplicated_lib_templates__packages_html(context0); - -String _renderSearchPage_partial_footer_3(PackageTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderSidebarForContainer_partial_container_sidebar_item_0( - Field context2) { - final buffer = StringBuffer(); - buffer.writeln(); - buffer.write(''' - - '''); - buffer.write(context2.linkedName); - if (context2.isProvidedByExtension) { - var context3 = context2.enclosingExtension; - buffer.writeln(); - buffer.write(''' (ext)'''); - } - buffer.writeln(); - buffer.write(''''''); - - return buffer.toString(); -} - -String _renderSidebarForContainer_partial_container_sidebar_item_1( - Method context2) { - final buffer = StringBuffer(); - buffer.writeln(); - buffer.write(''' - - '''); - buffer.write(context2.linkedName); - if (context2.isProvidedByExtension) { - var context3 = context2.enclosingExtension; - buffer.writeln(); - buffer.write(''' (ext)'''); - } - buffer.writeln(); - buffer.write(''''''); - - return buffer.toString(); -} - -String _renderSidebarForContainer_partial_container_sidebar_item_2( - Operator context2) { - final buffer = StringBuffer(); - buffer.writeln(); - buffer.write(''' - - '''); - buffer.write(context2.linkedName); - if (context2.isProvidedByExtension) { - var context3 = context2.enclosingExtension; - buffer.writeln(); - buffer.write(''' (ext)'''); - } - buffer.writeln(); - buffer.write(''''''); - - return buffer.toString(); -} - -String _renderTopLevelProperty_partial_head_0( - TopLevelPropertyTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderTopLevelProperty_partial_source_link_1( - TopLevelVariable context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderTopLevelProperty_partial_feature_set_2( - TopLevelVariable context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderTopLevelProperty_partial_categorization_3( - TopLevelVariable context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderTopLevelProperty_partial_annotations_4( - TopLevelVariable context1) => - _deduplicated_lib_templates__annotations_html(context1); - -String _renderTopLevelProperty_partial_name_summary_5( - TopLevelVariable context1) => - _deduplicated_lib_templates__name_summary_html(context1); - -String _renderTopLevelProperty_partial_attributes_6( - TopLevelVariable context1) => - _deduplicated_lib_templates__attributes_html(context1); - -String _renderTopLevelProperty_partial_documentation_7( - TopLevelVariable context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderTopLevelProperty_partial_source_code_8( - TopLevelVariable context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderTopLevelProperty_partial_accessor_getter_9( - TopLevelVariable context1) => - _deduplicated_lib_templates__accessor_getter_html(context1); - -String _renderTopLevelProperty_partial_accessor_setter_10( - TopLevelVariable context1) => - _deduplicated_lib_templates__accessor_setter_html(context1); - -String _renderTopLevelProperty_partial_search_sidebar_11( - TopLevelPropertyTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderTopLevelProperty_partial_footer_12( - TopLevelPropertyTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _renderTypedef_partial_head_0(TypedefTemplateData context0) => - _deduplicated_lib_templates__head_html(context0); - -String _renderTypedef_partial_source_link_1(Typedef context1) => - _deduplicated_lib_templates__source_link_html(context1); - -String _renderTypedef_partial_feature_set_2(Typedef context1) => - _deduplicated_lib_templates__feature_set_html(context1); - -String _renderTypedef_partial_categorization_3(Typedef context1) => - _deduplicated_lib_templates__categorization_html(context1); - -String _renderTypedef_partial_typedef_multiline_4(Typedef context1) { - final buffer = StringBuffer(); - if (context1.isCallable) { - var context2 = context1.asCallable; - if (context2.hasAnnotations) { - buffer.writeln(); - buffer.write('''
-
    '''); - var context3 = context2.annotations; - for (var context4 in context3) { - buffer.writeln(); - buffer.write('''
  1. '''); - buffer.write(context4.linkedNameWithParameters); - buffer.write('''
  2. '''); - } - buffer.writeln(); - buffer.write('''
-
'''); - } - if (context2.isConst) { - buffer.write('''const '''); - } - buffer.write(''''''); - buffer.writeEscaped(context2.name); - buffer.write(''''''); - buffer.write(context2.linkedGenericParameters); - buffer.write(''' = - '''); - buffer.write(context2.modelType.linkedName); - buffer.write(''''''); - } - if (!context1.isCallable) { - buffer.write('\n '); - buffer.write( - __renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0( - context1)); - } - buffer.writeln(); - - return buffer.toString(); -} - -String __renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0( - Typedef context1) { - final buffer = StringBuffer(); - if (context1.hasAnnotations) { - buffer.writeln(); - buffer.write('''
-
    '''); - var context2 = context1.annotations; - for (var context3 in context2) { - buffer.writeln(); - buffer.write('''
  1. '''); - buffer.write(context3.linkedNameWithParameters); - buffer.write('''
  2. '''); - } - buffer.writeln(); - buffer.write('''
-
'''); - } - buffer.writeln(); - buffer.write( - ___renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0_partial_name_summary_0( - context1)); - buffer.write(context1.genericParameters); - buffer.write(''' = '''); - buffer.write(context1.modelType.linkedName); - buffer.write(''' -'''); - - return buffer.toString(); -} - -String - ___renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0_partial_name_summary_0( - Typedef context1) => - _deduplicated_lib_templates__name_summary_html(context1); - -String _renderTypedef_partial_documentation_5(Typedef context1) => - _deduplicated_lib_templates__documentation_html(context1); - -String _renderTypedef_partial_source_code_6(Typedef context1) => - _deduplicated_lib_templates__source_code_html(context1); - -String _renderTypedef_partial_search_sidebar_7(TypedefTemplateData context0) => - _deduplicated_lib_templates__search_sidebar_html(context0); - -String _renderTypedef_partial_footer_8(TypedefTemplateData context0) => - _deduplicated_lib_templates__footer_html(context0); - -String _deduplicated_lib_templates__head_html(TemplateDataBase context0) { - final buffer = StringBuffer(); - buffer.write(''' - - - - - - - '''); - buffer.writeEscaped(context0.title); - buffer.write(''''''); - var context1 = context0.relCanonicalPrefix; - if (context1 != null) { - buffer.writeln(); - buffer.write(''' '''); - } - buffer.writeln(); - if (context0.useBaseHref) { - var context2 = context0.htmlBase; - buffer.writeln(); - buffer - .write(''' - '''); - } - buffer.write('\n\n '); - buffer.writeln(); - buffer.write(''' - - - '''); - buffer.writeln(); - buffer.write(''' - - - '''); - buffer.write(context0.customHeader); - buffer.writeln(); - buffer.write(''' -'''); - buffer.writeln(); - buffer.write(''' -
-
- menu - -
'''); - buffer.writeEscaped(context0.self.name); - buffer.write('''
- -
- -
-
-
'''); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__documentation_html(Warnable context0) { - final buffer = StringBuffer(); - if (context0.hasDocumentation) { - buffer.writeln(); - buffer.write('''
- '''); - buffer.write(context0.documentationAsHtml); - buffer.writeln(); - buffer.write('''
'''); - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__library_html(Library context0) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context0.linkedName); - buffer.write(''' '''); - buffer.write( - __deduplicated_lib_templates__library_html_partial_categorization_0( - context0)); - buffer.writeln(); - buffer.write('''
-
'''); - if (context0.isDocumented) { - buffer.write(context0.oneLineDoc); - } - buffer.writeln(); - buffer.write('''
-'''); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__library_html_partial_categorization_0( - Library context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.categoryLabel); - } - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__categorization_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2!.categoryLabel); - } - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__container_html(Container context0) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context0.linkedName); - buffer.write(context0.linkedGenericParameters); - buffer.write(''' '''); - buffer.write( - __deduplicated_lib_templates__container_html_partial_categorization_0( - context0)); - buffer.writeln(); - buffer.write('''
-
- '''); - buffer.write(context0.oneLineDoc); - buffer.writeln(); - buffer.write('''
-'''); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__container_html_partial_categorization_0( - Container context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.categoryLabel); - } - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__extension_html(Extension context0) { - final buffer = StringBuffer(); - buffer.write('''
- '''); - buffer.write(context0.linkedName); - buffer.write(''' - on '''); - buffer.write(context0.extendedElement.linkedName); - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__extension_html_partial_categorization_0( - context0)); - buffer.writeln(); - buffer.write('''
-
- '''); - buffer.write(context0.oneLineDoc); - buffer.writeln(); - buffer.write('''
-'''); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__extension_html_partial_categorization_0( - Extension context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.categoryLabel); - } - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__constant_html(GetterSetterCombo context0) { - final buffer = StringBuffer(); - buffer.write('''
'''); - if (context0.isEnumValue) { - buffer.writeln(); - buffer.write(''' '''); - buffer.write(context0.name); - buffer.write(''''''); - } - if (!context0.isEnumValue) { - buffer.writeln(); - buffer.write(''' '''); - buffer.write(context0.linkedName); - buffer.write(''''''); - } - buffer.writeln(); - buffer.write(''' → const '''); - buffer.write(context0.modelType.linkedName); - buffer.write(''' - '''); - buffer.write( - __deduplicated_lib_templates__constant_html_partial_categorization_0( - context0)); - buffer.writeln(); - buffer.write('''
-
- '''); - buffer.write(context0.oneLineDoc); - buffer.write('\n '); - buffer.write(__deduplicated_lib_templates__constant_html_partial_attributes_1( - context0)); - if (context0.hasConstantValueForDisplay) { - buffer.writeln(); - buffer.write('''
- '''); - buffer.write(context0.constantValueTruncated); - buffer.write(''' -
'''); - } - buffer.writeln(); - buffer.write('''
-'''); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__constant_html_partial_categorization_0( - GetterSetterCombo context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2!.categoryLabel); - } - } - buffer.writeln(); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__constant_html_partial_attributes_1( - GetterSetterCombo context0) { - final buffer = StringBuffer(); - if (context0.hasAttributes) { - buffer.write('''
'''); - buffer.write(context0.attributesAsString); - buffer.write('''
'''); - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__attributes_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasAttributes) { - buffer.write('''
'''); - buffer.write(context0.attributesAsString); - buffer.write('''
'''); - } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__typedef_html(Typedef context0) { - final buffer = StringBuffer(); - if (context0.isCallable) { - var context1 = context0.asCallable; - buffer.writeln(); - buffer.write('''
- '''); - buffer.write(context1.linkedName); - buffer.write(''''''); - buffer.write(context1.linkedGenericParameters); - buffer.write(''' - = '''); - buffer.write(context1.modelType.linkedName); - buffer.write(''' - - '''); - buffer.write( - __deduplicated_lib_templates__typedef_html_partial_categorization_0( - context1)); - buffer.writeln(); - buffer.write('''
- - '''); - buffer.write(context1.oneLineDoc); - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__typedef_html_partial_attributes_1( - context1)); - buffer.writeln(); - buffer.write(''' '''); - } - if (!context0.isCallable) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__typedef_html_partial_type_2(context0)); - } - buffer.writeln(); +String _deduplicated__documentation(Warnable context0) { + final buffer = StringBuffer(); + if (context0.hasDocumentation) { + buffer.writeln(); + buffer.write('''
+ '''); + buffer.write(context0.documentationAsHtml); + buffer.writeln(); + buffer.write('''
'''); + } + buffer.writeln(); return buffer.toString(); } -String __deduplicated_lib_templates__typedef_html_partial_categorization_0( - FunctionTypedef context1) { +String _deduplicated__feature_set(ModelElement context0) { final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { + if (context0.hasFeatureSet) { + var context1 = context0.displayedLanguageFeatures; + for (var context2 in context1) { buffer.write('\n '); - buffer.write(context3.categoryLabel); + buffer.write(context2.featureLabel); } } buffer.writeln(); @@ -3736,224 +2278,301 @@ String __deduplicated_lib_templates__typedef_html_partial_categorization_0( return buffer.toString(); } -String __deduplicated_lib_templates__typedef_html_partial_attributes_1( - FunctionTypedef context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
'''); - buffer.write(context1.attributesAsString); - buffer.write('''
'''); - } - buffer.writeln(); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__typedef_html_partial_type_2( - Typedef context0) { +String _deduplicated__footer(TemplateDataBase context0) { final buffer = StringBuffer(); - buffer.write('''
- + '''); + buffer.writeEscaped(context0.defaultPackage.name); + if (context0.hasFooterVersion) { + buffer.write('\n '); + buffer.writeEscaped(context0.defaultPackage.version); } - buffer.write('''">'''); - buffer.write(context0.linkedName); - buffer.write(''''''); - buffer.write(context0.linkedGenericParameters); - buffer.writeln(); - buffer.write(''' = '''); - buffer.write(context0.modelType.linkedName); buffer.writeln(); buffer.write(''' '''); - buffer.write( - ___deduplicated_lib_templates__typedef_html_partial_type_2_partial_categorization_0( - context0)); - buffer.writeln(); - buffer.write('''
- - '''); - buffer.write(context0.oneLineDoc); - buffer.write('\n '); - buffer.write( - ___deduplicated_lib_templates__typedef_html_partial_type_2_partial_attributes_1( - context0)); + buffer.write(context0.customInnerFooter); buffer.writeln(); - buffer.write(''' + buffer.write(''' '''); - - return buffer.toString(); -} - -String - ___deduplicated_lib_templates__typedef_html_partial_type_2_partial_categorization_0( - Typedef context0) { - final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.categoryLabel); - } - } buffer.writeln(); - - return buffer.toString(); -} - -String - ___deduplicated_lib_templates__typedef_html_partial_type_2_partial_attributes_1( - Typedef context0) { - final buffer = StringBuffer(); - if (context0.hasAttributes) { - buffer.write('''
'''); - buffer.write(context0.attributesAsString); - buffer.write('''
'''); + buffer.writeln(); + buffer.write(''' + +'''); + buffer.write(context0.customFooter); buffer.writeln(); + buffer.write(''' + +'''); return buffer.toString(); } -String _deduplicated_lib_templates__type_html(Typedef context0) { +String _deduplicated__head(TemplateDataBase context0) { final buffer = StringBuffer(); - buffer.write('''
+ + + + + - '''); } - buffer.write('''">'''); - buffer.write(context0.linkedName); - buffer.write(''''''); - buffer.write(context0.linkedGenericParameters); buffer.writeln(); - buffer.write(''' = '''); - buffer.write(context0.modelType.linkedName); + if (context0.useBaseHref) { + var context2 = context0.htmlBase; + buffer.writeln(); + buffer + .write(''' + '''); + } + buffer.write('\n\n '); buffer.writeln(); - buffer.write(''' + buffer.write(''' + + '''); - buffer.write(__deduplicated_lib_templates__type_html_partial_categorization_0( - context0)); buffer.writeln(); - buffer.write('''
- + + '''); - buffer.write(context0.oneLineDoc); - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__type_html_partial_attributes_1(context0)); + buffer.write(context0.customHeader); buffer.writeln(); - buffer.write(''' + buffer.write(''' '''); + buffer.writeln(); + buffer.write(''' +
+
+ menu + +
'''); + buffer.writeEscaped(context0.self.name); + buffer.write('''
+ +
+ +
+
+
'''); return buffer.toString(); } -String __deduplicated_lib_templates__type_html_partial_categorization_0( - Typedef context0) { +String _deduplicated__instance_fields(Container context0) { final buffer = StringBuffer(); - if (context0.hasCategoryNames) { - var context1 = context0.displayedCategories; + if (context0.hasAvailableInstanceFields) { + buffer.writeln(); + buffer.write('''
+

Properties

+
'''); + var context1 = context0.availableInstanceFieldsSorted; for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.categoryLabel); + buffer.write('\n '); + buffer.write(__renderClass_partial_instance_fields_11_partial_property_0( + context2)); } + buffer.writeln(); + buffer.write('''
+
'''); } buffer.writeln(); return buffer.toString(); } -String __deduplicated_lib_templates__type_html_partial_attributes_1( - Typedef context0) { +String _deduplicated__instance_methods(Container context0) { final buffer = StringBuffer(); - if (context0.hasAttributes) { - buffer.write('''
'''); - buffer.write(context0.attributesAsString); - buffer.write('''
'''); + if (context0.hasAvailableInstanceMethods) { + buffer.writeln(); + buffer.write('''
+

Methods

+
'''); + var context1 = context0.availableInstanceMethodsSorted; + for (var context2 in context1) { + buffer.write('\n '); + buffer.write(__renderClass_partial_instance_methods_12_partial_callable_0( + context2)); + } + buffer.writeln(); + buffer.write('''
+
'''); } - buffer.writeln(); return buffer.toString(); } -String _deduplicated_lib_templates__search_sidebar_html( - TemplateDataBase context0) { +String _deduplicated__instance_operators(Container context0) { final buffer = StringBuffer(); - buffer.write( - ''' -
- -
- -'''); + buffer.write(''''''); + buffer.writeEscaped(context0.name); + buffer.write(''''''); return buffer.toString(); } -String _deduplicated_lib_templates__packages_html(TemplateDataBase context0) { +String _deduplicated__packages(TemplateDataBase context0) { final buffer = StringBuffer(); buffer.write('''
    '''); var context1 = context0.localPackages; @@ -4024,213 +2643,148 @@ String _deduplicated_lib_templates__packages_html(TemplateDataBase context0) { return buffer.toString(); } -String _deduplicated_lib_templates__footer_html(TemplateDataBase context0) { +String _deduplicated__search_sidebar(TemplateDataBase context0) { final buffer = StringBuffer(); - buffer.write('''
-
- - '''); - buffer.writeEscaped(context0.defaultPackage.name); - if (context0.hasFooterVersion) { - buffer.write('\n '); - buffer.writeEscaped(context0.defaultPackage.version); - } - buffer.writeln(); - buffer.write(''' - '''); - buffer.write(context0.customInnerFooter); - buffer.writeln(); - buffer.write('''
-'''); - buffer.writeln(); - buffer.writeln(); - buffer.write(''' - -'''); - buffer.write(context0.customFooter); - buffer.writeln(); - buffer.write(''' - -'''); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__source_link_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasSourceHref) { + if (!context0.hasHomepage) { buffer.writeln(); - buffer.write( - ''' '''); + buffer.write('''
  • '''); + buffer.write(context0.layoutTitle); + buffer.write('''
  • '''); } - buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__feature_set_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasFeatureSet) { - var context1 = context0.displayedLanguageFeatures; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write(context2.featureLabel); - } + if (context0.hasHomepage) { + buffer.writeln(); + buffer.write('''
  • '''); + buffer.write(context0.layoutTitle); + buffer.write('''
  • '''); } buffer.writeln(); + buffer.write(''' +'''); return buffer.toString(); } -String _deduplicated_lib_templates__super_chain_html( - InheritingContainer context0) { +String _deduplicated__source_code(ModelElement context0) { final buffer = StringBuffer(); - if (context0.hasPublicSuperChainReversed) { - buffer.writeln(); - buffer.write('''
    Inheritance
    -
    -
      -
    • '''); - buffer.write(context0.linkedObjectType); - buffer.write('''
    • '''); - var context1 = context0.publicSuperChainReversed; - for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context2.linkedName); - buffer.write('''
    • '''); - } + if (context0.hasSourceCode) { buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context0.name); - buffer.write('''
    • -
    -
    '''); + buffer.write('''
    +

    Implementation

    +
    ''');
    +    buffer.write(context0.sourceCode);
    +    buffer.write('''
    +
    '''); } buffer.writeln(); return buffer.toString(); } -String _deduplicated_lib_templates__interfaces_html( - InheritingContainer context0) { +String _deduplicated__source_link(ModelElement context0) { final buffer = StringBuffer(); - if (context0.hasPublicInterfaces) { - buffer.writeln(); - buffer.write('''
    Implemented types
    -
    -
      '''); - var context1 = context0.publicInterfaces; - for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context2.linkedName); - buffer.write('''
    • '''); - } + if (context0.hasSourceHref) { buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write( + ''' '''); } + buffer.writeln(); return buffer.toString(); } -String _deduplicated_lib_templates__available_extensions_html( - InheritingContainer context0) { +String _deduplicated__static_constants(Container context0) { final buffer = StringBuffer(); - if (context0.hasPotentiallyApplicableExtensions) { + buffer.writeln(); + if (context0.hasPublicConstantFields) { buffer.writeln(); - buffer.write('''
    Available extensions
    -
      '''); - var context1 = context0.potentiallyApplicableExtensionsSorted; + buffer.write('''
      +

      Constants

      +
      '''); + var context1 = context0.publicConstantFieldsSorted; for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context2.linkedName); - buffer.write('''
    • '''); + buffer.write('\n '); + buffer.write(__renderClass_partial_static_constants_16_partial_constant_0( + context2)); } buffer.writeln(); - buffer.write('''
    '''); + buffer.write(''' +
    '''); } return buffer.toString(); } -String _deduplicated_lib_templates__container_annotations_html( - Container context0) { +String _deduplicated__static_methods(Container context0) { final buffer = StringBuffer(); - if (context0.hasAnnotations) { + if (context0.hasPublicStaticMethods) { buffer.writeln(); - buffer.write('''
    Annotations
    -
    -
      '''); - var context1 = context0.annotations; + buffer + .write('''
      +

      Static Methods

      +
      '''); + var context1 = context0.publicStaticMethodsSorted; for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    • '''); - buffer.write(context2.linkedNameWithParameters); - buffer.write('''
    • '''); + buffer.write('\n '); + buffer.write(__renderClass_partial_instance_methods_12_partial_callable_0( + context2)); } buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write(''' + '''); } - buffer.write('\n\n'); return buffer.toString(); } -String _deduplicated_lib_templates__constructors_html(Constructable context0) { +String _deduplicated__static_properties(Container context0) { final buffer = StringBuffer(); - if (context0.hasPublicConstructors) { + if (context0.hasPublicVariableStaticFields) { buffer.writeln(); - buffer.write('''
    -

    Constructors

    -
    '''); - var context1 = context0.publicConstructorsSorted; + buffer.write( + '''
    +

    Static Properties

    +
    '''); + var context1 = context0.publicVariableStaticFieldsSorted; for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    - '''); - buffer.write(context2.linkedName); - buffer.write('''('''); - buffer.write(context2.linkedParams); - buffer.write(''') -
    -
    - '''); - buffer.write(context2.oneLineDoc); - if (context2.isConst) { - buffer.writeln(); - buffer.write( - '''
    const
    '''); - } - if (context2.isFactory) { - buffer.writeln(); - buffer.write( - '''
    factory
    '''); - } - buffer.writeln(); - buffer.write('''
    '''); + buffer.write('\n '); + buffer.write(__renderClass_partial_instance_fields_11_partial_property_0( + context2)); } buffer.writeln(); buffer.write('''
    @@ -4240,82 +2794,88 @@ String _deduplicated_lib_templates__constructors_html(Constructable context0) { return buffer.toString(); } -String _deduplicated_lib_templates__instance_fields_html(Container context0) { +String _deduplicated__super_chain(InheritingContainer context0) { final buffer = StringBuffer(); - if (context0.hasAvailableInstanceFields) { + if (context0.hasPublicSuperChainReversed) { buffer.writeln(); - buffer.write('''
    -

    Properties

    -
    '''); - var context1 = context0.availableInstanceFieldsSorted; + buffer.write('''
    Inheritance
    +
    +
      +
    • '''); + buffer.write(context0.linkedObjectType); + buffer.write('''
    • '''); + var context1 = context0.publicSuperChainReversed; for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__instance_fields_html_partial_property_0( - context2)); + buffer.writeln(); + buffer.write('''
    • '''); + buffer.write(context2.linkedName); + buffer.write('''
    • '''); } buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write('''
  • '''); + buffer.write(context0.name); + buffer.write('''
  • + + '''); } buffer.writeln(); return buffer.toString(); } -String __deduplicated_lib_templates__instance_fields_html_partial_property_0( - Field context1) { +String _renderCategory_partial_callable_8(ModelFunctionTyped context2) { final buffer = StringBuffer(); buffer.write('''
    - '''); - buffer.write(context1.linkedName); - buffer.write(''' - '''); - buffer.write(context1.arrow); - buffer.write(' '); - buffer.write(context1.modelType.linkedName); + '''); + buffer.write(context2.linkedName); + buffer.write(''''''); + buffer.write(context2.linkedGenericParameters); + buffer.write('''('''); + buffer.write(context2.linkedParamsNoMetadata); + buffer.write(''') + → '''); + buffer.write(context2.modelType.returnType.linkedName); buffer.write(''' + '''); buffer.write( - ___deduplicated_lib_templates__instance_fields_html_partial_property_0_partial_categorization_0( - context1)); + __renderCategory_partial_callable_8_partial_categorization_0(context2)); buffer.writeln(); buffer.write('''
    '''); - if (context1.isProvidedByExtension) { - var context2 = context1.enclosingExtension; + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); buffer.write('''

    Available on '''); - buffer.write(context2.extendedElement.linkedName); + buffer.write(context3.extendedElement.linkedName); buffer.write(''', provided by the '''); - buffer.write(context2.linkedName); + buffer.write(context3.linkedName); buffer.write(''' extension

    '''); } buffer.write('\n '); - buffer.write(context1.oneLineDoc); + buffer.write(context2.oneLineDoc); buffer.write('\n '); buffer.write( - ___deduplicated_lib_templates__instance_fields_html_partial_property_0_partial_attributes_1( - context1)); + __renderCategory_partial_callable_8_partial_attributes_1(context2)); buffer.writeln(); buffer.write(''' '''); @@ -4323,118 +2883,144 @@ String __deduplicated_lib_templates__instance_fields_html_partial_property_0( return buffer.toString(); } -String - ___deduplicated_lib_templates__instance_fields_html_partial_property_0_partial_categorization_0( - Field context1) { +String _renderCategory_partial_constant_6(TopLevelVariable context2) => + _deduplicated__constant(context2); + +String _renderCategory_partial_container_3(Container context2) { final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); - } + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write(context2.linkedGenericParameters); + buffer.write(''' '''); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context2)); + buffer.writeln(); + buffer.write('''
    +
    + '''); + buffer.write(context2.oneLineDoc); buffer.writeln(); + buffer.write('''
    +'''); return buffer.toString(); } -String - ___deduplicated_lib_templates__instance_fields_html_partial_property_0_partial_attributes_1( - Field context1) { +String _renderCategory_partial_documentation_1(Category context1) => + _deduplicated__documentation(context1); + +String _renderCategory_partial_extension_5(Extension context2) { final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write(''' + on '''); + buffer.write(context2.extendedElement.linkedName); + buffer.write('\n '); + buffer.write( + __renderCategory_partial_container_3_partial_categorization_0(context2)); buffer.writeln(); + buffer.write('''
    +
    + '''); + buffer.write(context2.oneLineDoc); + buffer.writeln(); + buffer.write('''
    +'''); return buffer.toString(); } -String _deduplicated_lib_templates__instance_methods_html(Container context0) { +String _renderCategory_partial_footer_15(CategoryTemplateData context0) => + _deduplicated__footer(context0); + +String _renderCategory_partial_head_0(CategoryTemplateData context0) => + _deduplicated__head(context0); + +String _renderCategory_partial_library_2(Library context2) { final buffer = StringBuffer(); - if (context0.hasAvailableInstanceMethods) { - buffer.writeln(); - buffer.write('''
    -

    Methods

    -
    '''); - var context1 = context0.availableInstanceMethodsSorted; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__instance_methods_html_partial_callable_0( - context2)); - } - buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write(''' '''); + buffer.write( + __renderCategory_partial_library_2_partial_categorization_0(context2)); + buffer.writeln(); + buffer.write('''
    +
    '''); + if (context2.isDocumented) { + buffer.write(context2.oneLineDoc); } + buffer.writeln(); + buffer.write('''
    +'''); return buffer.toString(); } -String __deduplicated_lib_templates__instance_methods_html_partial_callable_0( - Method context1) { +String _renderCategory_partial_packages_13(CategoryTemplateData context0) => + _deduplicated__packages(context0); + +String _renderCategory_partial_property_7(TopLevelVariable context2) { final buffer = StringBuffer(); buffer.write('''
    - '''); - buffer.write(context1.linkedName); - buffer.write(''''''); - buffer.write(context1.linkedGenericParameters); - buffer.write('''('''); - buffer.write(context1.linkedParamsNoMetadata); - buffer.write(''') - → '''); - buffer.write(context1.modelType.returnType.linkedName); + '''); + buffer.write(context2.linkedName); + buffer.write(''' + '''); + buffer.write(context2.arrow); + buffer.write(' '); + buffer.write(context2.modelType.linkedName); buffer.write(''' - '''); buffer.write( - ___deduplicated_lib_templates__instance_methods_html_partial_callable_0_partial_categorization_0( - context1)); + __renderCategory_partial_constant_6_partial_categorization_0(context2)); buffer.writeln(); buffer.write('''
    '''); - if (context1.isProvidedByExtension) { - var context2 = context1.enclosingExtension; + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); buffer.write('''

    Available on '''); - buffer.write(context2.extendedElement.linkedName); + buffer.write(context3.extendedElement.linkedName); buffer.write(''', provided by the '''); - buffer.write(context2.linkedName); + buffer.write(context3.linkedName); buffer.write(''' extension

    '''); } buffer.write('\n '); - buffer.write(context1.oneLineDoc); + buffer.write(context2.oneLineDoc); buffer.write('\n '); buffer.write( - ___deduplicated_lib_templates__instance_methods_html_partial_callable_0_partial_attributes_1( - context1)); + __renderCategory_partial_constant_6_partial_attributes_1(context2)); buffer.writeln(); buffer.write(''' '''); @@ -4442,340 +3028,602 @@ String __deduplicated_lib_templates__instance_methods_html_partial_callable_0( return buffer.toString(); } -String - ___deduplicated_lib_templates__instance_methods_html_partial_callable_0_partial_categorization_0( - Method context1) { +String _renderCategory_partial_search_sidebar_12( + CategoryTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderCategory_partial_sidebar_for_category_14( + CategoryTemplateData context0) { final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); + buffer.write('''
      '''); + var context1 = context0.self; + if (context1.hasPublicLibraries) { + buffer.writeln(); + buffer.write('''
    1. Libraries
    2. '''); + var context2 = context0.self; + var context3 = context2.publicLibrariesSorted; + for (var context4 in context3) { + buffer.writeln(); + buffer.write('''
    3. '''); + buffer.write(context4.linkedName); + buffer.write('''
    4. '''); } } buffer.writeln(); - - return buffer.toString(); -} - -String - ___deduplicated_lib_templates__instance_methods_html_partial_callable_0_partial_attributes_1( - Method context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
      '''); - buffer.write(context1.attributesAsString); - buffer.write('''
      '''); + var context5 = context0.self; + if (context5.hasPublicClasses) { + buffer.writeln(); + buffer.write('''
    5. Classes
    6. '''); + var context6 = context0.self; + var context7 = context6.publicClassesSorted; + for (var context8 in context7) { + buffer.writeln(); + buffer.write('''
    7. '''); + buffer.write(context8.linkedName); + buffer.write('''
    8. '''); + } } buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__instance_operators_html( - Container context0) { - final buffer = StringBuffer(); - if (context0.hasAvailableInstanceOperators) { + var context9 = context0.self; + if (context9.hasPublicEnums) { buffer.writeln(); - buffer.write('''
      Enums'''); + var context10 = context0.self; + var context11 = context10.publicEnumsSorted; + for (var context12 in context11) { + buffer.writeln(); + buffer.write('''
    9. '''); + buffer.write(context12.linkedName); + buffer.write('''
    10. '''); } - buffer.write('''" - id="operators"> -

      Operators

      -
      '''); - var context1 = context0.availableInstanceOperatorsSorted; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__instance_operators_html_partial_callable_0( - context2)); + } + buffer.writeln(); + var context13 = context0.self; + if (context13.hasPublicMixins) { + buffer.writeln(); + buffer.write('''
    11. Mixins
    12. '''); + var context14 = context0.self; + var context15 = context14.publicMixinsSorted; + for (var context16 in context15) { + buffer.writeln(); + buffer.write('''
    13. '''); + buffer.write(context16.linkedName); + buffer.write('''
    14. '''); } + } + buffer.writeln(); + var context17 = context0.self; + if (context17.hasPublicExtensionTypes) { buffer.writeln(); - buffer.write('''
      -
      '''); + buffer.write('''
    15. Extension Types
    16. '''); + var context18 = context0.self; + var context19 = context18.publicExtensionTypesSorted; + for (var context20 in context19) { + buffer.writeln(); + buffer.write('''
    17. '''); + buffer.write(context20.linkedName); + buffer.write('''
    18. '''); + } } - - return buffer.toString(); -} - -String __deduplicated_lib_templates__instance_operators_html_partial_callable_0( - Operator context1) { - final buffer = StringBuffer(); - buffer.write('''
      Constants'''); + var context22 = context0.self; + var context23 = context22.publicConstantsSorted; + for (var context24 in context23) { + buffer.writeln(); + buffer.write('''
    19. '''); + buffer.write(context24.linkedName); + buffer.write('''
    20. '''); + } } - buffer.write('''"> - Properties'''); + var context26 = context0.self; + var context27 = context26.publicPropertiesSorted; + for (var context28 in context27) { + buffer.writeln(); + buffer.write('''
    21. '''); + buffer.write(context28.linkedName); + buffer.write('''
    22. '''); + } } - buffer.write('''">'''); - buffer.write(context1.linkedName); - buffer.write('''
      '''); - buffer.write(context1.linkedGenericParameters); - buffer.write('''('''); - buffer.write(context1.linkedParamsNoMetadata); - buffer.write(''') - → '''); - buffer.write(context1.modelType.returnType.linkedName); - buffer.write(''' - - '''); - buffer.write( - ___deduplicated_lib_templates__instance_operators_html_partial_callable_0_partial_categorization_0( - context1)); buffer.writeln(); - buffer.write('''
      -Functions'''); + var context30 = context0.self; + var context31 = context30.publicFunctionsSorted; + for (var context32 in context31) { + buffer.writeln(); + buffer.write('''
    23. '''); + buffer.write(context32.linkedName); + buffer.write('''
    24. '''); + } } - buffer.write('''>'''); - if (context1.isProvidedByExtension) { - var context2 = context1.enclosingExtension; + buffer.writeln(); + var context33 = context0.self; + if (context33.hasPublicTypedefs) { buffer.writeln(); - buffer.write('''

      - Available on '''); - buffer.write(context2.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context2.linkedName); - buffer.write(''' extension -

      '''); + buffer.write('''
    25. Typedefs
    26. '''); + var context34 = context0.self; + var context35 = context34.publicTypedefsSorted; + for (var context36 in context35) { + buffer.writeln(); + buffer.write('''
    27. '''); + buffer.write(context36.linkedName); + buffer.write('''
    28. '''); + } + } + buffer.writeln(); + var context37 = context0.self; + if (context37.hasPublicExceptions) { + buffer.writeln(); + buffer.write('''
    29. Exceptions
    30. '''); + var context38 = context0.self; + var context39 = context38.publicExceptionsSorted; + for (var context40 in context39) { + buffer.writeln(); + buffer.write('''
    31. '''); + buffer.write(context40.linkedName); + buffer.write('''
    32. '''); + } + } + buffer.writeln(); + var context41 = context0.self; + if (context41.hasPublicExtensions) { + buffer.writeln(); + buffer.write('''
    33. Extensions
    34. '''); + var context42 = context0.self; + var context43 = context42.publicExtensionsSorted; + for (var context44 in context43) { + buffer.writeln(); + buffer.write('''
    35. '''); + buffer.write(context44.linkedName); + buffer.write('''
    36. '''); + } } - buffer.write('\n '); - buffer.write(context1.oneLineDoc); - buffer.write('\n '); - buffer.write( - ___deduplicated_lib_templates__instance_operators_html_partial_callable_0_partial_attributes_1( - context1)); buffer.writeln(); - buffer.write(''' + buffer.write('''
    '''); return buffer.toString(); } -String - ___deduplicated_lib_templates__instance_operators_html_partial_callable_0_partial_categorization_0( - Operator context1) { +String _renderCategory_partial_typedef_10(Typedef context2) { final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); + if (context2.isCallable) { + var context3 = context2.asCallable; + buffer.writeln(); + buffer.write('''
    + '''); + buffer.write(context3.linkedName); + buffer.write(''''''); + buffer.write(context3.linkedGenericParameters); + buffer.write(''' + = '''); + buffer.write(context3.modelType.linkedName); + buffer.write(''' + + '''); + buffer.write( + __renderCategory_partial_typedef_10_partial_categorization_0(context3)); + buffer.writeln(); + buffer.write('''
    + + '''); + buffer.write(context3.oneLineDoc); + buffer.write('\n '); + buffer.write( + __renderCategory_partial_typedef_10_partial_attributes_1(context3)); + buffer.writeln(); + buffer.write(''' '''); + } + if (!context2.isCallable) { + buffer.write('\n '); + buffer.write(__renderCategory_partial_typedef_10_partial_type_2(context2)); } buffer.writeln(); return buffer.toString(); } -String - ___deduplicated_lib_templates__instance_operators_html_partial_callable_0_partial_attributes_1( - Operator context1) { +String _renderClass_partial_available_extensions_8(Class context1) => + _deduplicated__available_extensions(context1); + +String _renderClass_partial_constructors_10(Class context1) => + _deduplicated__constructors(context1); + +String _renderClass_partial_container_annotations_9(Class context1) => + _deduplicated__container_annotations(context1); + +String _renderClass_partial_documentation_4(Class context1) => + _deduplicated__documentation(context1); + +String _renderClass_partial_feature_set_2(Class context1) => + _deduplicated__feature_set(context1); + +String _renderClass_partial_footer_18(ClassTemplateData context0) => + _deduplicated__footer(context0); + +String _renderClass_partial_head_0(ClassTemplateData context0) => + _deduplicated__head(context0); + +String _renderClass_partial_instance_fields_11(Class context1) => + _deduplicated__instance_fields(context1); + +String _renderClass_partial_instance_methods_12(Class context1) => + _deduplicated__instance_methods(context1); + +String _renderClass_partial_instance_operators_13(Class context1) => + _deduplicated__instance_operators(context1); + +String _renderClass_partial_interfaces_6(Class context1) => + _deduplicated__interfaces(context1); + +String _renderClass_partial_mixed_in_types_7(Class context1) { final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); + if (context1.hasPublicMixedInTypes) { + buffer.writeln(); + buffer.write('''
    Mixed-in types
    +
    +
      '''); + var context2 = context1.publicMixedInTypes; + for (var context3 in context2) { + buffer.writeln(); + buffer.write('''
    • '''); + buffer.write(context3.linkedName); + buffer.write('''
    • '''); + } + buffer.writeln(); + buffer.write('''
    +
    '''); } - buffer.writeln(); return buffer.toString(); } -String _deduplicated_lib_templates__static_properties_html(Container context0) { +String _renderClass_partial_search_sidebar_17(ClassTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderClass_partial_source_link_1(Class context1) => + _deduplicated__source_link(context1); + +String _renderClass_partial_static_constants_16(Class context1) => + _deduplicated__static_constants(context1); + +String _renderClass_partial_static_methods_15(Class context1) => + _deduplicated__static_methods(context1); + +String _renderClass_partial_static_properties_14(Class context1) => + _deduplicated__static_properties(context1); + +String _renderClass_partial_super_chain_5(Class context1) => + _deduplicated__super_chain(context1); + +String _renderConstructor_partial_annotations_3(Constructor context1) => + _deduplicated__annotations(context1); + +String _renderConstructor_partial_documentation_4(Constructor context1) => + _deduplicated__documentation(context1); + +String _renderConstructor_partial_feature_set_2(Constructor context1) => + _deduplicated__feature_set(context1); + +String _renderConstructor_partial_footer_7(ConstructorTemplateData context0) => + _deduplicated__footer(context0); + +String _renderConstructor_partial_head_0(ConstructorTemplateData context0) => + _deduplicated__head(context0); + +String _renderConstructor_partial_search_sidebar_6( + ConstructorTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderConstructor_partial_source_code_5(Constructor context1) => + _deduplicated__source_code(context1); + +String _renderConstructor_partial_source_link_1(Constructor context1) => + _deduplicated__source_link(context1); + +String _renderEnum_partial_available_extensions_8(Enum context1) => + _deduplicated__available_extensions(context1); + +String _renderEnum_partial_container_annotations_9(Enum context1) => + _deduplicated__container_annotations(context1); + +String _renderEnum_partial_documentation_4(Enum context1) => + _deduplicated__documentation(context1); + +String _renderEnum_partial_feature_set_2(Enum context1) => + _deduplicated__feature_set(context1); + +String _renderEnum_partial_footer_18(EnumTemplateData context0) => + _deduplicated__footer(context0); + +String _renderEnum_partial_head_0(EnumTemplateData context0) => + _deduplicated__head(context0); + +String _renderEnum_partial_instance_fields_11(Enum context1) => + _deduplicated__instance_fields(context1); + +String _renderEnum_partial_instance_methods_12(Enum context1) => + _deduplicated__instance_methods(context1); + +String _renderEnum_partial_instance_operators_13(Enum context1) => + _deduplicated__instance_operators(context1); + +String _renderEnum_partial_interfaces_6(Enum context1) => + _deduplicated__interfaces(context1); + +String _renderEnum_partial_mixed_in_types_7(Enum context1) { final buffer = StringBuffer(); - if (context0.hasPublicVariableStaticFields) { + if (context1.hasPublicMixedInTypes) { buffer.writeln(); - buffer.write( - '''
    -

    Static Properties

    -
    '''); - var context1 = context0.publicVariableStaticFieldsSorted; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__static_properties_html_partial_property_0( - context2)); + buffer.write('''
    Mixed-in types
    +
    +
      '''); + var context2 = context1.publicMixedInTypes; + for (var context3 in context2) { + buffer.writeln(); + buffer.write('''
    • '''); + buffer.write(context3.linkedName); + buffer.write('''
    • '''); } buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write(''' + '''); } return buffer.toString(); } -String __deduplicated_lib_templates__static_properties_html_partial_property_0( - Field context1) { - final buffer = StringBuffer(); - buffer.write('''
    - '''); - buffer.write(context1.linkedName); - buffer.write(''' - '''); - buffer.write(context1.arrow); - buffer.write(' '); - buffer.write(context1.modelType.linkedName); - buffer.write(''' - '''); +String _renderEnum_partial_search_sidebar_17(EnumTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderEnum_partial_source_link_1(Enum context1) => + _deduplicated__source_link(context1); + +String _renderEnum_partial_static_constants_16(Enum context1) => + _deduplicated__static_constants(context1); + +String _renderEnum_partial_static_methods_15(Enum context1) => + _deduplicated__static_methods(context1); + +String _renderEnum_partial_static_properties_14(Enum context1) => + _deduplicated__static_properties(context1); + +String _renderEnum_partial_super_chain_5(Enum context1) => + _deduplicated__super_chain(context1); + +String _renderError_partial_footer_3(PackageTemplateData context0) => + _deduplicated__footer(context0); + +String _renderError_partial_head_0(PackageTemplateData context0) => + _deduplicated__head(context0); + +String _renderError_partial_packages_2(PackageTemplateData context0) => + _deduplicated__packages(context0); + +String _renderError_partial_search_sidebar_1(PackageTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderExtensionType_partial_available_extensions_6( + ExtensionType context1) => + _deduplicated__available_extensions(context1); + +String _renderExtensionType_partial_constructors_8(ExtensionType context1) => + _deduplicated__constructors(context1); + +String _renderExtensionType_partial_container_annotations_7( + ExtensionType context1) => + _deduplicated__container_annotations(context1); + +String _renderExtensionType_partial_documentation_4(ExtensionType context1) => + _deduplicated__documentation(context1); + +String _renderExtensionType_partial_feature_set_2(ExtensionType context1) => + _deduplicated__feature_set(context1); + +String _renderExtensionType_partial_footer_16( + ExtensionTypeTemplateData context0) => + _deduplicated__footer(context0); + +String _renderExtensionType_partial_head_0( + ExtensionTypeTemplateData context0) => + _deduplicated__head(context0); + +String _renderExtensionType_partial_instance_fields_9(ExtensionType context1) => + _deduplicated__instance_fields(context1); + +String _renderExtensionType_partial_instance_methods_10( + ExtensionType context1) => + _deduplicated__instance_methods(context1); + +String _renderExtensionType_partial_instance_operators_11( + ExtensionType context1) => + _deduplicated__instance_operators(context1); + +String _renderExtensionType_partial_interfaces_5(ExtensionType context1) => + _deduplicated__interfaces(context1); + +String _renderExtensionType_partial_search_sidebar_15( + ExtensionTypeTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderExtensionType_partial_source_link_1(ExtensionType context1) => + _deduplicated__source_link(context1); + +String _renderExtensionType_partial_static_constants_14( + ExtensionType context1) => + _deduplicated__static_constants(context1); + +String _renderExtensionType_partial_static_methods_13(ExtensionType context1) => + _deduplicated__static_methods(context1); + +String _renderExtensionType_partial_static_properties_12( + ExtensionType context1) => + _deduplicated__static_properties(context1); + +String _renderExtension_partial_container_annotations_5(Extension context1) => + _deduplicated__container_annotations(context1); + +String _renderExtension_partial_documentation_4(Extension context1) => + _deduplicated__documentation(context1); + +String _renderExtension_partial_feature_set_2(Extension context1) => + _deduplicated__feature_set(context1); + +String _renderExtension_partial_footer_13( + ExtensionTemplateData context0) => + _deduplicated__footer(context0); + +String _renderExtension_partial_head_0( + ExtensionTemplateData context0) => + _deduplicated__head(context0); + +String _renderExtension_partial_instance_fields_6(Extension context1) => + _deduplicated__instance_fields(context1); + +String _renderExtension_partial_instance_methods_7(Extension context1) => + _deduplicated__instance_methods(context1); + +String _renderExtension_partial_instance_operators_8(Extension context1) => + _deduplicated__instance_operators(context1); + +String _renderExtension_partial_search_sidebar_12( + ExtensionTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderExtension_partial_source_link_1(Extension context1) => + _deduplicated__source_link(context1); + +String _renderExtension_partial_static_constants_11(Extension context1) => + _deduplicated__static_constants(context1); + +String _renderExtension_partial_static_methods_10(Extension context1) => + _deduplicated__static_methods(context1); + +String _renderExtension_partial_static_properties_9(Extension context1) => + _deduplicated__static_properties(context1); + +String _renderFunction_partial_callable_multiline_4(ModelFunction context1) { + final buffer = StringBuffer(); buffer.write( - ___deduplicated_lib_templates__static_properties_html_partial_property_0_partial_categorization_0( + __renderFunction_partial_callable_multiline_4_partial_annotations_0( context1)); buffer.writeln(); - buffer.write('''
    -'''); - if (context1.isProvidedByExtension) { - var context2 = context1.enclosingExtension; - buffer.writeln(); - buffer.write('''

    - Available on '''); - buffer.write(context2.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context2.linkedName); - buffer.write(''' extension -

    '''); - } - buffer.write('\n '); - buffer.write(context1.oneLineDoc); - buffer.write('\n '); + buffer.write(''''''); + buffer.write(context1.modelType.returnType.linkedName); + buffer.write(''' +'''); buffer.write( - ___deduplicated_lib_templates__static_properties_html_partial_property_0_partial_attributes_1( + __renderFunction_partial_callable_multiline_4_partial_name_summary_1( context1)); - buffer.writeln(); - buffer.write(''' + buffer.write(context1.genericParameters); + buffer.write('''('''); + if (context1.hasParameters) { + buffer.write(context1.linkedParamsLines); + } + buffer.write(''') '''); return buffer.toString(); } -String - ___deduplicated_lib_templates__static_properties_html_partial_property_0_partial_categorization_0( - Field context1) { - final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); - } - } - buffer.writeln(); +String _renderFunction_partial_documentation_6(ModelFunction context1) => + _deduplicated__documentation(context1); - return buffer.toString(); -} +String _renderFunction_partial_feature_set_2(ModelFunction context1) => + _deduplicated__feature_set(context1); -String - ___deduplicated_lib_templates__static_properties_html_partial_property_0_partial_attributes_1( - Field context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); - } - buffer.writeln(); +String _renderFunction_partial_footer_9(FunctionTemplateData context0) => + _deduplicated__footer(context0); - return buffer.toString(); -} +String _renderFunction_partial_head_0(FunctionTemplateData context0) => + _deduplicated__head(context0); -String _deduplicated_lib_templates__static_methods_html(Container context0) { - final buffer = StringBuffer(); - if (context0.hasPublicStaticMethods) { - buffer.writeln(); - buffer - .write('''
    -

    Static Methods

    -
    '''); - var context1 = context0.publicStaticMethodsSorted; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__static_methods_html_partial_callable_0( - context2)); - } - buffer.writeln(); - buffer.write('''
    -
    '''); - } +String _renderFunction_partial_search_sidebar_8( + FunctionTemplateData context0) => + _deduplicated__search_sidebar(context0); - return buffer.toString(); -} +String _renderFunction_partial_source_code_7(ModelFunction context1) => + _deduplicated__source_code(context1); + +String _renderFunction_partial_source_link_1(ModelFunction context1) => + _deduplicated__source_link(context1); + +String _renderIndex_partial_documentation_1(Package context1) => + _deduplicated__documentation(context1); + +String _renderLibrary_partial_documentation_4(Library context1) => + _deduplicated__documentation(context1); -String __deduplicated_lib_templates__static_methods_html_partial_callable_0( - Method context1) { +String _renderLibrary_partial_extension_type_8(ExtensionType context3) { final buffer = StringBuffer(); buffer.write('''
    - '''); - buffer.write(context1.linkedName); - buffer.write(''''''); - buffer.write(context1.linkedGenericParameters); - buffer.write('''('''); - buffer.write(context1.linkedParamsNoMetadata); - buffer.write(''') - → '''); - buffer.write(context1.modelType.returnType.linkedName); - buffer.write(''' - - '''); + buffer.write(context3.linkedName); + buffer.write(''' '''); buffer.write( - ___deduplicated_lib_templates__static_methods_html_partial_callable_0_partial_categorization_0( - context1)); + __renderCategory_partial_container_3_partial_categorization_0(context3)); buffer.writeln(); buffer.write('''
    -'''); - if (context1.isProvidedByExtension) { - var context2 = context1.enclosingExtension; - buffer.writeln(); - buffer.write('''

    - Available on '''); - buffer.write(context2.extendedElement.linkedName); - buffer.write(''', - provided by the '''); - buffer.write(context2.linkedName); - buffer.write(''' extension -

    '''); - } - buffer.write('\n '); - buffer.write(context1.oneLineDoc); - buffer.write('\n '); - buffer.write( - ___deduplicated_lib_templates__static_methods_html_partial_callable_0_partial_attributes_1( - context1)); +
    + '''); + buffer.write(context3.oneLineDoc); buffer.writeln(); buffer.write('''
    '''); @@ -4783,444 +3631,631 @@ String __deduplicated_lib_templates__static_methods_html_partial_callable_0( return buffer.toString(); } -String - ___deduplicated_lib_templates__static_methods_html_partial_callable_0_partial_categorization_0( - Method context1) { - final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); - } - } - buffer.writeln(); +String _renderLibrary_partial_feature_set_2(Library context1) => + _deduplicated__feature_set(context1); - return buffer.toString(); -} +String _renderLibrary_partial_footer_17(LibraryTemplateData context0) => + _deduplicated__footer(context0); -String - ___deduplicated_lib_templates__static_methods_html_partial_callable_0_partial_attributes_1( - Method context1) { +String _renderLibrary_partial_head_0(LibraryTemplateData context0) => + _deduplicated__head(context0); + +String _renderLibrary_partial_packages_16(LibraryTemplateData context0) => + _deduplicated__packages(context0); + +String _renderLibrary_partial_search_sidebar_15(LibraryTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderLibrary_partial_source_link_1(Library context1) => + _deduplicated__source_link(context1); + +String _renderMethod_partial_callable_multiline_3(Method context1) { final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); - } + buffer.write( + __renderMethod_partial_callable_multiline_3_partial_annotations_0( + context1)); buffer.writeln(); + buffer.write(''''''); + buffer.write(context1.modelType.returnType.linkedName); + buffer.write(''' +'''); + buffer.write( + __renderMethod_partial_callable_multiline_3_partial_name_summary_1( + context1)); + buffer.write(context1.genericParameters); + buffer.write('''('''); + if (context1.hasParameters) { + buffer.write(context1.linkedParamsLines); + } + buffer.write(''') +'''); return buffer.toString(); } -String _deduplicated_lib_templates__static_constants_html(Container context0) { +String _renderMethod_partial_documentation_5(Method context1) => + _deduplicated__documentation(context1); + +String _renderMethod_partial_feature_set_2(Method context1) => + _deduplicated__feature_set(context1); + +String _renderMethod_partial_footer_8(MethodTemplateData context0) => + _deduplicated__footer(context0); + +String _renderMethod_partial_head_0(MethodTemplateData context0) => + _deduplicated__head(context0); + +String _renderMethod_partial_search_sidebar_7(MethodTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderMethod_partial_source_code_6(Method context1) => + _deduplicated__source_code(context1); + +String _renderMethod_partial_source_link_1(Method context1) => + _deduplicated__source_link(context1); + +String _renderMixin_partial_annotations_8(Mixin context1) => + _deduplicated__annotations(context1); + +String _renderMixin_partial_available_extensions_7(Mixin context1) => + _deduplicated__available_extensions(context1); + +String _renderMixin_partial_documentation_4(Mixin context1) => + _deduplicated__documentation(context1); + +String _renderMixin_partial_feature_set_2(Mixin context1) => + _deduplicated__feature_set(context1); + +String _renderMixin_partial_footer_16(MixinTemplateData context0) => + _deduplicated__footer(context0); + +String _renderMixin_partial_head_0(MixinTemplateData context0) => + _deduplicated__head(context0); + +String _renderMixin_partial_instance_fields_9(Mixin context1) => + _deduplicated__instance_fields(context1); + +String _renderMixin_partial_instance_methods_10(Mixin context1) => + _deduplicated__instance_methods(context1); + +String _renderMixin_partial_instance_operators_11(Mixin context1) => + _deduplicated__instance_operators(context1); + +String _renderMixin_partial_interfaces_6(Mixin context1) => + _deduplicated__interfaces(context1); + +String _renderMixin_partial_search_sidebar_15(MixinTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderMixin_partial_source_link_1(Mixin context1) => + _deduplicated__source_link(context1); + +String _renderMixin_partial_static_constants_14(Mixin context1) => + _deduplicated__static_constants(context1); + +String _renderMixin_partial_static_methods_13(Mixin context1) => + _deduplicated__static_methods(context1); + +String _renderMixin_partial_static_properties_12(Mixin context1) => + _deduplicated__static_properties(context1); + +String _renderMixin_partial_super_chain_5(Mixin context1) => + _deduplicated__super_chain(context1); + +String _renderProperty_partial_accessor_getter_8(Field context1) => + _deduplicated__accessor_getter(context1); + +String _renderProperty_partial_accessor_setter_9(Field context1) => + _deduplicated__accessor_setter(context1); + +String _renderProperty_partial_annotations_3(Field context1) => + _deduplicated__annotations(context1); + +String _renderProperty_partial_documentation_6(Field context1) => + _deduplicated__documentation(context1); + +String _renderProperty_partial_feature_set_2(Field context1) => + _deduplicated__feature_set(context1); + +String _renderProperty_partial_footer_11(PropertyTemplateData context0) => + _deduplicated__footer(context0); + +String _renderProperty_partial_head_0(PropertyTemplateData context0) => + _deduplicated__head(context0); + +String _renderProperty_partial_name_summary_4(Field context1) => + _deduplicated__name_summary(context1); + +String _renderProperty_partial_search_sidebar_10( + PropertyTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderProperty_partial_source_code_7(Field context1) => + _deduplicated__source_code(context1); + +String _renderProperty_partial_source_link_1(Field context1) => + _deduplicated__source_link(context1); + +String _renderSidebarForContainer_partial_container_sidebar_item_0( + Field context2) { final buffer = StringBuffer(); buffer.writeln(); - if (context0.hasPublicConstantFields) { - buffer.writeln(); - buffer.write('''
    -

    Constants

    -
    '''); - var context1 = context0.publicConstantFieldsSorted; - for (var context2 in context1) { - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__static_constants_html_partial_constant_0( - context2)); - } + buffer.write(''' + + '''); + buffer.write(context2.linkedName); + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); - buffer.write('''
    -
    '''); + buffer.write(''' (ext)'''); } + buffer.writeln(); + buffer.write(''''''); return buffer.toString(); } -String __deduplicated_lib_templates__static_constants_html_partial_constant_0( - Field context1) { +String _renderSidebarForContainer_partial_container_sidebar_item_1( + Method context2) { final buffer = StringBuffer(); - buffer.write('''
    '''); - if (context1.isEnumValue) { - buffer.writeln(); - buffer.write(''' '''); - buffer.write(context1.name); - buffer.write(''''''); - } - if (!context1.isEnumValue) { - buffer.writeln(); - buffer.write(''' '''); - buffer.write(context1.linkedName); - buffer.write(''''''); - } - buffer.writeln(); - buffer.write(''' → const '''); - buffer.write(context1.modelType.linkedName); - buffer.write(''' - '''); - buffer.write( - ___deduplicated_lib_templates__static_constants_html_partial_constant_0_partial_categorization_0( - context1)); buffer.writeln(); - buffer.write('''
    -
    + buffer.write(''' + '''); - buffer.write(context1.oneLineDoc); - buffer.write('\n '); - buffer.write( - ___deduplicated_lib_templates__static_constants_html_partial_constant_0_partial_attributes_1( - context1)); - if (context1.hasConstantValueForDisplay) { + buffer.write(context2.linkedName); + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); - buffer.write('''
    - '''); - buffer.write(context1.constantValueTruncated); - buffer.write(''' -
    '''); + buffer.write(''' (ext)'''); } buffer.writeln(); - buffer.write('''
    -'''); + buffer.write(''''''); return buffer.toString(); } -String - ___deduplicated_lib_templates__static_constants_html_partial_constant_0_partial_categorization_0( - Field context1) { - final buffer = StringBuffer(); - if (context1.hasCategoryNames) { - var context2 = context1.displayedCategories; - for (var context3 in context2) { - buffer.write('\n '); - buffer.write(context3!.categoryLabel); - } - } - buffer.writeln(); +String _renderTopLevelProperty_partial_accessor_getter_9( + TopLevelVariable context1) => + _deduplicated__accessor_getter(context1); - return buffer.toString(); -} +String _renderTopLevelProperty_partial_accessor_setter_10( + TopLevelVariable context1) => + _deduplicated__accessor_setter(context1); -String - ___deduplicated_lib_templates__static_constants_html_partial_constant_0_partial_attributes_1( - Field context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); - } - buffer.writeln(); +String _renderTopLevelProperty_partial_annotations_4( + TopLevelVariable context1) => + _deduplicated__annotations(context1); - return buffer.toString(); -} +String _renderTopLevelProperty_partial_documentation_7( + TopLevelVariable context1) => + _deduplicated__documentation(context1); -String _deduplicated_lib_templates__annotations_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasAnnotations) { - buffer.writeln(); - buffer.write('''
    -
      '''); - var context1 = context0.annotations; - for (var context2 in context1) { - buffer.writeln(); - buffer.write('''
    1. '''); - buffer.write(context2.linkedNameWithParameters); - buffer.write('''
    2. '''); - } - buffer.writeln(); - buffer.write('''
    -
    '''); - } +String _renderTopLevelProperty_partial_feature_set_2( + TopLevelVariable context1) => + _deduplicated__feature_set(context1); - return buffer.toString(); -} +String _renderTopLevelProperty_partial_footer_12( + TopLevelPropertyTemplateData context0) => + _deduplicated__footer(context0); -String _deduplicated_lib_templates__source_code_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.hasSourceCode) { - buffer.writeln(); - buffer.write('''
    -

    Implementation

    -
    ''');
    -    buffer.write(context0.sourceCode);
    -    buffer.write('''
    -
    '''); - } - buffer.writeln(); +String _renderTopLevelProperty_partial_head_0( + TopLevelPropertyTemplateData context0) => + _deduplicated__head(context0); - return buffer.toString(); -} +String _renderTopLevelProperty_partial_name_summary_5( + TopLevelVariable context1) => + _deduplicated__name_summary(context1); -String _deduplicated_lib_templates__name_summary_html(ModelElement context0) { - final buffer = StringBuffer(); - if (context0.isConst) { - buffer.write('''const '''); - } - buffer.write(''''''); - buffer.writeEscaped(context0.name); - buffer.write(''''''); +String _renderTopLevelProperty_partial_search_sidebar_11( + TopLevelPropertyTemplateData context0) => + _deduplicated__search_sidebar(context0); - return buffer.toString(); -} +String _renderTopLevelProperty_partial_source_code_8( + TopLevelVariable context1) => + _deduplicated__source_code(context1); + +String _renderTopLevelProperty_partial_source_link_1( + TopLevelVariable context1) => + _deduplicated__source_link(context1); + +String _renderTypedef_partial_documentation_5(Typedef context1) => + _deduplicated__documentation(context1); + +String _renderTypedef_partial_feature_set_2(Typedef context1) => + _deduplicated__feature_set(context1); + +String _renderTypedef_partial_footer_8(TypedefTemplateData context0) => + _deduplicated__footer(context0); + +String _renderTypedef_partial_head_0(TypedefTemplateData context0) => + _deduplicated__head(context0); + +String _renderTypedef_partial_search_sidebar_7(TypedefTemplateData context0) => + _deduplicated__search_sidebar(context0); + +String _renderTypedef_partial_source_code_6(Typedef context1) => + _deduplicated__source_code(context1); -String _deduplicated_lib_templates__accessor_getter_html( - GetterSetterCombo context0) { +String _renderTypedef_partial_source_link_1(Typedef context1) => + _deduplicated__source_link(context1); + +String _renderTypedef_partial_typedef_multiline_4(Typedef context1) { final buffer = StringBuffer(); - var context1 = context0.getter; - if (context1 != null) { - buffer.writeln(); - buffer.write('''
    -
    - '''); - buffer.write( - __deduplicated_lib_templates__accessor_getter_html_partial_annotations_0( - context1)); - buffer.writeln(); - buffer.write(''' '''); - buffer.write(context1.modelType.returnType.linkedName); - buffer.write(''' - get - '''); - buffer.write( - __deduplicated_lib_templates__accessor_getter_html_partial_name_summary_1( - context1)); - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__accessor_getter_html_partial_attributes_2( - context1)); - buffer.writeln(); - buffer.write('''
    - '''); - buffer.write( - __deduplicated_lib_templates__accessor_getter_html_partial_documentation_3( - context1)); - buffer.write('\n '); + if (context1.isCallable) { + var context2 = context1.asCallable; + if (context2.hasAnnotations) { + buffer.writeln(); + buffer.write('''
    +
      '''); + var context3 = context2.annotations; + for (var context4 in context3) { + buffer.writeln(); + buffer.write('''
    1. '''); + buffer.write(context4.linkedNameWithParameters); + buffer.write('''
    2. '''); + } + buffer.writeln(); + buffer.write('''
    +
    '''); + } + if (context2.isConst) { + buffer.write('''const '''); + } + buffer.write(''''''); + buffer.writeEscaped(context2.name); + buffer.write(''''''); + buffer.write(context2.linkedGenericParameters); + buffer.write(''' = + '''); + buffer.write(context2.modelType.linkedName); + buffer.write(''''''); + } + if (!context1.isCallable) { + buffer.write('\n '); buffer.write( - __deduplicated_lib_templates__accessor_getter_html_partial_source_code_4( + __renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0( context1)); - buffer.writeln(); - buffer.write('''
    '''); } buffer.writeln(); return buffer.toString(); } -String __deduplicated_lib_templates__accessor_getter_html_partial_annotations_0( - Accessor context1) { - final buffer = StringBuffer(); - if (context1.hasAnnotations) { - buffer.writeln(); - buffer.write('''
    -
      '''); - var context2 = context1.annotations; - for (var context3 in context2) { - buffer.writeln(); - buffer.write('''
    1. '''); - buffer.write(context3.linkedNameWithParameters); - buffer.write('''
    2. '''); - } - buffer.writeln(); - buffer.write('''
    -
    '''); - } +String __renderCategory_partial_callable_8_partial_attributes_1( + ModelFunctionTyped context2) => + _deduplicated__attributes(context2); - return buffer.toString(); -} +String __renderCategory_partial_callable_8_partial_categorization_0( + ModelFunctionTyped context2) => + _deduplicated__categorization(context2); + +String __renderCategory_partial_constant_6_partial_attributes_1( + TopLevelVariable context2) => + _deduplicated__attributes(context2); + +String __renderCategory_partial_constant_6_partial_categorization_0( + TopLevelVariable context2) => + _deduplicated__categorization(context2); + +String __renderCategory_partial_container_3_partial_categorization_0( + Container context2) => + _deduplicated__categorization(context2); + +String __renderCategory_partial_library_2_partial_categorization_0( + Library context2) => + _deduplicated__categorization(context2); + +String __renderCategory_partial_typedef_10_partial_attributes_1( + FunctionTypedef context3) => + _deduplicated__attributes(context3); + +String __renderCategory_partial_typedef_10_partial_categorization_0( + FunctionTypedef context3) => + _deduplicated__categorization(context3); -String - __deduplicated_lib_templates__accessor_getter_html_partial_name_summary_1( - Accessor context1) { +String __renderCategory_partial_typedef_10_partial_type_2(Typedef context2) { final buffer = StringBuffer(); - if (context1.isConst) { - buffer.write('''const '''); + buffer.write('''
    + '''); - buffer.writeEscaped(context1.name); + buffer.write(context2.linkedName); buffer.write(''''''); - - return buffer.toString(); -} - -String __deduplicated_lib_templates__accessor_getter_html_partial_attributes_2( - Accessor context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); + buffer.write(context2.linkedGenericParameters); + buffer.writeln(); + buffer.write(''' = '''); + buffer.write(context2.modelType.linkedName); + buffer.writeln(); + buffer.write(''' + '''); + buffer.write( + ___renderCategory_partial_typedef_10_partial_type_2_partial_categorization_0( + context2)); + buffer.writeln(); + buffer.write('''
    + + '''); + buffer.write(context2.oneLineDoc); + buffer.write('\n '); + buffer.write( + ___renderCategory_partial_typedef_10_partial_type_2_partial_attributes_1( + context2)); buffer.writeln(); + buffer.write(''' +'''); return buffer.toString(); } -String - __deduplicated_lib_templates__accessor_getter_html_partial_documentation_3( - Accessor context1) { +String __renderClass_partial_instance_fields_11_partial_property_0( + Field context2) { final buffer = StringBuffer(); - if (context1.hasDocumentation) { - buffer.writeln(); - buffer.write('''
    + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write(''' + '''); + buffer.write(context2.arrow); + buffer.write(' '); + buffer.write(context2.modelType.linkedName); + buffer.write(''' '''); - buffer.write(context1.documentationAsHtml); + buffer.write( + ___renderClass_partial_instance_fields_11_partial_property_0_partial_categorization_0( + context2)); + buffer.writeln(); + buffer.write('''
    +'''); + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); - buffer.write('''
    '''); + buffer.write('''

    + Available on '''); + buffer.write(context3.extendedElement.linkedName); + buffer.write(''', + provided by the '''); + buffer.write(context3.linkedName); + buffer.write(''' extension +

    '''); } + buffer.write('\n '); + buffer.write(context2.oneLineDoc); + buffer.write('\n '); + buffer.write( + ___renderClass_partial_instance_fields_11_partial_property_0_partial_attributes_1( + context2)); buffer.writeln(); + buffer.write(''' +'''); return buffer.toString(); } -String __deduplicated_lib_templates__accessor_getter_html_partial_source_code_4( - Accessor context1) { +String __renderClass_partial_instance_methods_12_partial_callable_0( + Method context2) { final buffer = StringBuffer(); - if (context1.hasSourceCode) { - buffer.writeln(); - buffer.write('''
    -

    Implementation

    -
    ''');
    -    buffer.write(context1.sourceCode);
    -    buffer.write('''
    -
    '''); + buffer.write('''
    + '''); + buffer.write(context2.linkedName); + buffer.write(''''''); + buffer.write(context2.linkedGenericParameters); + buffer.write('''('''); + buffer.write(context2.linkedParamsNoMetadata); + buffer.write(''') + → '''); + buffer.write(context2.modelType.returnType.linkedName); + buffer.write(''' + + '''); + buffer.write( + ___renderClass_partial_instance_methods_12_partial_callable_0_partial_categorization_0( + context2)); buffer.writeln(); - - return buffer.toString(); -} - -String _deduplicated_lib_templates__accessor_setter_html( - GetterSetterCombo context0) { - final buffer = StringBuffer(); - var context1 = context0.setter; - if (context1 != null) { - buffer.writeln(); - buffer.write('''
    -
    - '''); - buffer.write( - __deduplicated_lib_templates__accessor_setter_html_partial_annotations_0( - context1)); - buffer.writeln(); - buffer.write(''' set - '''); - buffer.writeEscaped(context1.definingCombo.name); - buffer.write(''' - ('''); - buffer.write(context1.linkedParamsNoMetadata); - buffer.write(''') - '''); - buffer.write( - __deduplicated_lib_templates__accessor_setter_html_partial_attributes_1( - context1)); - buffer.writeln(); - buffer.write('''
    - '''); - buffer.write( - __deduplicated_lib_templates__accessor_setter_html_partial_documentation_2( - context1)); - buffer.write('\n '); - buffer.write( - __deduplicated_lib_templates__accessor_setter_html_partial_source_code_3( - context1)); + buffer.write('''
    +'''); + if (context2.isProvidedByExtension) { + var context3 = context2.enclosingExtension; buffer.writeln(); - buffer.write('''
    '''); + buffer.write('''

    + Available on '''); + buffer.write(context3.extendedElement.linkedName); + buffer.write(''', + provided by the '''); + buffer.write(context3.linkedName); + buffer.write(''' extension +

    '''); } + buffer.write('\n '); + buffer.write(context2.oneLineDoc); + buffer.write('\n '); + buffer.write( + ___renderClass_partial_instance_methods_12_partial_callable_0_partial_attributes_1( + context2)); buffer.writeln(); + buffer.write(''' +'''); return buffer.toString(); } -String __deduplicated_lib_templates__accessor_setter_html_partial_annotations_0( - Accessor context1) { +String __renderClass_partial_static_constants_16_partial_constant_0( + Field context2) => + _deduplicated__constant(context2); + +String __renderFunction_partial_callable_multiline_4_partial_annotations_0( + ModelFunction context1) => + _deduplicated__annotations(context1); + +String __renderFunction_partial_callable_multiline_4_partial_name_summary_1( + ModelFunction context1) => + _deduplicated__name_summary(context1); + +String __renderMethod_partial_callable_multiline_3_partial_annotations_0( + Method context1) => + _deduplicated__annotations(context1); + +String __renderMethod_partial_callable_multiline_3_partial_name_summary_1( + Method context1) => + _deduplicated__name_summary(context1); + +String __renderProperty_partial_accessor_getter_8_partial_annotations_0( + ContainerAccessor context2) => + _deduplicated__annotations(context2); + +String __renderProperty_partial_accessor_getter_8_partial_attributes_2( + ContainerAccessor context2) => + _deduplicated__attributes(context2); + +String __renderProperty_partial_accessor_getter_8_partial_documentation_3( + ContainerAccessor context2) => + _deduplicated__documentation(context2); + +String __renderProperty_partial_accessor_getter_8_partial_source_code_4( + ContainerAccessor context2) => + _deduplicated__source_code(context2); + +String __renderTopLevelProperty_partial_accessor_getter_9_partial_annotations_0( + Accessor context2) => + _deduplicated__annotations(context2); + +String __renderTopLevelProperty_partial_accessor_getter_9_partial_attributes_2( + Accessor context2) => + _deduplicated__attributes(context2); + +String + __renderTopLevelProperty_partial_accessor_getter_9_partial_documentation_3( + Accessor context2) => + _deduplicated__documentation(context2); + +String + __renderTopLevelProperty_partial_accessor_getter_9_partial_name_summary_1( + Accessor context2) => + _deduplicated__name_summary(context2); + +String __renderTopLevelProperty_partial_accessor_getter_9_partial_source_code_4( + Accessor context2) => + _deduplicated__source_code(context2); + +String __renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0( + Typedef context1) { final buffer = StringBuffer(); if (context1.hasAnnotations) { buffer.writeln(); - buffer.write('''
    -
      '''); + buffer.write('''
      +
        '''); var context2 = context1.annotations; for (var context3 in context2) { buffer.writeln(); - buffer.write('''
      1. '''); + buffer.write('''
      2. '''); buffer.write(context3.linkedNameWithParameters); buffer.write('''
      3. '''); } buffer.writeln(); - buffer.write('''
      -
      '''); + buffer.write('''
    +
    '''); } + buffer.writeln(); + buffer.write( + ___renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0_partial_name_summary_0( + context1)); + buffer.write(context1.genericParameters); + buffer.write(''' = '''); + buffer.write(context1.modelType.linkedName); + buffer.write(''' +'''); return buffer.toString(); } -String __deduplicated_lib_templates__accessor_setter_html_partial_attributes_1( - Accessor context1) { - final buffer = StringBuffer(); - if (context1.hasAttributes) { - buffer.write('''
    '''); - buffer.write(context1.attributesAsString); - buffer.write('''
    '''); - } - buffer.writeln(); +String ___renderCategory_partial_typedef_10_partial_type_2_partial_attributes_1( + Typedef context2) => + _deduplicated__attributes(context2); - return buffer.toString(); -} +String + ___renderCategory_partial_typedef_10_partial_type_2_partial_categorization_0( + Typedef context2) => + _deduplicated__categorization(context2); String - __deduplicated_lib_templates__accessor_setter_html_partial_documentation_2( - Accessor context1) { - final buffer = StringBuffer(); - if (context1.hasDocumentation) { - buffer.writeln(); - buffer.write('''
    - '''); - buffer.write(context1.documentationAsHtml); - buffer.writeln(); - buffer.write('''
    '''); - } - buffer.writeln(); + ___renderClass_partial_instance_fields_11_partial_property_0_partial_attributes_1( + Field context2) => + _deduplicated__attributes(context2); - return buffer.toString(); -} +String + ___renderClass_partial_instance_fields_11_partial_property_0_partial_categorization_0( + Field context2) => + _deduplicated__categorization(context2); -String __deduplicated_lib_templates__accessor_setter_html_partial_source_code_3( - Accessor context1) { - final buffer = StringBuffer(); - if (context1.hasSourceCode) { - buffer.writeln(); - buffer.write('''
    -

    Implementation

    -
    ''');
    -    buffer.write(context1.sourceCode);
    -    buffer.write('''
    -
    '''); - } - buffer.writeln(); +String + ___renderClass_partial_instance_methods_12_partial_callable_0_partial_attributes_1( + Method context2) => + _deduplicated__attributes(context2); - return buffer.toString(); -} +String + ___renderClass_partial_instance_methods_12_partial_callable_0_partial_categorization_0( + Method context2) => + _deduplicated__categorization(context2); + +String + ___renderTypedef_partial_typedef_multiline_4_partial_type_multiline_0_partial_name_summary_0( + Typedef context1) => + _deduplicated__name_summary(context1); extension on StringBuffer { void writeEscaped(String? value) { diff --git a/test/mustachio/aot_compiler_builder_test.dart b/test/mustachio/aot_compiler_builder_test.dart index bdd6217a20..052071222e 100644 --- a/test/mustachio/aot_compiler_builder_test.dart +++ b/test/mustachio/aot_compiler_builder_test.dart @@ -147,17 +147,17 @@ import 'annotations.dart'; var generatedContent = await File(aotRenderersForHtmlPath).readAsString(); expect( generatedContent, - contains('String _renderFoo_partial_base_0(Foo context0) =>\n' - ' _deduplicated_lib_templates__base_html(context0);\n'), + contains('String _renderFoo_partial_base_0(Foo context0) => ' + '_deduplicated__base(context0);\n'), ); expect( generatedContent, - contains('String _renderBar_partial_base_0(Bar context0) =>\n' - ' _deduplicated_lib_templates__base_html(context0);\n'), + contains('String _renderBar_partial_base_0(Bar context0) => ' + '_deduplicated__base(context0);\n'), ); expect( generatedContent, - contains('String _deduplicated_lib_templates__base_html('), + contains('String _deduplicated__base(Base context0)'), ); }); @@ -200,17 +200,17 @@ import 'annotations.dart'; var generatedContent = await File(aotRenderersForHtmlPath).readAsString(); expect( generatedContent, - contains('String _renderFoo_partial_base_0(A context1) =>\n' - ' _deduplicated_lib_templates__base_html(context1);\n'), + contains('String _renderFoo_partial_base_0(A context1) => ' + '_deduplicated__base(context1);\n'), ); expect( generatedContent, - contains('String _renderFoo_partial_base_1(B context1) =>\n' - ' _deduplicated_lib_templates__base_html(context1);\n'), + contains('String _renderFoo_partial_base_1(B context1) => ' + '_deduplicated__base(context1);\n'), ); expect( generatedContent, - contains('String _deduplicated_lib_templates__base_html(Base context0)'), + contains('String _deduplicated__base(Base context0)'), ); }); diff --git a/test/mustachio/foo.aot_renderers_for_html.dart b/test/mustachio/foo.aot_renderers_for_html.dart index aaf0fbc2c7..ab8140748a 100644 --- a/test/mustachio/foo.aot_renderers_for_html.dart +++ b/test/mustachio/foo.aot_renderers_for_html.dart @@ -16,6 +16,18 @@ import 'dart:convert'; import 'foo.dart'; +String renderBar() { + final buffer = StringBuffer(); + + return buffer.toString(); +} + +String renderBaz() { + final buffer = StringBuffer(); + + return buffer.toString(); +} + String renderFoo(Foo context0) { final buffer = StringBuffer(); buffer.write('''
    @@ -59,18 +71,6 @@ String renderFoo(Foo context0) { return buffer.toString(); } -String renderBar() { - final buffer = StringBuffer(); - - return buffer.toString(); -} - -String renderBaz() { - final buffer = StringBuffer(); - - return buffer.toString(); -} - String _renderFoo_partial_foo_header_0(Foo context0) { final buffer = StringBuffer(); buffer.write('''
    diff --git a/test/mustachio/runtime_renderer_render_test.dart b/test/mustachio/runtime_renderer_render_test.dart index 6db769ff3f..8f2db89f54 100644 --- a/test/mustachio/runtime_renderer_render_test.dart +++ b/test/mustachio/runtime_renderer_render_test.dart @@ -10,6 +10,7 @@ import 'package:analyzer/file_system/memory_file_system.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:path/path.dart' as path show Context; import 'package:test/test.dart'; + import 'foo.dart'; import 'foo.runtime_renderers.dart'; diff --git a/tool/mustachio/README.md b/tool/mustachio/README.md index 4cad9d80c8..f411b61186 100644 --- a/tool/mustachio/README.md +++ b/tool/mustachio/README.md @@ -946,7 +946,7 @@ that compiler instance, compiles the template into a renderer function (a String of Dart source code), and also collects a mapping of partial renderer functions that were compiled in the process. When the compiler instance compiles its given template into a renderer, it recursvely creates a compiler instance for each -referenced partial and compiles the reference partial into a renderer function +referenced partial and compiles the referenced partial into a renderer function (see `_BlockCompiler._compilePartial`). In this way, `compileTemplatesToRenderers` collects all of the compiler @@ -1028,7 +1028,7 @@ this optimization: statements (as source code), and tracks the referenced context variables in a set, `_BlockCompiler._usedContextTypes`. 3. At this point we have the body of the renderer that we are creating, and its - name. We write the return type (`String`) and the nameo of the render + name. We write the return type (`String`) and the name of the render function, and then must write the list of parameters. Instead of writing the list of _all_ of the context variables as parameters, we only write the _used_ ones, collected up by the `_BlockCompiler` (and any nested @@ -1081,19 +1081,40 @@ the individual types does not have any property `foo`, then the LUB type does not work, and cannot be used. In practice though, this strategy allows us to deduplicate many renderer functions for Dartdoc. -In the `codegen_aot_compiler.dart` source, here are the steps that carry out -this optimization: +In the `codegen_aot_compiler.dart` source, all template compilers and template +renderer functions are tracked in a "renderer cache" (`_RendererCache`). This +cache maps each template path to a collection of renderers (a +`_RenderersForPath`). The collection of renderers is a map, mapping each used +context stack to some renderer data (`_RendererData`). The renderer data is +simply the compler, the compiled renderer string, and a reference count of how +many other templates reference that renderer: + +```none +renderer cache: { + path1 -> renderers1 { + [context0, context1] => (compiler1, renderer1) + [context0, context1, context2] => (compiler2, renderer2) + } + path2 -> renderers2 { + [context1, context2, context3] => (compiler3, renderer3) + [context1, context3] => (compiler4, renderer4) + } +} +``` -1. After gathering the list of all `_AotCompiler` instances that each compiled a - renderer function (as Dart source code), we enter `_deduplicateRenderers` to +As compilers are created and used to calculate used context stacks and compile +renderer functions, they are inserted into the renderer cache. + +Here are the steps that carry out the deduplicating optimization: + +1. After gathering all `_AotCompiler` instances that each compiled a renderer + function (as Dart source code), we enter `_deduplicateRenderers` to deduplicate the list. -2. This function first creates a new mapping that maps each partial's path to - the list of compilers that each compiled that partial to a renderer function, - and walks each entry in the map. - 1. For each partial path and relevant list of compilers, we create a list of - the "used context stacks"; so the first item in this list is the used - context stack calculated by the first compiler, etc. - 2. We then calculate the LUB of the types in each position in the list, with + +2. This function iterates over each partial path in the cache, looking at the + list of used context stacks. + + 1. We then calculate the LUB of the types in each position in the list, with the `contextStackLub` function. For example, if a list of used context stacks has 3 context stacks (derived from 3 compilers), and each context stack has 2 context variables, then the result is a context stack, again @@ -1103,22 +1124,27 @@ this optimization: original context stacks. (If the context stacks in the list do not all have exactly the same length, we say the "LUB context stack" is `null`, and we cannot deduplicate the renderer functions.) - 3. If the context stacks have some valid LUB context stack, then we may be + 2. If the context stacks have some valid LUB context stack, then we may be able to replace each renderer function that was compiled for this partial with a single renderer function that uses the LUB context stack. We proceed by creating a new `_AotCompiler` and a fresh, "deduplicated" renderer name. - 4. We try to compile the partial with the new deduplicated compiler. It is + 3. We try to compile the partial with the new deduplicated compiler. It is possible that this fails: if the partial depended on properties that were available on the individual context stacks, but are unavailable on the LUB context stack, then compilation will fail. In this case, we can just keep the individual renderer functions. - 5. If the new deduplicated compiler successfully compiles a renderer + 4. If the new deduplicated compiler successfully compiles a renderer function, we move forward with it: for each replaced compiler, we replace its renderer function with a "redirecting" renderer function, that simply redirects to a call to the deduplicated renderer function. - 6. In order to reduce the amount of generated code, we can also _remove_ any - partial renderer functions that were only referenced by _replaced_ - partial renderer functions. This is calculated recursively. + 5. In order to reduce the amount of generated code, we also _mark for + removal_ each of the replaced partial renderer functions. Since each + partial may be referenced by more than one other template, we support the + removals with reference-tracking; we track each reference from one + template to another, and when renderer functions are marked for removal, + those reference counts are decremented. A renderer function is only + actually removed when the reference count reaches 0. + 3. Finally, the new mapping of compilers to compiled renderer functions is passed back to the `compileTemplatesToRenderers` to be written out. \ No newline at end of file diff --git a/tool/mustachio/codegen_aot_compiler.dart b/tool/mustachio/codegen_aot_compiler.dart index fbb09658ec..37060f5991 100644 --- a/tool/mustachio/codegen_aot_compiler.dart +++ b/tool/mustachio/codegen_aot_compiler.dart @@ -31,8 +31,6 @@ Future compileTemplatesToRenderers( required String sourcePath, }) async { var buildData = _BuildData(typeProvider, typeSystem, sourcePath, root); - var rendererFunctions = []; - var partialRendererFunctions = <_AotCompiler, String>{}; var referenceUris = {}; print('Compiling ${specs.length} renderer specs into renderer functions...'); for (var spec in specs) { @@ -43,20 +41,28 @@ Future compileTemplatesToRenderers( templatePath, buildData, ); - rendererFunctions.add(await compiler._compileToRenderer(referenceUris)); - partialRendererFunctions.addAll(compiler._compiledPartials); + await compiler._compileToRenderer(referenceUris); } - partialRendererFunctions = await _deduplicateRenderers( - partialRendererFunctions, typeSystem, referenceUris); + await _deduplicateRenderers( + buildData._rendererCache, typeSystem, referenceUris); var buffer = StringBuffer(); for (var uri in referenceUris.sorted()) { buffer.writeln("import '$uri';"); } - for (var function in [ - ...rendererFunctions, - ...partialRendererFunctions.values, - ]) { + const returnTypeText = 'String '; + var sortedRenderers = buildData._rendererCache.allRendererFunctions.toList() + // Sort by the renderer's name, which is the text right after the return + // type. + ..sortBy((renderer) { + assert(renderer.startsWith(returnTypeText)); + var firstLineEnd = renderer.indexOf('\n'); + var firstLine = renderer.substring(returnTypeText.length, firstLineEnd); + // Replace '_' characters with '~', so that, in ASCII order, names that + // begin with '_' are sorted at the end. + return firstLine.replaceAll('_', '~'); + }); + for (var function in sortedRenderers) { buffer.write(function); buffer.writeln(); buffer.writeln(); @@ -92,39 +98,41 @@ extension on StringBuffer { /// Deduplicates multiple renderers which are each used to render a partial /// into a single renderer. /// -/// When a partial is referenced by more than one template, multiple compilers -/// are used to build multiple render functions, because the context stack of -/// types may be different in each case. But it is perfectly logical to expect -/// that these can be deduplicated, as they should be able to use one common -/// context stack of interfaces. +/// When a partial is referenced by more than one template (or more than once by +/// a single template), multiple compilers are used to build multiple renderer +/// functions, because the context stack of types may be different in each case. +/// But it is perfectly logical to expect that these can be deduplicated, as +/// they should be able to use one common context stack of interfaces. /// /// Attempts to deduplicate the compilers (which build the renderers) by /// replacing context types in each stack with their collective LUB. -Future> _deduplicateRenderers( - Map<_AotCompiler, String> partialRendererFunctions, +Future _deduplicateRenderers( + _RendererCache rendererCache, TypeSystem typeSystem, Set referenceUris, ) async { - if (partialRendererFunctions.length < 2) return partialRendererFunctions; - print('Deduplicating the initial set of ${partialRendererFunctions.length} ' - 'partial renderer functions...'); + var initialRendererCount = rendererCache.rendererCount; + if (initialRendererCount < 2) return; + print('Deduplicating the initial set of $initialRendererCount partial ' + 'renderer functions...'); + + var partialsCompilersToRemove = <_AotCompiler>{}; + void markCompilerForRemoval(_AotCompiler c) { + for (var partial in c._partialCompilers) { + markCompilerForRemoval(partial); + } + partialsCompilersToRemove.add(c); + } + // Map each template (represented by its path) to the list of compilers which - // compile it to a renderer function. - var compilersPerPartial = >{}; - for (var compiler in partialRendererFunctions.keys) { - compilersPerPartial - .putIfAbsent(compiler._templatePath, () => []) - .add(compiler); - } - var partialsToRemove = <_AotCompiler>{}; - for (var (MapEntry(key: filePath, value: compilers)) - in compilersPerPartial.entries) { - if (compilers.length < 2) { - // Nothing to deduplicate. + // compile it. + for (var templatePath in rendererCache.allTemplatePaths) { + var contextStacks = rendererCache.allContextStacksFor(templatePath); + if (contextStacks.length < 2) { + // Nothing to deduplicate; there is only one context stack, and therefore + // only one generated renderer function. continue; } - var firstCompiler = compilers.first; - var contextStacks = compilers.map((c) => c._usedContextStack).toList(); var contextStackTypes = typeSystem.contextStackLub(contextStacks); if (contextStackTypes == null) { // The stack lengths are different; it is impossible to fully deduplicate @@ -140,58 +148,62 @@ Future> _deduplicateRenderers( // possibly more generic renderer which accepts the LUB types. The body of // each replaced renderer can perform a simple redirect to the more generic // renderer. - var rendererName = filePath.replaceAll('.', '_').replaceAll('/', '_'); // The names of the renderers which are being replaced all include some // reference to the template/partial which referred to them; we must create // a new renderer name from scratch. + var rendererName = + path.basenameWithoutExtension(templatePath).replaceAll('.', '_'); + var firstCompiler = rendererCache.allCompilersFor(templatePath)!.first; var lubCompiler = _AotCompiler._( contextStackTypes.first, '_deduplicated_$rendererName', - filePath, + templatePath, firstCompiler._syntaxTree, firstCompiler._buildData, contextStack: [ ...contextStackTypes.map((t) => _VariableLookup(t, 'UNUSED')) ], ); - String compiledLubRenderer; try { - compiledLubRenderer = await lubCompiler._compileToRenderer(referenceUris); + await lubCompiler._compileToRenderer(referenceUris); } on MustachioResolutionException { // Oops, switching to the LUB type prevents the renderer from compiling; // likely the properties accessed in the partial are not all declared on // the LUB type. + var compilers = rendererCache.allCompilersFor(templatePath)!; var names = compilers.map((c) => "'${c._rendererName}'"); - print("Could not deduplicate '$filePath', keeping: ${names.join(', ')}"); - continue; - } - - void removeUnusedPartials(_AotCompiler c) { - for (var partial in c._partialCompilers) { - removeUnusedPartials(partial); + if (names.length > 5) { + names = [...names.take(5), '... (${names.length - 5} more)']; } - partialsToRemove.add(c); + print("Could not deduplicate '$templatePath' with context types: " + '$contextStackTypes, from ${names.join(', ')}'); + // Any partials generated before the exception was thrown are not needed. + markCompilerForRemoval(lubCompiler); + continue; } - for (var compiler in compilers) { - partialRendererFunctions[compiler] = - await _redirectingMethod(compiler, lubCompiler); - + for (var contextStack in contextStacks) { + var compiler = rendererCache.getCompiler(templatePath, contextStack)!; + // Replace the renderer function at [templatePath, contextStack] with one + // that just redirects to `lubCompiler`. + rendererCache.put( + templatePath, + contextStack, + compiler, + await _redirectingMethod(compiler, lubCompiler), + ); for (var c in compiler._partialCompilers) { - removeUnusedPartials(c); + markCompilerForRemoval(c); } } - partialRendererFunctions[lubCompiler] = compiledLubRenderer; - partialRendererFunctions.addAll(lubCompiler._compiledPartials); } - for (var c in partialsToRemove) { - partialRendererFunctions.remove(c); + for (var compiler in partialsCompilersToRemove) { + rendererCache.remove(compiler._templatePath, compiler._usedContextStack); } - print('Deduplicated down to ${partialRendererFunctions.length} ' + print('Deduplicated down to ${rendererCache.rendererCount} ' 'partial renderer functions.'); - return partialRendererFunctions; } /// Returns a method body for the render function for [compiler], which simply @@ -256,12 +268,12 @@ class _AotCompiler { /// This field is only complete after [_compileToRenderer] has run. final Set<_AotCompiler> _partialCompilers = {}; - final Map<_AotCompiler, String> _compiledPartials = {}; - /// The current stack of context objects (as variable lookups). final ContextStack _contextStack; /// The set of context objects which are ultimately used by this compiler. + /// + /// This field is only complete after [_compileToRenderer] has run. final Set<_VariableLookup> _usedContexts = {}; ContextStack get _usedContextStack => @@ -321,7 +333,7 @@ class _AotCompiler { return [...result.reversed]; } - Future _compileToRenderer(Set referenceUris) async { + Future _compileToRenderer(Set referenceUris) async { if (_contextStack.isEmpty) { var contextVariable = _VariableLookup(_contextType, 'context0'); _contextStack.push(contextVariable); @@ -333,6 +345,14 @@ class _AotCompiler { var rendererBody = blockCompiler._buffer.toString(); _usedContexts.addAll(_contextStack .where((c) => blockCompiler._usedContextTypes.contains(c))); + + var cachedRenderer = + _buildData._rendererCache.get(_templatePath, _usedContextStack); + if (cachedRenderer != null) { + // No need to keep compiling a new renderer. + return; + } + referenceUris.addAll(blockCompiler._referenceUris); var buffer = StringBuffer()..write('String $_rendererName'); @@ -380,7 +400,9 @@ class _AotCompiler { return buffer.toString(); } '''); - return buffer.toString(); + + _buildData._rendererCache + .put(_templatePath, _usedContextStack, this, buffer.toString()); } /// Returns the URI of [element] for use in generated import directives. @@ -459,25 +481,25 @@ class _BlockCompiler { filePath.add('_$fileName.$extension'); var partialPath = path.join( path.dirname(_templateCompiler._templatePath), filePath.join('/')); - var partialCompiler = _templateCompiler._partialCompilers.firstWhereOrNull( + // First see if there is a compiler in the global cache. + var sanitizedKey = node.key.replaceAll('.', '_').replaceAll('/', '_'); + var name = '${partialBaseName}_' + '${sanitizedKey}_' + '${_templateCompiler._partialCounter}'; + var potentialPartialCompiler = await _AotCompiler._readAndParse( + contextType, name, partialPath, _templateCompiler._buildData, + contextStack: _contextStack); + await potentialPartialCompiler._compileToRenderer(referenceUris); + var partialCompiler = _templateCompiler._buildData._rendererCache + .get(partialPath, potentialPartialCompiler._usedContextStack) + ?.compiler; + // Check the set of partial compilers this _BlockCompiler has created. + partialCompiler ??= _templateCompiler._partialCompilers.firstWhereOrNull( (p) => p._templatePath == partialPath && p._contextType == contextType); - if (partialCompiler == null) { - var sanitizedKey = node.key.replaceAll('.', '_').replaceAll('/', '_'); - var name = '${partialBaseName}_' - '${sanitizedKey}_' - '${_templateCompiler._partialCounter}'; - partialCompiler = await _AotCompiler._readAndParse( - contextType, name, partialPath, _templateCompiler._buildData, - contextStack: _contextStack); - // Add this partial renderer; it is compiled here, but not written until - // later. - _templateCompiler._partialCompilers.add(partialCompiler); - _templateCompiler._partialCounter++; - _templateCompiler._compiledPartials[partialCompiler] = - await partialCompiler._compileToRenderer(referenceUris); - _templateCompiler._compiledPartials - .addAll(partialCompiler._compiledPartials); - } + // If we still don't have an existing one, then use the one we just created. + partialCompiler ??= potentialPartialCompiler; + _templateCompiler._partialCompilers.add(partialCompiler); + _templateCompiler._partialCounter++; // Call the partial's renderer function here; the definition of the renderer // function is written later. write('buffer.write('); @@ -713,8 +735,166 @@ class _BuildData { final String _root; - _BuildData( - this._typeProvider, this._typeSystem, this._sourcePath, this._root); + final _RendererCache _rendererCache; + + _BuildData(this._typeProvider, this._typeSystem, this._sourcePath, this._root) + : _rendererCache = _RendererCache(_typeSystem); +} + +/// A cache which maps template paths to the various compilers and renderer data +/// that may be used to render them. +class _RendererCache { + final Map _renderers = {}; + final TypeSystem _typeSystem; + + _RendererCache(this._typeSystem); + + /// Returns the renderer data for [templatePath] and [usedContextStack], or + /// `null` if there is no such data. + _RendererData? get(String templatePath, ContextStack usedContextStack) => + _renderers[templatePath]?.getSuitable(usedContextStack); + + /// Returns the compiler for [templatePath] and [usedContextStack], or `null` + /// if there is no such compiler in the cache. + _AotCompiler? getCompiler( + String templatePath, ContextStack usedContextStack) => + _renderers[templatePath]?.get(usedContextStack)?.compiler; + + /// Inserts [compiler] and [renderer] as the data for [templatePath] and + /// [usedContextStack]. + void put( + String templatePath, + ContextStack usedContextStack, + _AotCompiler compiler, + String renderer, + ) { + _renderers + .putIfAbsent(templatePath, () => _RenderersForPath(_typeSystem)) + .put(usedContextStack, compiler, renderer); + } + + /// Decrements the renderer data 'references' counter for [templatePath] and + /// [usedContextStack], if it exists, and removes the data if the references + /// counter becomes 0. + void remove(String templatePath, ContextStack usedContextStack) => + _renderers[templatePath]?.remove(usedContextStack); + + /// All of the template paths known to the renderer cache. + Iterable get allTemplatePaths => _renderers.keys; + + /// A mapping of all template paths to their used context stacks. + Map> get allUsedContextStacks => + _renderers.map((templatePath, renderers) => + MapEntry(templatePath, renderers._renderers.keys.toList())); + + /// All of the context stacks for [templatePath]. + List allContextStacksFor(String templatePath) => + _renderers[templatePath]!._renderers.keys.toList(); + + /// All of the compilers for [templatePath]. + Iterable<_AotCompiler>? allCompilersFor(String templatePath) => + _renderers[templatePath]?._renderers.values.map((e) => e.compiler); + + /// All of the compiled renderer functions for all of the templates known to + /// the renderer cache. + Iterable get allRendererFunctions => _renderers.values + .expand((e) => e._renderers.values.map((f) => f.renderer)); + + /// The total number of renderers. + int get rendererCount => + _renderers.values.fold(0, (sum, e) => sum + e._renderers.length); +} + +/// Data for all of the renderers available to render a partial at a given path. +/// +/// The path is not tracked here; it is tracked in [_RendererCache]. +class _RenderersForPath { + final Map _renderers = {}; + final TypeSystem _typeSystem; + + _RenderersForPath(this._typeSystem); + + /// Gets renderer data for [usedContextStack] or render data for a suitable + /// replacement for [usedContextStack], if a suitable replacement exists. + /// + /// A suitable replacement is a [ContextStack] where each type is a supertype + /// of the corresponding type in [usedContextStack]. + _RendererData? getSuitable(ContextStack usedContextStack) { + for (var existingContextStack in _renderers.keys) { + if (usedContextStack.length != existingContextStack.length) continue; + var keyIsAllSubtypes = true; + for (var i = 0; i < usedContextStack.length; i++) { + if (!_typeSystem.isSubtypeOf( + usedContextStack[i].type, existingContextStack[i].type)) { + keyIsAllSubtypes = false; + break; + } + } + if (!keyIsAllSubtypes) continue; + // The types in [key] are all subtypes of the types in [existingKey] so + // [existingKey] can be considered to be a suitable existing key. + var usage = _renderers[existingContextStack]!; + usage.referenceCount++; + return usage; + } + return null; + } + + /// Gets the [_RendererData] for [usedContextStack], if it exists. + _RendererData? get(ContextStack usedContextStack) { + var existingKey = _existingKey(usedContextStack); + return (existingKey == null) ? null : _renderers[existingKey]!; + } + + /// Returns the first [ContextStack] that is "equal" to [key]. + /// + /// Since a [ContextStack] is just a [List], this is just pairwise equality. + ContextStack? _existingKey(ContextStack key) { + return _renderers.keys.firstWhereOrNull((k) { + if (key.length != k.length) return false; + for (var i = 0; i < key.length; i++) { + if (key[i] != k[i]) { + return false; + } + } + return true; + }); + } + + /// Inserts [compiler] and [renderer] as the data for [usedContextStack]. + void put( + ContextStack usedContextStack, _AotCompiler compiler, String renderer) { + var existingContextStack = _existingKey(usedContextStack); + if (existingContextStack == null) { + _renderers[usedContextStack] = _RendererData(compiler, renderer); + return; + } + var data = _renderers[existingContextStack]!; + _renderers[_existingKey(usedContextStack)!] = + _RendererData(compiler, renderer)..referenceCount = data.referenceCount; + } + + /// Decrements the renderer data 'references' counter for [usedContextStack], + /// if it exists, and removes the data if the references counter becomes 0. + void remove(ContextStack usedContextStack) { + var existingContextStack = _existingKey(usedContextStack); + if (existingContextStack == null) return; + var usage = _renderers[existingContextStack]!; + usage.referenceCount--; + if (usage.referenceCount == 0) { + _renderers.remove(existingContextStack); + } + } +} + +/// The data for the usage of a [renderer], generated by a [compiler], and +/// referenced [referenceCount] times. +class _RendererData { + final _AotCompiler compiler; + final String renderer; + int referenceCount = 0; + + _RendererData(this.compiler, this.renderer); } /// Represents a variable lookup via property access chain [name] which returns