// GENERATED CODE. DO NOT EDIT.
//
// To change the contents of this library, make changes to the builder source
// files in the tool/mustachio/ directory.

// ignore_for_file: camel_case_types, deprecated_member_use_from_same_package
// ignore_for_file: non_constant_identifier_names, unnecessary_string_escapes
// ignore_for_file: unused_import
// ignore_for_file: use_super_parameters

// ignore_for_file: analyzer_use_new_elements

import 'package:dartdoc/src/element_type.dart';
import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/model/annotation.dart';
import 'package:dartdoc/src/model/attribute.dart';
import 'package:dartdoc/src/model/comment_referable.dart';
import 'package:dartdoc/src/model/feature_set.dart';
import 'package:dartdoc/src/model/language_feature.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/mustachio/parser.dart';
import 'package:dartdoc/src/mustachio/renderer_base.dart';
import 'package:dartdoc/src/warnings.dart';
import 'templates.dart';

void _render_Accessor(
  Accessor context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Accessor(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Accessor extends RendererBase<Accessor> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Accessor>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'definingCombo': Property(
                getValue: (CT_ c) => c.definingCombo,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_GetterSetterCombo.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as GetterSetterCombo,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.definingCombo,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['GetterSetterCombo']!,
                  );
                },
              ),
              'documentationComment': Property(
                getValue: (CT_ c) => c.documentationComment,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationComment,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PropertyAccessorElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PropertyAccessorElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PropertyAccessorElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PropertyAccessorElement2']!,
                  );
                },
              ),
              'enclosingCombo': Property(
                getValue: (CT_ c) => c.enclosingCombo,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_GetterSetterCombo.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as GetterSetterCombo,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.enclosingCombo,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['GetterSetterCombo']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'hasDocumentationComment': Property(
                getValue: (CT_ c) => c.hasDocumentationComment,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentationComment,
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'isGetter': Property(
                getValue: (CT_ c) => c.isGetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isGetter,
              ),
              'isSetter': Property(
                getValue: (CT_ c) => c.isSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSetter,
              ),
              'isSynthetic': Property(
                getValue: (CT_ c) => c.isSynthetic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSynthetic,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Callable.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Callable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Callable(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'originalMember': Property(
                getValue: (CT_ c) => c.originalMember,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExecutableMember',
                        ),

                isNullValue: (CT_ c) => c.originalMember == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.originalMember,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExecutableMember']!,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'sourceCode': Property(
                getValue: (CT_ c) => c.sourceCode,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Accessor(
    Accessor context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Accessor>? getProperty(String key) {
    if (propertyMap<Accessor>().containsKey(key)) {
      return propertyMap<Accessor>()[key];
    } else {
      return null;
    }
  }
}

void _render_Annotation(
  Annotation context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Annotation(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Annotation extends RendererBase<Annotation> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Annotation>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Attribute.propertyMap<CT_>(),
              'cssClassName': Property(
                getValue: (CT_ c) => c.cssClassName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.cssClassName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hashCode': Property(
                getValue: (CT_ c) => c.hashCode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.hashCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedNameWithParameters': Property(
                getValue: (CT_ c) => c.linkedNameWithParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedNameWithParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Annotation(
    Annotation context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Annotation>? getProperty(String key) {
    if (propertyMap<Annotation>().containsKey(key)) {
      return propertyMap<Annotation>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Attribute extends RendererBase<Attribute> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Attribute>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'cssClassName': Property(
                getValue: (CT_ c) => c.cssClassName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.cssClassName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedNameWithParameters': Property(
                getValue: (CT_ c) => c.linkedNameWithParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedNameWithParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sortGroup': Property(
                getValue: (CT_ c) => c.sortGroup,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.sortGroup,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Attribute(
    Attribute context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Attribute>? getProperty(String key) {
    if (propertyMap<Attribute>().containsKey(key)) {
      return propertyMap<Attribute>()[key];
    } else {
      return null;
    }
  }
}

void _render_Callable(
  Callable context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Callable(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Callable extends RendererBase<Callable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Callable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'parameters': Property(
                getValue: (CT_ c) => c.parameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Parameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.parameters.map(
                    (e) =>
                        _render_Parameter(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'returnType': Property(
                getValue: (CT_ c) => c.returnType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.returnType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'type': Property(
                getValue: (CT_ c) => c.type,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FunctionType',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.type,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FunctionType']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Callable(
    Callable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Callable>? getProperty(String key) {
    if (propertyMap<Callable>().containsKey(key)) {
      return propertyMap<Callable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_CanonicalFor extends RendererBase<CanonicalFor> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends CanonicalFor>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'canonicalFor': Property(
                getValue: (CT_ c) => c.canonicalFor,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<String>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.canonicalFor.map(
                    (e) => _render_String(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_CanonicalFor(
    CanonicalFor context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<CanonicalFor>? getProperty(String key) {
    if (propertyMap<CanonicalFor>().containsKey(key)) {
      return propertyMap<CanonicalFor>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Categorization extends RendererBase<Categorization> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Categorization>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'categoryNames': Property(
                getValue: (CT_ c) => c.categoryNames,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<String>',
                        ),

                isNullValue: (CT_ c) => c.categoryNames == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.categoryNames,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['List']!,
                  );
                },
              ),
              'displayedCategories': Property(
                getValue: (CT_ c) => c.displayedCategories,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Category>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.displayedCategories.map(
                    (e) =>
                        _render_Category(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'hasCategorization': Property(
                getValue: (CT_ c) => c.hasCategorization,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasCategorization,
              ),
              'hasCategoryNames': Property(
                getValue: (CT_ c) => c.hasCategoryNames,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasCategoryNames,
              ),
              'hasSubCategoryNames': Property(
                getValue: (CT_ c) => c.hasSubCategoryNames,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasSubCategoryNames,
              ),
              'subCategoryNames': Property(
                getValue: (CT_ c) => c.subCategoryNames,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<String>',
                        ),

                isNullValue: (CT_ c) => c.subCategoryNames == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.subCategoryNames,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['List']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Categorization(
    Categorization context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Categorization>? getProperty(String key) {
    if (propertyMap<Categorization>().containsKey(key)) {
      return propertyMap<Categorization>()[key];
    } else {
      return null;
    }
  }
}

void _render_Category(
  Category context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Category(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Category extends RendererBase<Category> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Category>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_Warnable.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              ..._Renderer_Locatable.propertyMap<CT_>(),
              ..._Renderer_MarkdownFileDocumentation.propertyMap<CT_>(),
              ..._Renderer_LibraryContainer.propertyMap<CT_>(),
              ..._Renderer_TopLevelContainer.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_Warnable.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              ..._Renderer_Locatable.propertyMap<CT_>(),
              ..._Renderer_MarkdownFileDocumentation.propertyMap<CT_>(),
              ..._Renderer_LibraryContainer.propertyMap<CT_>(),
              ..._Renderer_TopLevelContainer.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'categoryIndex': Property(
                getValue: (CT_ c) => c.categoryIndex,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.categoryIndex,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'categoryLabel': Property(
                getValue: (CT_ c) => c.categoryLabel,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.categoryLabel,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'classes': Property(
                getValue: (CT_ c) => c.classes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.classes.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'config': Property(
                getValue: (CT_ c) => c.config,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartdocOptionContext',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.config,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartdocOptionContext']!,
                  );
                },
              ),
              'constants': Property(
                getValue: (CT_ c) => c.constants,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constants.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'containerOrder': Property(
                getValue: (CT_ c) => c.containerOrder,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<String>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.containerOrder.map(
                    (e) => _render_String(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'documentationFile': Property(
                getValue: (CT_ c) => c.documentationFile,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'File'),

                isNullValue: (CT_ c) => c.documentationFile == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.documentationFile,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['File']!,
                  );
                },
              ),
              'documentationFrom': Property(
                getValue: (CT_ c) => c.documentationFrom,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Locatable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentationFrom.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Locatable']!,
                    ),
                  );
                },
              ),
              'documentedWhere': Property(
                getValue: (CT_ c) => c.documentedWhere,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DocumentLocation',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.documentedWhere,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DocumentLocation']!,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Element'),

                isNullValue: (CT_ c) => c.element == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => c.element2 == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
              'enclosingName': Property(
                getValue: (CT_ c) => c.enclosingName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.enclosingName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enums': Property(
                getValue: (CT_ c) => c.enums,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Enum>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.enums.map(
                    (e) => _render_Enum(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'exceptions': Property(
                getValue: (CT_ c) => c.exceptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.exceptions.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'extensionTypes': Property(
                getValue: (CT_ c) => c.extensionTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ExtensionType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensionTypes.map(
                    (e) => _render_ExtensionType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'extensions': Property(
                getValue: (CT_ c) => c.extensions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Extension>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensions.map(
                    (e) =>
                        _render_Extension(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'externalItems': Property(
                getValue: (CT_ c) => c.externalItems,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ExternalItem>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.externalItems.map(
                    (e) => _render_ExternalItem(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'functions': Property(
                getValue: (CT_ c) => c.functions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelFunction>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.functions.map(
                    (e) => _render_ModelFunction(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'isDocumented': Property(
                getValue: (CT_ c) => c.isDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDocumented,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'mixins': Property(
                getValue: (CT_ c) => c.mixins,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Mixin>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.mixins.map(
                    (e) => _render_Mixin(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
              'properties': Property(
                getValue: (CT_ c) => c.properties,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.properties.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'sortKey': Property(
                getValue: (CT_ c) => c.sortKey,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.sortKey, ast, r.template, sink, parent: r);
                },
              ),
              'typedefs': Property(
                getValue: (CT_ c) => c.typedefs,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Typedef>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typedefs.map(
                    (e) => _render_Typedef(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Category(
    Category context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Category>? getProperty(String key) {
    if (propertyMap<Category>().containsKey(key)) {
      return propertyMap<Category>()[key];
    } else {
      return null;
    }
  }
}

String renderCategory(CategoryTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_CategoryTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_CategoryTemplateData(
  CategoryTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_CategoryTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_CategoryTemplateData
    extends RendererBase<CategoryTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends CategoryTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Category, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<Category, CT_>(),
              'category': Property(
                getValue: (CT_ c) => c.category,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Category.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Category,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Category(
                    c.category,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Category.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Category,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Category(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_CategoryTemplateData(
    CategoryTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<CategoryTemplateData>? getProperty(String key) {
    if (propertyMap<CategoryTemplateData>().containsKey(key)) {
      return propertyMap<CategoryTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_Class(
  Class context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Class(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Class extends RendererBase<Class> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Class>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainer.propertyMap<CT_>(),
              ..._Renderer_Constructable.propertyMap<CT_>(),
              ..._Renderer_MixedInTypes.propertyMap<CT_>(),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ClassElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ClassElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ClassElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ClassElement2']!,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'inheritanceChain': Property(
                getValue: (CT_ c) => c.inheritanceChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritanceChain.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'isAbstract': Property(
                getValue: (CT_ c) => c.isAbstract,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAbstract,
              ),
              'isBase': Property(
                getValue: (CT_ c) => c.isBase,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isBase,
              ),
              'isErrorOrException': Property(
                getValue: (CT_ c) => c.isErrorOrException,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isErrorOrException,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isImplementableInterface': Property(
                getValue: (CT_ c) => c.isImplementableInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isImplementableInterface,
              ),
              'isMixinClass': Property(
                getValue: (CT_ c) => c.isMixinClass,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixinClass,
              ),
              'isSealed': Property(
                getValue: (CT_ c) => c.isSealed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSealed,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Class(
    Class context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Class>? getProperty(String key) {
    if (propertyMap<Class>().containsKey(key)) {
      return propertyMap<Class>()[key];
    } else {
      return null;
    }
  }
}

String renderClass(ClassTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_ClassTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_ClassTemplateData(
  ClassTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ClassTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ClassTemplateData extends RendererBase<ClassTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ClassTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainerTemplateData.propertyMap<
                Class,
                CT_
              >(),
              'clazz': Property(
                getValue: (CT_ c) => c.clazz,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Class.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Class,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Class(c.clazz, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ClassTemplateData(
    ClassTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ClassTemplateData>? getProperty(String key) {
    if (propertyMap<ClassTemplateData>().containsKey(key)) {
      return propertyMap<ClassTemplateData>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_CommentReferable extends RendererBase<CommentReferable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends CommentReferable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.library == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library!, ast, r.template, sink, parent: r);
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceGrandparentOverrides': Property(
                getValue: (CT_ c) => c.referenceGrandparentOverrides,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                isNullValue: (CT_ c) => c.referenceGrandparentOverrides == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceGrandparentOverrides,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Iterable']!,
                  );
                },
              ),
              'referenceName': Property(
                getValue: (CT_ c) => c.referenceName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.referenceName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'scope': Property(
                getValue: (CT_ c) => c.scope,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Scope'),

                isNullValue: (CT_ c) => c.scope == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.scope,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Scope']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_CommentReferable(
    CommentReferable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<CommentReferable>? getProperty(String key) {
    if (propertyMap<CommentReferable>().containsKey(key)) {
      return propertyMap<CommentReferable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Constructable extends RendererBase<Constructable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Constructable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'constructors': Property(
                getValue: (CT_ c) => c.constructors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Constructor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constructors.map(
                    (e) => _render_Constructor(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'hasPublicConstructors': Property(
                getValue: (CT_ c) => c.hasPublicConstructors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicConstructors,
              ),
              'publicConstructorsSorted': Property(
                getValue: (CT_ c) => c.publicConstructorsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Constructor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicConstructorsSorted.map(
                    (e) => _render_Constructor(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Constructable(
    Constructable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Constructable>? getProperty(String key) {
    if (propertyMap<Constructable>().containsKey(key)) {
      return propertyMap<Constructable>()[key];
    } else {
      return null;
    }
  }
}

void _render_Constructor(
  Constructor context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Constructor(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Constructor extends RendererBase<Constructor> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Constructor>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ConstructorElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ConstructorElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ConstructorElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ConstructorElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'fullKind': Property(
                getValue: (CT_ c) => c.fullKind,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fullKind, ast, r.template, sink, parent: r);
                },
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isConst': Property(
                getValue: (CT_ c) => c.isConst,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isConst,
              ),
              'isFactory': Property(
                getValue: (CT_ c) => c.isFactory,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFactory,
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'isUnnamedConstructor': Property(
                getValue: (CT_ c) => c.isUnnamedConstructor,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isUnnamedConstructor,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Callable.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Callable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Callable(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'nameWithGenerics': Property(
                getValue: (CT_ c) => c.nameWithGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceName': Property(
                getValue: (CT_ c) => c.referenceName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.referenceName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'shortName': Property(
                getValue: (CT_ c) => c.shortName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.shortName == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.shortName!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Constructor(
    Constructor context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Constructor>? getProperty(String key) {
    if (propertyMap<Constructor>().containsKey(key)) {
      return propertyMap<Constructor>()[key];
    } else {
      return null;
    }
  }
}

String renderConstructor(ConstructorTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_ConstructorTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_ConstructorTemplateData(
  ConstructorTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ConstructorTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_ConstructorTemplateData
    extends RendererBase<ConstructorTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ConstructorTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Constructor, CT_>(),
              ..._Renderer_TwoDirectoriesDown.propertyMap<Constructor, CT_>(),
              'constructable': Property(
                getValue: (CT_ c) => c.constructable,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Constructable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Constructable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.constructable,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Constructable']!,
                  );
                },
              ),
              'constructor': Property(
                getValue: (CT_ c) => c.constructor,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Constructor.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Constructor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Constructor(
                    c.constructor,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'navLinksWithGenerics': Property(
                getValue: (CT_ c) => c.navLinksWithGenerics,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinksWithGenerics.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Constructor.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Constructor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Constructor(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ConstructorTemplateData(
    ConstructorTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ConstructorTemplateData>? getProperty(String key) {
    if (propertyMap<ConstructorTemplateData>().containsKey(key)) {
      return propertyMap<ConstructorTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_Container(
  Container context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Container(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Container extends RendererBase<Container> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Container>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'allCanonicalModelElements': Property(
                getValue: (CT_ c) => c.allCanonicalModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allCanonicalModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'availableInstanceFieldsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceMethodsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceMethodsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceMethodsSorted.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceOperatorsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceOperatorsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceOperatorsSorted.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'constantFields': Property(
                getValue: (CT_ c) => c.constantFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constantFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredFields': Property(
                getValue: (CT_ c) => c.declaredFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredMethods': Property(
                getValue: (CT_ c) => c.declaredMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredOperators': Property(
                getValue: (CT_ c) => c.declaredOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredOperators.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Element'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasAvailableInstanceFields': Property(
                getValue: (CT_ c) => c.hasAvailableInstanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAvailableInstanceFields,
              ),
              'hasAvailableInstanceMethods': Property(
                getValue: (CT_ c) => c.hasAvailableInstanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAvailableInstanceMethods,
              ),
              'hasAvailableInstanceOperators': Property(
                getValue: (CT_ c) => c.hasAvailableInstanceOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAvailableInstanceOperators,
              ),
              'hasInstanceFields': Property(
                getValue: (CT_ c) => c.hasInstanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasInstanceFields,
              ),
              'hasParameters': Property(
                getValue: (CT_ c) => c.hasParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasParameters,
              ),
              'hasPublicConstantFields': Property(
                getValue: (CT_ c) => c.hasPublicConstantFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicConstantFields,
              ),
              'hasPublicConstructors': Property(
                getValue: (CT_ c) => c.hasPublicConstructors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicConstructors,
              ),
              'hasPublicEnumValues': Property(
                getValue: (CT_ c) => c.hasPublicEnumValues,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicEnumValues,
              ),
              'hasPublicStaticFields': Property(
                getValue: (CT_ c) => c.hasPublicStaticFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicStaticFields,
              ),
              'hasPublicStaticMethods': Property(
                getValue: (CT_ c) => c.hasPublicStaticMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicStaticMethods,
              ),
              'hasPublicVariableStaticFields': Property(
                getValue: (CT_ c) => c.hasPublicVariableStaticFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicVariableStaticFields,
              ),
              'instanceAccessors': Property(
                getValue: (CT_ c) => c.instanceAccessors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Accessor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceAccessors.map(
                    (e) =>
                        _render_Accessor(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceFields': Property(
                getValue: (CT_ c) => c.instanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceMethods': Property(
                getValue: (CT_ c) => c.instanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceOperators': Property(
                getValue: (CT_ c) => c.instanceOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceOperators.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'isDartCoreObject': Property(
                getValue: (CT_ c) => c.isDartCoreObject,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDartCoreObject,
              ),
              'isEnum': Property(
                getValue: (CT_ c) => c.isEnum,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isEnum,
              ),
              'isExtension': Property(
                getValue: (CT_ c) => c.isExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isExtension,
              ),
              'isInterface': Property(
                getValue: (CT_ c) => c.isInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInterface,
              ),
              'isMixin': Property(
                getValue: (CT_ c) => c.isMixin,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixin,
              ),
              'publicConstantFieldsSorted': Property(
                getValue: (CT_ c) => c.publicConstantFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicConstantFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicConstructorsSorted': Property(
                getValue: (CT_ c) => c.publicConstructorsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Constructor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicConstructorsSorted.map(
                    (e) => _render_Constructor(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicEnumValues': Property(
                getValue: (CT_ c) => c.publicEnumValues,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicEnumValues.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicInheritedInstanceFields': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceFields,
              ),
              'publicInheritedInstanceMethods': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceMethods,
              ),
              'publicInheritedInstanceOperators': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceOperators,
              ),
              'publicStaticFieldsSorted': Property(
                getValue: (CT_ c) => c.publicStaticFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicStaticFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicStaticMethodsSorted': Property(
                getValue: (CT_ c) => c.publicStaticMethodsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicStaticMethodsSorted.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicVariableStaticFieldsSorted': Property(
                getValue: (CT_ c) => c.publicVariableStaticFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicVariableStaticFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'scope': Property(
                getValue: (CT_ c) => c.scope,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Scope'),

                isNullValue: (CT_ c) => c.scope == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.scope,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Scope']!,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'staticAccessors': Property(
                getValue: (CT_ c) => c.staticAccessors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Accessor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.staticAccessors.map(
                    (e) =>
                        _render_Accessor(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'staticFields': Property(
                getValue: (CT_ c) => c.staticFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.staticFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'staticMethods': Property(
                getValue: (CT_ c) => c.staticMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.staticMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'variableStaticFields': Property(
                getValue: (CT_ c) => c.variableStaticFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.variableStaticFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Container(
    Container context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Container>? getProperty(String key) {
    if (propertyMap<Container>().containsKey(key)) {
      return propertyMap<Container>()[key];
    } else {
      return null;
    }
  }
}

void _render_ContainerAccessor(
  ContainerAccessor context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ContainerAccessor(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ContainerAccessor extends RendererBase<ContainerAccessor> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ContainerAccessor>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Accessor.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_Inheritable.propertyMap<CT_>(),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isCovariant': Property(
                getValue: (CT_ c) => c.isCovariant,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCovariant,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'overriddenElement': Property(
                getValue: (CT_ c) => c.overriddenElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ContainerAccessor.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ContainerAccessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.overriddenElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ContainerAccessor(
                    c.overriddenElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ContainerAccessor(
    ContainerAccessor context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ContainerAccessor>? getProperty(String key) {
    if (propertyMap<ContainerAccessor>().containsKey(key)) {
      return propertyMap<ContainerAccessor>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_ContainerMember extends RendererBase<ContainerMember> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ContainerMember>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'canonicalEnclosingContainer': Property(
                getValue: (CT_ c) => c.canonicalEnclosingContainer,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.canonicalEnclosingContainer == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.canonicalEnclosingContainer!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'isExtended': Property(
                getValue: (CT_ c) => c.isExtended,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isExtended,
              ),
              'referenceGrandparentOverrides': Property(
                getValue: (CT_ c) => c.referenceGrandparentOverrides,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Library>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceGrandparentOverrides.map(
                    (e) => _render_Library(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ContainerMember(
    ContainerMember context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ContainerMember>? getProperty(String key) {
    if (propertyMap<ContainerMember>().containsKey(key)) {
      return propertyMap<ContainerMember>()[key];
    } else {
      return null;
    }
  }
}

void _render_DefinedElementType(
  DefinedElementType context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_DefinedElementType(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_DefinedElementType extends RendererBase<DefinedElementType> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends DefinedElementType>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ElementType.propertyMap<CT_>(),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'modelElement': Property(
                getValue: (CT_ c) => c.modelElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.modelElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceGrandparentOverrides': Property(
                getValue: (CT_ c) => c.referenceGrandparentOverrides,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                isNullValue: (CT_ c) => c.referenceGrandparentOverrides == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceGrandparentOverrides,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Iterable']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'typeArguments': Property(
                getValue: (CT_ c) => c.typeArguments,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeArguments.map(
                    (e) => _render_ElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_DefinedElementType(
    DefinedElementType context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<DefinedElementType>? getProperty(String key) {
    if (propertyMap<DefinedElementType>().containsKey(key)) {
      return propertyMap<DefinedElementType>()[key];
    } else {
      return null;
    }
  }
}

void _render_Documentable(
  Documentable context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Documentable(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Documentable extends RendererBase<Documentable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Documentable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'config': Property(
                getValue: (CT_ c) => c.config,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartdocOptionContext',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.config,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartdocOptionContext']!,
                  );
                },
              ),
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.documentation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationAsHtml': Property(
                getValue: (CT_ c) => c.documentationAsHtml,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationAsHtml,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasDocumentation': Property(
                getValue: (CT_ c) => c.hasDocumentation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentation,
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isDocumented': Property(
                getValue: (CT_ c) => c.isDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDocumented,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'oneLineDoc': Property(
                getValue: (CT_ c) => c.oneLineDoc,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.oneLineDoc,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Documentable(
    Documentable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Documentable>? getProperty(String key) {
    if (propertyMap<Documentable>().containsKey(key)) {
      return propertyMap<Documentable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_DocumentationComment
    extends RendererBase<DocumentationComment> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends DocumentationComment>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'documentationAsHtml': Property(
                getValue: (CT_ c) => c.documentationAsHtml,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationAsHtml,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationComment': Property(
                getValue: (CT_ c) => c.documentationComment,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationComment,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationFrom': Property(
                getValue: (CT_ c) => c.documentationFrom,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<DocumentationComment>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentationFrom.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['DocumentationComment']!,
                    ),
                  );
                },
              ),
              'documentationLocal': Property(
                getValue: (CT_ c) => c.documentationLocal,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationLocal,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
              'elementDocumentation': Property(
                getValue: (CT_ c) => c.elementDocumentation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Documentation',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.elementDocumentation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Documentation']!,
                  );
                },
              ),
              'hasDocumentationComment': Property(
                getValue: (CT_ c) => c.hasDocumentationComment,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentationComment,
              ),
              'hasNodoc': Property(
                getValue: (CT_ c) => c.hasNodoc,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasNodoc,
              ),
              'needsPrecache': Property(
                getValue: (CT_ c) => c.needsPrecache,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.needsPrecache,
              ),
              'pathContext': Property(
                getValue: (CT_ c) => c.pathContext,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Context'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.pathContext,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Context']!,
                  );
                },
              ),
              'sourceFileName': Property(
                getValue: (CT_ c) => c.sourceFileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.sourceFileName == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceFileName!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_DocumentationComment(
    DocumentationComment context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<DocumentationComment>? getProperty(String key) {
    if (propertyMap<DocumentationComment>().containsKey(key)) {
      return propertyMap<DocumentationComment>()[key];
    } else {
      return null;
    }
  }
}

void _render_ElementType(
  ElementType context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ElementType(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ElementType extends RendererBase<ElementType> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends ElementType>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              'breadcrumbName': Property(
                getValue: (CT_ c) => c.breadcrumbName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.breadcrumbName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'displayName': Property(
                getValue: (CT_ c) => c.displayName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.displayName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isTypedef': Property(
                getValue: (CT_ c) => c.isTypedef,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isTypedef,
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenerics': Property(
                getValue: (CT_ c) => c.nameWithGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenericsPlain': Property(
                getValue: (CT_ c) => c.nameWithGenericsPlain,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenericsPlain,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nullabilitySuffix': Property(
                getValue: (CT_ c) => c.nullabilitySuffix,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nullabilitySuffix,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
              'type': Property(
                getValue: (CT_ c) => c.type,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartType',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.type,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartType']!,
                  );
                },
              ),
              'typeArguments': Property(
                getValue: (CT_ c) => c.typeArguments,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeArguments.map(
                    (e) => _render_ElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ElementType(
    ElementType context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ElementType>? getProperty(String key) {
    if (propertyMap<ElementType>().containsKey(key)) {
      return propertyMap<ElementType>()[key];
    } else {
      return null;
    }
  }
}

void _render_Enum(
  Enum context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Enum(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Enum extends RendererBase<Enum> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Enum>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainer.propertyMap<CT_>(),
              ..._Renderer_Constructable.propertyMap<CT_>(),
              ..._Renderer_MixedInTypes.propertyMap<CT_>(),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'constantFields': Property(
                getValue: (CT_ c) => c.constantFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constantFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'EnumElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['EnumElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'EnumElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['EnumElement2']!,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'hasPublicEnumValues': Property(
                getValue: (CT_ c) => c.hasPublicEnumValues,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicEnumValues,
              ),
              'inheritanceChain': Property(
                getValue: (CT_ c) => c.inheritanceChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritanceChain.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'isAbstract': Property(
                getValue: (CT_ c) => c.isAbstract,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAbstract,
              ),
              'isBase': Property(
                getValue: (CT_ c) => c.isBase,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isBase,
              ),
              'isImplementableInterface': Property(
                getValue: (CT_ c) => c.isImplementableInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isImplementableInterface,
              ),
              'isMixinClass': Property(
                getValue: (CT_ c) => c.isMixinClass,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixinClass,
              ),
              'isSealed': Property(
                getValue: (CT_ c) => c.isSealed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSealed,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'publicEnumValues': Property(
                getValue: (CT_ c) => c.publicEnumValues,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicEnumValues.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Enum(
    Enum context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Enum>? getProperty(String key) {
    if (propertyMap<Enum>().containsKey(key)) {
      return propertyMap<Enum>()[key];
    } else {
      return null;
    }
  }
}

String renderEnum(EnumTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_EnumTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_EnumTemplateData(
  EnumTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_EnumTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_EnumTemplateData extends RendererBase<EnumTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends EnumTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainerTemplateData.propertyMap<
                Enum,
                CT_
              >(),
              'eNum': Property(
                getValue: (CT_ c) => c.eNum,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Enum.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Enum,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Enum(c.eNum, ast, r.template, sink, parent: r);
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Enum.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Enum,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Enum(c.self, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_EnumTemplateData(
    EnumTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<EnumTemplateData>? getProperty(String key) {
    if (propertyMap<EnumTemplateData>().containsKey(key)) {
      return propertyMap<EnumTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_Extension(
  Extension context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Extension(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Extension extends RendererBase<Extension> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Extension>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Container.propertyMap<CT_>(),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'alwaysApplies': Property(
                getValue: (CT_ c) => c.alwaysApplies,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.alwaysApplies,
              ),
              'availableInstanceFieldsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceMethodsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceMethodsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceMethodsSorted.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceOperatorsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceOperatorsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceOperatorsSorted.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredFields': Property(
                getValue: (CT_ c) => c.declaredFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredMethods': Property(
                getValue: (CT_ c) => c.declaredMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExtensionElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExtensionElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExtensionElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExtensionElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'extendedElement': Property(
                getValue: (CT_ c) => c.extendedElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.extendedElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'instanceMethods': Property(
                getValue: (CT_ c) => c.instanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Extension(
    Extension context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Extension>? getProperty(String key) {
    if (propertyMap<Extension>().containsKey(key)) {
      return propertyMap<Extension>()[key];
    } else {
      return null;
    }
  }
}

String renderExtension<T extends Extension>(
  ExtensionTemplateData<T> context,
  Template template,
) {
  var buffer = StringBuffer();
  _render_ExtensionTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_ExtensionTemplateData<T extends Extension>(
  ExtensionTemplateData<T> context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ExtensionTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_ExtensionTemplateData<T extends Extension>
    extends RendererBase<ExtensionTemplateData<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<T extends Extension, CT_ extends ExtensionTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<T, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<T, CT_>(),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'extension': Property(
                getValue: (CT_ c) => c.extension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.extension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ExtensionTemplateData(
    ExtensionTemplateData<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ExtensionTemplateData<T>>? getProperty(String key) {
    if (propertyMap<T, ExtensionTemplateData<T>>().containsKey(key)) {
      return propertyMap<T, ExtensionTemplateData<T>>()[key];
    } else {
      return null;
    }
  }
}

void _render_ExtensionType(
  ExtensionType context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ExtensionType(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ExtensionType extends RendererBase<ExtensionType> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends ExtensionType>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainer.propertyMap<CT_>(),
              ..._Renderer_Constructable.propertyMap<CT_>(),
              ..._Renderer_Constructable.propertyMap<CT_>(),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'declaredFields': Property(
                getValue: (CT_ c) => c.declaredFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExtensionTypeElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExtensionTypeElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExtensionTypeElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExtensionTypeElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'inheritanceChain': Property(
                getValue: (CT_ c) => c.inheritanceChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritanceChain.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'isAbstract': Property(
                getValue: (CT_ c) => c.isAbstract,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAbstract,
              ),
              'isBase': Property(
                getValue: (CT_ c) => c.isBase,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isBase,
              ),
              'isImplementableInterface': Property(
                getValue: (CT_ c) => c.isImplementableInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isImplementableInterface,
              ),
              'isMixinClass': Property(
                getValue: (CT_ c) => c.isMixinClass,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixinClass,
              ),
              'isSealed': Property(
                getValue: (CT_ c) => c.isSealed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSealed,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'representationType': Property(
                getValue: (CT_ c) => c.representationType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.representationType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ExtensionType(
    ExtensionType context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ExtensionType>? getProperty(String key) {
    if (propertyMap<ExtensionType>().containsKey(key)) {
      return propertyMap<ExtensionType>()[key];
    } else {
      return null;
    }
  }
}

String renderExtensionType<T extends ExtensionType>(
  ExtensionTypeTemplateData<T> context,
  Template template,
) {
  var buffer = StringBuffer();
  _render_ExtensionTypeTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_ExtensionTypeTemplateData<T extends ExtensionType>(
  ExtensionTypeTemplateData<T> context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ExtensionTypeTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_ExtensionTypeTemplateData<T extends ExtensionType>
    extends RendererBase<ExtensionTypeTemplateData<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<
    T extends ExtensionType,
    CT_ extends ExtensionTypeTemplateData
  >() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<T, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<T, CT_>(),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'extensionType': Property(
                getValue: (CT_ c) => c.extensionType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ExtensionType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ExtensionType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ExtensionType(
                    c.extensionType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ExtensionType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ExtensionType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ExtensionType(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ExtensionTypeTemplateData(
    ExtensionTypeTemplateData<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ExtensionTypeTemplateData<T>>? getProperty(String key) {
    if (propertyMap<T, ExtensionTypeTemplateData<T>>().containsKey(key)) {
      return propertyMap<T, ExtensionTypeTemplateData<T>>()[key];
    } else {
      return null;
    }
  }
}

void _render_ExternalItem(
  ExternalItem context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ExternalItem(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ExternalItem extends RendererBase<ExternalItem> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends ExternalItem>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'docs': Property(
                getValue: (CT_ c) => c.docs,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.docs, ast, r.template, sink, parent: r);
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'url': Property(
                getValue: (CT_ c) => c.url,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.url, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ExternalItem(
    ExternalItem context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ExternalItem>? getProperty(String key) {
    if (propertyMap<ExternalItem>().containsKey(key)) {
      return propertyMap<ExternalItem>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_FeatureSet extends RendererBase<FeatureSet> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends FeatureSet>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'displayedLanguageFeatures': Property(
                getValue: (CT_ c) => c.displayedLanguageFeatures,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<LanguageFeature>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.displayedLanguageFeatures.map(
                    (e) => _render_LanguageFeature(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'hasFeatureSet': Property(
                getValue: (CT_ c) => c.hasFeatureSet,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasFeatureSet,
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_FeatureSet(
    FeatureSet context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<FeatureSet>? getProperty(String key) {
    if (propertyMap<FeatureSet>().containsKey(key)) {
      return propertyMap<FeatureSet>()[key];
    } else {
      return null;
    }
  }
}

void _render_Field(
  Field context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Field(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Field extends RendererBase<Field> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Field>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_GetterSetterCombo.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_Inheritable.propertyMap<CT_>(),
              ..._Renderer_GetterSetterCombo.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_Inheritable.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FieldElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FieldElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FieldElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FieldElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enclosingExtension': Property(
                getValue: (CT_ c) => c.enclosingExtension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.enclosingExtension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'fullkind': Property(
                getValue: (CT_ c) => c.fullkind,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fullkind, ast, r.template, sink, parent: r);
                },
              ),
              'getter': Property(
                getValue: (CT_ c) => c.getter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ContainerAccessor.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ContainerAccessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.getter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ContainerAccessor(
                    c.getter!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isConst': Property(
                getValue: (CT_ c) => c.isConst,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isConst,
              ),
              'isCovariant': Property(
                getValue: (CT_ c) => c.isCovariant,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCovariant,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isLate': Property(
                getValue: (CT_ c) => c.isLate,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isLate,
              ),
              'isProvidedByExtension': Property(
                getValue: (CT_ c) => c.isProvidedByExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isProvidedByExtension,
              ),
              'isStatic': Property(
                getValue: (CT_ c) => c.isStatic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isStatic,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'overriddenElement': Property(
                getValue: (CT_ c) => c.overriddenElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Inheritable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Inheritable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.overriddenElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.overriddenElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Inheritable']!,
                  );
                },
              ),
              'setter': Property(
                getValue: (CT_ c) => c.setter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ContainerAccessor.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ContainerAccessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.setter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ContainerAccessor(
                    c.setter!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sourceCode': Property(
                getValue: (CT_ c) => c.sourceCode,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Field(
    Field context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Field>? getProperty(String key) {
    if (propertyMap<Field>().containsKey(key)) {
      return propertyMap<Field>()[key];
    } else {
      return null;
    }
  }
}

String renderFunction(FunctionTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_FunctionTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_FunctionTemplateData(
  FunctionTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_FunctionTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_FunctionTemplateData
    extends RendererBase<FunctionTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends FunctionTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<ModelFunction, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<ModelFunction, CT_>(),
              'function': Property(
                getValue: (CT_ c) => c.function,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelFunction.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelFunction,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelFunction(
                    c.function,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelFunction.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelFunction,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelFunction(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_FunctionTemplateData(
    FunctionTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<FunctionTemplateData>? getProperty(String key) {
    if (propertyMap<FunctionTemplateData>().containsKey(key)) {
      return propertyMap<FunctionTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_FunctionTypedef(
  FunctionTypedef context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_FunctionTypedef(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_FunctionTypedef extends RendererBase<FunctionTypedef> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends FunctionTypedef>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Typedef.propertyMap<CT_>(),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Callable.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Callable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Callable(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_FunctionTypedef(
    FunctionTypedef context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<FunctionTypedef>? getProperty(String key) {
    if (propertyMap<FunctionTypedef>().containsKey(key)) {
      return propertyMap<FunctionTypedef>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_GetterSetterCombo extends RendererBase<GetterSetterCombo> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends GetterSetterCombo>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'allAccessors': Property(
                getValue: (CT_ c) => c.allAccessors,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Accessor>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allAccessors.map(
                    (e) =>
                        _render_Accessor(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'annotations': Property(
                getValue: (CT_ c) => c.annotations,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Annotation>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.annotations.map(
                    (e) =>
                        _render_Annotation(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'arrow': Property(
                getValue: (CT_ c) => c.arrow,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.arrow, ast, r.template, sink, parent: r);
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'constantValue': Property(
                getValue: (CT_ c) => c.constantValue,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.constantValue,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'constantValueBase': Property(
                getValue: (CT_ c) => c.constantValueBase,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.constantValueBase,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'constantValueTruncated': Property(
                getValue: (CT_ c) => c.constantValueTruncated,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.constantValueTruncated,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationComment': Property(
                getValue: (CT_ c) => c.documentationComment,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationComment,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationFrom': Property(
                getValue: (CT_ c) => c.documentationFrom,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<DocumentationComment>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentationFrom.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['DocumentationComment']!,
                    ),
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'getter': Property(
                getValue: (CT_ c) => c.getter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Accessor.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Accessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.getter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Accessor(c.getter!, ast, r.template, sink, parent: r);
                },
              ),
              'getterSetterBothAvailable': Property(
                getValue: (CT_ c) => c.getterSetterBothAvailable,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.getterSetterBothAvailable,
              ),
              'hasAccessorsWithDocs': Property(
                getValue: (CT_ c) => c.hasAccessorsWithDocs,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAccessorsWithDocs,
              ),
              'hasConstantValueForDisplay': Property(
                getValue: (CT_ c) => c.hasConstantValueForDisplay,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasConstantValueForDisplay,
              ),
              'hasDocumentationComment': Property(
                getValue: (CT_ c) => c.hasDocumentationComment,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentationComment,
              ),
              'hasExplicitGetter': Property(
                getValue: (CT_ c) => c.hasExplicitGetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasExplicitGetter,
              ),
              'hasExplicitSetter': Property(
                getValue: (CT_ c) => c.hasExplicitSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasExplicitSetter,
              ),
              'hasGetter': Property(
                getValue: (CT_ c) => c.hasGetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasGetter,
              ),
              'hasGetterOrSetter': Property(
                getValue: (CT_ c) => c.hasGetterOrSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasGetterOrSetter,
              ),
              'hasParameters': Property(
                getValue: (CT_ c) => c.hasParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasParameters,
              ),
              'hasPublicGetter': Property(
                getValue: (CT_ c) => c.hasPublicGetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicGetter,
              ),
              'hasPublicGetterNoSetter': Property(
                getValue: (CT_ c) => c.hasPublicGetterNoSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicGetterNoSetter,
              ),
              'hasPublicSetter': Property(
                getValue: (CT_ c) => c.hasPublicSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicSetter,
              ),
              'hasSetter': Property(
                getValue: (CT_ c) => c.hasSetter,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasSetter,
              ),
              'isCallable': Property(
                getValue: (CT_ c) => c.isCallable,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCallable,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'linkedParamsNoMetadata': Property(
                getValue: (CT_ c) => c.linkedParamsNoMetadata,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.linkedParamsNoMetadata == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedParamsNoMetadata!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'oneLineDoc': Property(
                getValue: (CT_ c) => c.oneLineDoc,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.oneLineDoc,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'parameters': Property(
                getValue: (CT_ c) => c.parameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Parameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.parameters.map(
                    (e) =>
                        _render_Parameter(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'readOnly': Property(
                getValue: (CT_ c) => c.readOnly,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.readOnly,
              ),
              'readWrite': Property(
                getValue: (CT_ c) => c.readWrite,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.readWrite,
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'setter': Property(
                getValue: (CT_ c) => c.setter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Accessor.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Accessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.setter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Accessor(c.setter!, ast, r.template, sink, parent: r);
                },
              ),
              'writeOnly': Property(
                getValue: (CT_ c) => c.writeOnly,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.writeOnly,
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_GetterSetterCombo(
    GetterSetterCombo context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<GetterSetterCombo>? getProperty(String key) {
    if (propertyMap<GetterSetterCombo>().containsKey(key)) {
      return propertyMap<GetterSetterCombo>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_HasNoPage extends RendererBase<HasNoPage> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends HasNoPage>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_HasNoPage(
    HasNoPage context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<HasNoPage>? getProperty(String key) {
    if (propertyMap<HasNoPage>().containsKey(key)) {
      return propertyMap<HasNoPage>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Inheritable extends RendererBase<Inheritable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Inheritable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'canonicalLibrary': Property(
                getValue: (CT_ c) => c.canonicalLibrary,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.canonicalLibrary == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.canonicalLibrary!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'canonicalModelElement': Property(
                getValue: (CT_ c) => c.canonicalModelElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.canonicalModelElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.canonicalModelElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isCovariant': Property(
                getValue: (CT_ c) => c.isCovariant,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCovariant,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isOverride': Property(
                getValue: (CT_ c) => c.isOverride,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isOverride,
              ),
              'overriddenDepth': Property(
                getValue: (CT_ c) => c.overriddenDepth,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.overriddenDepth,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'overriddenElement': Property(
                getValue: (CT_ c) => c.overriddenElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Inheritable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Inheritable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.overriddenElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.overriddenElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Inheritable']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Inheritable(
    Inheritable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Inheritable>? getProperty(String key) {
    if (propertyMap<Inheritable>().containsKey(key)) {
      return propertyMap<Inheritable>()[key];
    } else {
      return null;
    }
  }
}

void _render_InheritingContainer(
  InheritingContainer context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_InheritingContainer(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_InheritingContainer extends RendererBase<InheritingContainer> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends InheritingContainer>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Container.propertyMap<CT_>(),
              'allFields': Property(
                getValue: (CT_ c) => c.allFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'availableInstanceFieldsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceFieldsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceFieldsSorted.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceMethodsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceMethodsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceMethodsSorted.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'availableInstanceOperatorsSorted': Property(
                getValue: (CT_ c) => c.availableInstanceOperatorsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.availableInstanceOperatorsSorted.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'constantFields': Property(
                getValue: (CT_ c) => c.constantFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constantFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'containerModifiers': Property(
                getValue: (CT_ c) => c.containerModifiers,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ContainerModifier>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.containerModifiers.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['ContainerModifier']!,
                    ),
                  );
                },
              ),
              'declaredFields': Property(
                getValue: (CT_ c) => c.declaredFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'declaredMethods': Property(
                getValue: (CT_ c) => c.declaredMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.declaredMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'definingContainer': Property(
                getValue: (CT_ c) => c.definingContainer,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_InheritingContainer.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as InheritingContainer,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_InheritingContainer(
                    c.definingContainer,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'displayedLanguageFeatures': Property(
                getValue: (CT_ c) => c.displayedLanguageFeatures,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<LanguageFeature>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.displayedLanguageFeatures.map(
                    (e) => _render_LanguageFeature(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'InterfaceElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['InterfaceElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'InterfaceElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['InterfaceElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fullkind': Property(
                getValue: (CT_ c) => c.fullkind,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fullkind, ast, r.template, sink, parent: r);
                },
              ),
              'hasModifiers': Property(
                getValue: (CT_ c) => c.hasModifiers,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasModifiers,
              ),
              'hasPotentiallyApplicableExtensions': Property(
                getValue: (CT_ c) => c.hasPotentiallyApplicableExtensions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPotentiallyApplicableExtensions,
              ),
              'hasPublicImplementers': Property(
                getValue: (CT_ c) => c.hasPublicImplementers,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicImplementers,
              ),
              'hasPublicInterfaces': Property(
                getValue: (CT_ c) => c.hasPublicInterfaces,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicInterfaces,
              ),
              'hasPublicSuperChainReversed': Property(
                getValue: (CT_ c) => c.hasPublicSuperChainReversed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicSuperChainReversed,
              ),
              'inheritanceChain': Property(
                getValue: (CT_ c) => c.inheritanceChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritanceChain.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'inheritedMethods': Property(
                getValue: (CT_ c) => c.inheritedMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritedMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'inheritedOperators': Property(
                getValue: (CT_ c) => c.inheritedOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritedOperators.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceFields': Property(
                getValue: (CT_ c) => c.instanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Field>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceFields.map(
                    (e) => _render_Field(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceMethods': Property(
                getValue: (CT_ c) => c.instanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Method>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceMethods.map(
                    (e) => _render_Method(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'instanceOperators': Property(
                getValue: (CT_ c) => c.instanceOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Operator>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.instanceOperators.map(
                    (e) =>
                        _render_Operator(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'interfaceElements': Property(
                getValue: (CT_ c) => c.interfaceElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.interfaceElements.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'isAbstract': Property(
                getValue: (CT_ c) => c.isAbstract,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAbstract,
              ),
              'isBase': Property(
                getValue: (CT_ c) => c.isBase,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isBase,
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isImplementableInterface': Property(
                getValue: (CT_ c) => c.isImplementableInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isImplementableInterface,
              ),
              'isMixinClass': Property(
                getValue: (CT_ c) => c.isMixinClass,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixinClass,
              ),
              'isSealed': Property(
                getValue: (CT_ c) => c.isSealed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSealed,
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_DefinedElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as DefinedElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_DefinedElementType(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'potentiallyApplicableExtensionsSorted': Property(
                getValue: (CT_ c) => c.potentiallyApplicableExtensionsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Extension>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.potentiallyApplicableExtensionsSorted.map(
                    (e) =>
                        _render_Extension(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicImplementersSorted': Property(
                getValue: (CT_ c) => c.publicImplementersSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicImplementersSorted.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicInheritedInstanceFields': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceFields,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceFields,
              ),
              'publicInheritedInstanceMethods': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceMethods,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceMethods,
              ),
              'publicInheritedInstanceOperators': Property(
                getValue: (CT_ c) => c.publicInheritedInstanceOperators,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.publicInheritedInstanceOperators,
              ),
              'publicInterfaceElements': Property(
                getValue: (CT_ c) => c.publicInterfaceElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicInterfaceElements.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicInterfaces': Property(
                getValue: (CT_ c) => c.publicInterfaces,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<DefinedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicInterfaces.map(
                    (e) => _render_DefinedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicSuperChainReversed': Property(
                getValue: (CT_ c) => c.publicSuperChainReversed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<DefinedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicSuperChainReversed.map(
                    (e) => _render_DefinedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'superChain': Property(
                getValue: (CT_ c) => c.superChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<DefinedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.superChain.map(
                    (e) => _render_DefinedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'supertype': Property(
                getValue: (CT_ c) => c.supertype,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_DefinedElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as DefinedElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.supertype == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_DefinedElementType(
                    c.supertype!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_InheritingContainer(
    InheritingContainer context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<InheritingContainer>? getProperty(String key) {
    if (propertyMap<InheritingContainer>().containsKey(key)) {
      return propertyMap<InheritingContainer>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_InheritingContainerTemplateData<T extends InheritingContainer>
    extends RendererBase<InheritingContainerTemplateData<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<
    T extends InheritingContainer,
    CT_ extends InheritingContainerTemplateData
  >() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<T, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<T, CT_>(),
              'clazz': Property(
                getValue: (CT_ c) => c.clazz,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_InheritingContainer.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as InheritingContainer,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_InheritingContainer(
                    c.clazz,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_InheritingContainer.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as InheritingContainer,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_InheritingContainer(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_InheritingContainerTemplateData(
    InheritingContainerTemplateData<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<InheritingContainerTemplateData<T>>? getProperty(String key) {
    if (propertyMap<T, InheritingContainerTemplateData<T>>().containsKey(key)) {
      return propertyMap<T, InheritingContainerTemplateData<T>>()[key];
    } else {
      return null;
    }
  }
}

void _render_LanguageFeature(
  LanguageFeature context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_LanguageFeature(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_LanguageFeature extends RendererBase<LanguageFeature> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends LanguageFeature>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'featureDescription': Property(
                getValue: (CT_ c) => c.featureDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.featureDescription == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.featureDescription!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'featureLabel': Property(
                getValue: (CT_ c) => c.featureLabel,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.featureLabel,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'featureUrl': Property(
                getValue: (CT_ c) => c.featureUrl,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.featureUrl == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.featureUrl!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_LanguageFeature(
    LanguageFeature context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<LanguageFeature>? getProperty(String key) {
    if (propertyMap<LanguageFeature>().containsKey(key)) {
      return propertyMap<LanguageFeature>()[key];
    } else {
      return null;
    }
  }
}

void _render_Library(
  Library context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Library(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Library extends RendererBase<Library> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Library>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_TopLevelContainer.propertyMap<CT_>(),
              ..._Renderer_CanonicalFor.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_TopLevelContainer.propertyMap<CT_>(),
              ..._Renderer_CanonicalFor.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'allModelElements': Property(
                getValue: (CT_ c) => c.allModelElements,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelElement>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allModelElements.map(
                    (e) => _render_ModelElement(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'breadcrumbName': Property(
                getValue: (CT_ c) => c.breadcrumbName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.breadcrumbName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'classes': Property(
                getValue: (CT_ c) => c.classes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.classes.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'classesAndExceptions': Property(
                getValue: (CT_ c) => c.classesAndExceptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.classesAndExceptions.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'constants': Property(
                getValue: (CT_ c) => c.constants,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constants.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'dirName': Property(
                getValue: (CT_ c) => c.dirName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.dirName, ast, r.template, sink, parent: r);
                },
              ),
              'displayName': Property(
                getValue: (CT_ c) => c.displayName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.displayName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'LibraryElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['LibraryElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'LibraryElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['LibraryElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.enclosingElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enums': Property(
                getValue: (CT_ c) => c.enums,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Enum>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.enums.map(
                    (e) => _render_Enum(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'exceptions': Property(
                getValue: (CT_ c) => c.exceptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.exceptions.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'extensionTypes': Property(
                getValue: (CT_ c) => c.extensionTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ExtensionType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensionTypes.map(
                    (e) => _render_ExtensionType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'extensions': Property(
                getValue: (CT_ c) => c.extensions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Extension>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensions.map(
                    (e) =>
                        _render_Extension(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'functions': Property(
                getValue: (CT_ c) => c.functions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelFunction>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.functions.map(
                    (e) => _render_ModelFunction(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isAnonymous': Property(
                getValue: (CT_ c) => c.isAnonymous,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAnonymous,
              ),
              'isInSdk': Property(
                getValue: (CT_ c) => c.isInSdk,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInSdk,
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'mixins': Property(
                getValue: (CT_ c) => c.mixins,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Mixin>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.mixins.map(
                    (e) => _render_Mixin(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'packageMeta': Property(
                getValue: (CT_ c) => c.packageMeta,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageMeta',
                        ),

                isNullValue: (CT_ c) => c.packageMeta == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageMeta,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageMeta']!,
                  );
                },
              ),
              'packageName': Property(
                getValue: (CT_ c) => c.packageName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.packageName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'properties': Property(
                getValue: (CT_ c) => c.properties,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.properties.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'redirectingPath': Property(
                getValue: (CT_ c) => c.redirectingPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.redirectingPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'scope': Property(
                getValue: (CT_ c) => c.scope,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Scope'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.scope,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Scope']!,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'typedefs': Property(
                getValue: (CT_ c) => c.typedefs,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Typedef>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typedefs.map(
                    (e) => _render_Typedef(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'unitElement': Property(
                getValue: (CT_ c) => c.unitElement,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'LibraryFragment',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.unitElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['LibraryFragment']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Library(
    Library context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Library>? getProperty(String key) {
    if (propertyMap<Library>().containsKey(key)) {
      return propertyMap<Library>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends LibraryContainer>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'containerOrder': Property(
                getValue: (CT_ c) => c.containerOrder,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<String>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.containerOrder.map(
                    (e) => _render_String(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'enclosingName': Property(
                getValue: (CT_ c) => c.enclosingName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.enclosingName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasPublicLibraries': Property(
                getValue: (CT_ c) => c.hasPublicLibraries,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicLibraries,
              ),
              'isSdk': Property(
                getValue: (CT_ c) => c.isSdk,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSdk,
              ),
              'libraries': Property(
                getValue: (CT_ c) => c.libraries,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Library>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.libraries.map(
                    (e) => _render_Library(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicLibrariesSorted': Property(
                getValue: (CT_ c) => c.publicLibrariesSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Library>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicLibrariesSorted.map(
                    (e) => _render_Library(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'sortKey': Property(
                getValue: (CT_ c) => c.sortKey,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.sortKey, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_LibraryContainer(
    LibraryContainer context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<LibraryContainer>? getProperty(String key) {
    if (propertyMap<LibraryContainer>().containsKey(key)) {
      return propertyMap<LibraryContainer>()[key];
    } else {
      return null;
    }
  }
}

String renderLibraryRedirect(LibraryTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_LibraryTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_LibraryTemplateData(
  LibraryTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_LibraryTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_LibraryTemplateData extends RendererBase<LibraryTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends LibraryTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Library, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<Library, CT_>(),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_LibraryTemplateData(
    LibraryTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<LibraryTemplateData>? getProperty(String key) {
    if (propertyMap<LibraryTemplateData>().containsKey(key)) {
      return propertyMap<LibraryTemplateData>()[key];
    } else {
      return null;
    }
  }
}

String renderLibrary(LibraryTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_LibraryTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

class _Renderer_Locatable extends RendererBase<Locatable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Locatable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'documentationFrom': Property(
                getValue: (CT_ c) => c.documentationFrom,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Locatable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentationFrom.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Locatable']!,
                    ),
                  );
                },
              ),
              'documentationIsLocal': Property(
                getValue: (CT_ c) => c.documentationIsLocal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.documentationIsLocal,
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'location': Property(
                getValue: (CT_ c) => c.location,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.location, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Locatable(
    Locatable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Locatable>? getProperty(String key) {
    if (propertyMap<Locatable>().containsKey(key)) {
      return propertyMap<Locatable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_MarkdownFileDocumentation
    extends RendererBase<MarkdownFileDocumentation> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends MarkdownFileDocumentation>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationAsHtml': Property(
                getValue: (CT_ c) => c.documentationAsHtml,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationAsHtml,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationFile': Property(
                getValue: (CT_ c) => c.documentationFile,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'File'),

                isNullValue: (CT_ c) => c.documentationFile == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.documentationFile,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['File']!,
                  );
                },
              ),
              'documentedWhere': Property(
                getValue: (CT_ c) => c.documentedWhere,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DocumentLocation',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.documentedWhere,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DocumentLocation']!,
                  );
                },
              ),
              'hasDocumentation': Property(
                getValue: (CT_ c) => c.hasDocumentation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentation,
              ),
              'isDocumented': Property(
                getValue: (CT_ c) => c.isDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDocumented,
              ),
              'location': Property(
                getValue: (CT_ c) => c.location,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.location, ast, r.template, sink, parent: r);
                },
              ),
              'oneLineDoc': Property(
                getValue: (CT_ c) => c.oneLineDoc,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.oneLineDoc,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_MarkdownFileDocumentation(
    MarkdownFileDocumentation context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<MarkdownFileDocumentation>? getProperty(String key) {
    if (propertyMap<MarkdownFileDocumentation>().containsKey(key)) {
      return propertyMap<MarkdownFileDocumentation>()[key];
    } else {
      return null;
    }
  }
}

void _render_Method(
  Method context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Method(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Method extends RendererBase<Method> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Method>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_Inheritable.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_ContainerMember.propertyMap<CT_>(),
              ..._Renderer_Inheritable.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'MethodElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['MethodElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'MethodElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['MethodElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enclosingExtension': Property(
                getValue: (CT_ c) => c.enclosingExtension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.enclosingExtension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fullkind': Property(
                getValue: (CT_ c) => c.fullkind,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fullkind, ast, r.template, sink, parent: r);
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isCovariant': Property(
                getValue: (CT_ c) => c.isCovariant,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCovariant,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isOperator': Property(
                getValue: (CT_ c) => c.isOperator,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isOperator,
              ),
              'isProvidedByExtension': Property(
                getValue: (CT_ c) => c.isProvidedByExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isProvidedByExtension,
              ),
              'isStatic': Property(
                getValue: (CT_ c) => c.isStatic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isStatic,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Callable.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Callable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Callable(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'originalMember': Property(
                getValue: (CT_ c) => c.originalMember,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ExecutableMember',
                        ),

                isNullValue: (CT_ c) => c.originalMember == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.originalMember,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ExecutableMember']!,
                  );
                },
              ),
              'overriddenElement': Property(
                getValue: (CT_ c) => c.overriddenElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Method.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Method,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.overriddenElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Method(
                    c.overriddenElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Method(
    Method context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Method>? getProperty(String key) {
    if (propertyMap<Method>().containsKey(key)) {
      return propertyMap<Method>()[key];
    } else {
      return null;
    }
  }
}

String renderMethod(MethodTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_MethodTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_MethodTemplateData(
  MethodTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_MethodTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_MethodTemplateData extends RendererBase<MethodTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends MethodTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Method, CT_>(),
              ..._Renderer_TwoDirectoriesDown.propertyMap<Method, CT_>(),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'method': Property(
                getValue: (CT_ c) => c.method,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Method.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Method,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Method(c.method, ast, r.template, sink, parent: r);
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'navLinksWithGenerics': Property(
                getValue: (CT_ c) => c.navLinksWithGenerics,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinksWithGenerics.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Method.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Method,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Method(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_MethodTemplateData(
    MethodTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<MethodTemplateData>? getProperty(String key) {
    if (propertyMap<MethodTemplateData>().containsKey(key)) {
      return propertyMap<MethodTemplateData>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_MixedInTypes extends RendererBase<MixedInTypes> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends MixedInTypes>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'hasModifiers': Property(
                getValue: (CT_ c) => c.hasModifiers,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasModifiers,
              ),
              'hasPublicMixedInTypes': Property(
                getValue: (CT_ c) => c.hasPublicMixedInTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicMixedInTypes,
              ),
              'mixedInTypes': Property(
                getValue: (CT_ c) => c.mixedInTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<DefinedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.mixedInTypes.map(
                    (e) => _render_DefinedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicMixedInTypes': Property(
                getValue: (CT_ c) => c.publicMixedInTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<DefinedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicMixedInTypes.map(
                    (e) => _render_DefinedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_MixedInTypes(
    MixedInTypes context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<MixedInTypes>? getProperty(String key) {
    if (propertyMap<MixedInTypes>().containsKey(key)) {
      return propertyMap<MixedInTypes>()[key];
    } else {
      return null;
    }
  }
}

void _render_Mixin(
  Mixin context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Mixin(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Mixin extends RendererBase<Mixin> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Mixin>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainer.propertyMap<CT_>(),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'MixinElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['MixinElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'MixinElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['MixinElement2']!,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'hasModifiers': Property(
                getValue: (CT_ c) => c.hasModifiers,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasModifiers,
              ),
              'hasPublicSuperclassConstraints': Property(
                getValue: (CT_ c) => c.hasPublicSuperclassConstraints,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicSuperclassConstraints,
              ),
              'inheritanceChain': Property(
                getValue: (CT_ c) => c.inheritanceChain,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<InheritingContainer>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.inheritanceChain.map(
                    (e) => _render_InheritingContainer(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'isAbstract': Property(
                getValue: (CT_ c) => c.isAbstract,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAbstract,
              ),
              'isBase': Property(
                getValue: (CT_ c) => c.isBase,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isBase,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isImplementableInterface': Property(
                getValue: (CT_ c) => c.isImplementableInterface,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isImplementableInterface,
              ),
              'isMixinClass': Property(
                getValue: (CT_ c) => c.isMixinClass,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isMixinClass,
              ),
              'isSealed': Property(
                getValue: (CT_ c) => c.isSealed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSealed,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'publicSuperclassConstraints': Property(
                getValue: (CT_ c) => c.publicSuperclassConstraints,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ParameterizedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicSuperclassConstraints.map(
                    (e) => _render_ParameterizedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'relationshipsClass': Property(
                getValue: (CT_ c) => c.relationshipsClass,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relationshipsClass,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sidebarPath': Property(
                getValue: (CT_ c) => c.sidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'superclassConstraints': Property(
                getValue: (CT_ c) => c.superclassConstraints,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ParameterizedElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.superclassConstraints.map(
                    (e) => _render_ParameterizedElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Mixin(
    Mixin context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Mixin>? getProperty(String key) {
    if (propertyMap<Mixin>().containsKey(key)) {
      return propertyMap<Mixin>()[key];
    } else {
      return null;
    }
  }
}

String renderMixin(MixinTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_MixinTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_MixinTemplateData(
  MixinTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_MixinTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_MixinTemplateData extends RendererBase<MixinTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends MixinTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_InheritingContainerTemplateData.propertyMap<
                Mixin,
                CT_
              >(),
              'mixin': Property(
                getValue: (CT_ c) => c.mixin,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Mixin.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Mixin,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Mixin(c.mixin, ast, r.template, sink, parent: r);
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Mixin.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Mixin,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Mixin(c.self, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_MixinTemplateData(
    MixinTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<MixinTemplateData>? getProperty(String key) {
    if (propertyMap<MixinTemplateData>().containsKey(key)) {
      return propertyMap<MixinTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_ModelElement(
  ModelElement context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ModelElement(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ModelElement extends RendererBase<ModelElement> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends ModelElement>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              ..._Renderer_Warnable.propertyMap<CT_>(),
              ..._Renderer_Locatable.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_SourceCode.propertyMap<CT_>(),
              ..._Renderer_FeatureSet.propertyMap<CT_>(),
              ..._Renderer_DocumentationComment.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              ..._Renderer_Warnable.propertyMap<CT_>(),
              ..._Renderer_Locatable.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_SourceCode.propertyMap<CT_>(),
              ..._Renderer_FeatureSet.propertyMap<CT_>(),
              ..._Renderer_DocumentationComment.propertyMap<CT_>(),
              'annotations': Property(
                getValue: (CT_ c) => c.annotations,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Annotation>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.annotations.map(
                    (e) =>
                        _render_Annotation(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'attributesAsString': Property(
                getValue: (CT_ c) => c.attributesAsString,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.attributesAsString,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'canonicalLibrary': Property(
                getValue: (CT_ c) => c.canonicalLibrary,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.canonicalLibrary == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.canonicalLibrary!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'canonicalLibraryOrThrow': Property(
                getValue: (CT_ c) => c.canonicalLibraryOrThrow,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.canonicalLibraryOrThrow,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'canonicalModelElement': Property(
                getValue: (CT_ c) => c.canonicalModelElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.canonicalModelElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.canonicalModelElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'config': Property(
                getValue: (CT_ c) => c.config,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartdocOptionContext',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.config,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartdocOptionContext']!,
                  );
                },
              ),
              'displayedCategories': Property(
                getValue: (CT_ c) => c.displayedCategories,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Category?>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.displayedCategories.map(
                    (e) =>
                        _render_Category(e!, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Element'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.enclosingElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasAnnotations': Property(
                getValue: (CT_ c) => c.hasAnnotations,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAnnotations,
              ),
              'hasAttributes': Property(
                getValue: (CT_ c) => c.hasAttributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasAttributes,
              ),
              'hasCategoryNames': Property(
                getValue: (CT_ c) => c.hasCategoryNames,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasCategoryNames,
              ),
              'hasDocumentation': Property(
                getValue: (CT_ c) => c.hasDocumentation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentation,
              ),
              'hasParameters': Property(
                getValue: (CT_ c) => c.hasParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasParameters,
              ),
              'hasSourceHref': Property(
                getValue: (CT_ c) => c.hasSourceHref,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasSourceHref,
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'htmlId': Property(
                getValue: (CT_ c) => c.htmlId,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlId, ast, r.template, sink, parent: r);
                },
              ),
              'isCallable': Property(
                getValue: (CT_ c) => c.isCallable,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCallable,
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'isConst': Property(
                getValue: (CT_ c) => c.isConst,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isConst,
              ),
              'isDeprecated': Property(
                getValue: (CT_ c) => c.isDeprecated,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDeprecated,
              ),
              'isDocumented': Property(
                getValue: (CT_ c) => c.isDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDocumented,
              ),
              'isEnumValue': Property(
                getValue: (CT_ c) => c.isEnumValue,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isEnumValue,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isLate': Property(
                getValue: (CT_ c) => c.isLate,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isLate,
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'isPublicAndPackageDocumented': Property(
                getValue: (CT_ c) => c.isPublicAndPackageDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublicAndPackageDocumented,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedObjectType': Property(
                getValue: (CT_ c) => c.linkedObjectType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedObjectType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedParams': Property(
                getValue: (CT_ c) => c.linkedParams,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedParams,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedParamsLines': Property(
                getValue: (CT_ c) => c.linkedParamsLines,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedParamsLines,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'linkedParamsNoMetadata': Property(
                getValue: (CT_ c) => c.linkedParamsNoMetadata,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.linkedParamsNoMetadata == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedParamsNoMetadata!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'location': Property(
                getValue: (CT_ c) => c.location,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.location, ast, r.template, sink, parent: r);
                },
              ),
              'modelNode': Property(
                getValue: (CT_ c) => c.modelNode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ModelNode',
                        ),

                isNullValue: (CT_ c) => c.modelNode == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.modelNode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ModelNode']!,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'oneLineDoc': Property(
                getValue: (CT_ c) => c.oneLineDoc,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.oneLineDoc,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'originalMember': Property(
                getValue: (CT_ c) => c.originalMember,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Member'),

                isNullValue: (CT_ c) => c.originalMember == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.originalMember,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Member']!,
                  );
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
              'parameters': Property(
                getValue: (CT_ c) => c.parameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Parameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.parameters.map(
                    (e) =>
                        _render_Parameter(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'pathContext': Property(
                getValue: (CT_ c) => c.pathContext,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Context'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.pathContext,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Context']!,
                  );
                },
              ),
              'qualifiedName': Property(
                getValue: (CT_ c) => c.qualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.qualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sourceCode': Property(
                getValue: (CT_ c) => c.sourceCode,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sourceFileName': Property(
                getValue: (CT_ c) => c.sourceFileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceFileName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'sourceHref': Property(
                getValue: (CT_ c) => c.sourceHref,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceHref,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'unitElement': Property(
                getValue: (CT_ c) => c.unitElement,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'LibraryFragment',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.unitElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['LibraryFragment']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ModelElement(
    ModelElement context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ModelElement>? getProperty(String key) {
    if (propertyMap<ModelElement>().containsKey(key)) {
      return propertyMap<ModelElement>()[key];
    } else {
      return null;
    }
  }
}

void _render_ModelFunction(
  ModelFunction context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ModelFunction(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ModelFunction extends RendererBase<ModelFunction> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends ModelFunction>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelFunctionTyped.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TopLevelFunctionElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TopLevelFunctionElement']!,
                  );
                },
              ),
              'isAsynchronous': Property(
                getValue: (CT_ c) => c.isAsynchronous,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isAsynchronous,
              ),
              'isStatic': Property(
                getValue: (CT_ c) => c.isStatic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isStatic,
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ModelFunction(
    ModelFunction context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ModelFunction>? getProperty(String key) {
    if (propertyMap<ModelFunction>().containsKey(key)) {
      return propertyMap<ModelFunction>()[key];
    } else {
      return null;
    }
  }
}

void _render_ModelFunctionTyped(
  ModelFunctionTyped context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ModelFunctionTyped(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_ModelFunctionTyped extends RendererBase<ModelFunctionTyped> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ModelFunctionTyped>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FunctionTypedElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FunctionTypedElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FunctionTypedElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FunctionTypedElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enclosingExtension': Property(
                getValue: (CT_ c) => c.enclosingExtension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.enclosingExtension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isProvidedByExtension': Property(
                getValue: (CT_ c) => c.isProvidedByExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isProvidedByExtension,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Callable.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Callable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Callable(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ModelFunctionTyped(
    ModelFunctionTyped context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ModelFunctionTyped>? getProperty(String key) {
    if (propertyMap<ModelFunctionTyped>().containsKey(key)) {
      return propertyMap<ModelFunctionTyped>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Nameable extends RendererBase<Nameable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Nameable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'breadcrumbName': Property(
                getValue: (CT_ c) => c.breadcrumbName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.breadcrumbName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'displayName': Property(
                getValue: (CT_ c) => c.displayName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.displayName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Nameable(
    Nameable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Nameable>? getProperty(String key) {
    if (propertyMap<Nameable>().containsKey(key)) {
      return propertyMap<Nameable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Object extends RendererBase<Object> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Object>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'hashCode': Property(
                getValue: (CT_ c) => c.hashCode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.hashCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Object(
    Object context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Object>? getProperty(String key) {
    if (propertyMap<Object>().containsKey(key)) {
      return propertyMap<Object>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_OneDirectoryDown<T extends Documentable>
    extends RendererBase<OneDirectoryDown<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<T extends Documentable, CT_ extends OneDirectoryDown>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'htmlBase': Property(
                getValue: (CT_ c) => c.htmlBase,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlBase, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_OneDirectoryDown(
    OneDirectoryDown<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<OneDirectoryDown<T>>? getProperty(String key) {
    if (propertyMap<T, OneDirectoryDown<T>>().containsKey(key)) {
      return propertyMap<T, OneDirectoryDown<T>>()[key];
    } else {
      return null;
    }
  }
}

void _render_Operator(
  Operator context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Operator(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Operator extends RendererBase<Operator> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Operator>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Method.propertyMap<CT_>(),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'isOperator': Property(
                getValue: (CT_ c) => c.isOperator,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isOperator,
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'referenceName': Property(
                getValue: (CT_ c) => c.referenceName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.referenceName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Operator(
    Operator context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Operator>? getProperty(String key) {
    if (propertyMap<Operator>().containsKey(key)) {
      return propertyMap<Operator>()[key];
    } else {
      return null;
    }
  }
}

void _render_Package(
  Package context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Package(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Package extends RendererBase<Package> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Package>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_LibraryContainer.propertyMap<CT_>(),
              ..._Renderer_Nameable.propertyMap<CT_>(),
              ..._Renderer_Locatable.propertyMap<CT_>(),
              ..._Renderer_Warnable.propertyMap<CT_>(),
              ..._Renderer_CommentReferable.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'allLibraries': Property(
                getValue: (CT_ c) => c.allLibraries,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Library>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.allLibraries.map(
                    (e) => _render_Library(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'baseHref': Property(
                getValue: (CT_ c) => c.baseHref,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.baseHref, ast, r.template, sink, parent: r);
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'categories': Property(
                getValue: (CT_ c) => c.categories,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Category>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.categories.map(
                    (e) =>
                        _render_Category(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'categoriesWithPublicLibraries': Property(
                getValue: (CT_ c) => c.categoriesWithPublicLibraries,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Category>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.categoriesWithPublicLibraries.map(
                    (e) =>
                        _render_Category(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'config': Property(
                getValue: (CT_ c) => c.config,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartdocOptionContext',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.config,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartdocOptionContext']!,
                  );
                },
              ),
              'containerOrder': Property(
                getValue: (CT_ c) => c.containerOrder,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<String>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.containerOrder.map(
                    (e) => _render_String(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'defaultCategory': Property(
                getValue: (CT_ c) => c.defaultCategory,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Category.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Category,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Category(
                    c.defaultCategory,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.documentation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationAsHtml': Property(
                getValue: (CT_ c) => c.documentationAsHtml,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentationAsHtml,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentationFrom': Property(
                getValue: (CT_ c) => c.documentationFrom,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Locatable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentationFrom.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Locatable']!,
                    ),
                  );
                },
              ),
              'documentedCategoriesSorted': Property(
                getValue: (CT_ c) => c.documentedCategoriesSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Category>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.documentedCategoriesSorted.map(
                    (e) =>
                        _render_Category(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'documentedWhere': Property(
                getValue: (CT_ c) => c.documentedWhere,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DocumentLocation',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.documentedWhere,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DocumentLocation']!,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Element'),

                isNullValue: (CT_ c) => c.element == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => c.element2 == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
              'enclosingName': Property(
                getValue: (CT_ c) => c.enclosingName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.enclosingName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'filePath': Property(
                getValue: (CT_ c) => c.filePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.filePath, ast, r.template, sink, parent: r);
                },
              ),
              'fullyQualifiedName': Property(
                getValue: (CT_ c) => c.fullyQualifiedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.fullyQualifiedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasCategories': Property(
                getValue: (CT_ c) => c.hasCategories,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasCategories,
              ),
              'hasDocumentation': Property(
                getValue: (CT_ c) => c.hasDocumentation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentation,
              ),
              'hasDocumentedCategories': Property(
                getValue: (CT_ c) => c.hasDocumentedCategories,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDocumentedCategories,
              ),
              'hasHomepage': Property(
                getValue: (CT_ c) => c.hasHomepage,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasHomepage,
              ),
              'homepage': Property(
                getValue: (CT_ c) => c.homepage,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.homepage, ast, r.template, sink, parent: r);
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href, ast, r.template, sink, parent: r);
                },
              ),
              'isCanonical': Property(
                getValue: (CT_ c) => c.isCanonical,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCanonical,
              ),
              'isDocumented': Property(
                getValue: (CT_ c) => c.isDocumented,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isDocumented,
              ),
              'isFirstPackage': Property(
                getValue: (CT_ c) => c.isFirstPackage,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFirstPackage,
              ),
              'isLocal': Property(
                getValue: (CT_ c) => c.isLocal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isLocal,
              ),
              'isPublic': Property(
                getValue: (CT_ c) => c.isPublic,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isPublic,
              ),
              'isSdk': Property(
                getValue: (CT_ c) => c.isSdk,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isSdk,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'location': Property(
                getValue: (CT_ c) => c.location,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.location, ast, r.template, sink, parent: r);
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'nameToCategory': Property(
                getValue: (CT_ c) => c.nameToCategory,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String?, Category>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.nameToCategory,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'oneLineDoc': Property(
                getValue: (CT_ c) => c.oneLineDoc,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.oneLineDoc,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'packageGraph': Property(
                getValue: (CT_ c) => c.packageGraph,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageGraph',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageGraph,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageGraph']!,
                  );
                },
              ),
              'packageMeta': Property(
                getValue: (CT_ c) => c.packageMeta,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'PackageMeta',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.packageMeta,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['PackageMeta']!,
                  );
                },
              ),
              'packagePath': Property(
                getValue: (CT_ c) => c.packagePath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.packagePath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceName': Property(
                getValue: (CT_ c) => c.referenceName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.referenceName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'toolInvocationIndex': Property(
                getValue: (CT_ c) => c.toolInvocationIndex,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.toolInvocationIndex,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'usedAnimationIdsByHref': Property(
                getValue: (CT_ c) => c.usedAnimationIdsByHref,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String?, Set<String>>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.usedAnimationIdsByHref,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'version': Property(
                getValue: (CT_ c) => c.version,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.version, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Package(
    Package context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Package>? getProperty(String key) {
    if (propertyMap<Package>().containsKey(key)) {
      return propertyMap<Package>()[key];
    } else {
      return null;
    }
  }
}

String renderIndex(PackageTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_PackageTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_PackageTemplateData(
  PackageTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_PackageTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends PackageTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Package, CT_>(),
              'bareHref': Property(
                getValue: (CT_ c) => c.bareHref,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.bareHref, ast, r.template, sink, parent: r);
                },
              ),
              'hasHomepage': Property(
                getValue: (CT_ c) => c.hasHomepage,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasHomepage,
              ),
              'homepage': Property(
                getValue: (CT_ c) => c.homepage,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.homepage, ast, r.template, sink, parent: r);
                },
              ),
              'htmlBase': Property(
                getValue: (CT_ c) => c.htmlBase,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlBase, ast, r.template, sink, parent: r);
                },
              ),
              'includeVersion': Property(
                getValue: (CT_ c) => c.includeVersion,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.includeVersion,
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'package': Property(
                getValue: (CT_ c) => c.package,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.package, ast, r.template, sink, parent: r);
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_PackageTemplateData(
    PackageTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<PackageTemplateData>? getProperty(String key) {
    if (propertyMap<PackageTemplateData>().containsKey(key)) {
      return propertyMap<PackageTemplateData>()[key];
    } else {
      return null;
    }
  }
}

String renderError(PackageTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_PackageTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

String renderSearchPage(PackageTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_PackageTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_Parameter(
  Parameter context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Parameter(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Parameter extends RendererBase<Parameter> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Parameter>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_HasNoPage.propertyMap<CT_>(),
              'defaultValue': Property(
                getValue: (CT_ c) => c.defaultValue,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.defaultValue == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.defaultValue!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ParameterElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ParameterElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'FormalParameterElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['FormalParameterElement']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.enclosingElement == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasDefaultValue': Property(
                getValue: (CT_ c) => c.hasDefaultValue,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasDefaultValue,
              ),
              'hashCode': Property(
                getValue: (CT_ c) => c.hashCode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.hashCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'htmlId': Property(
                getValue: (CT_ c) => c.htmlId,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlId, ast, r.template, sink, parent: r);
                },
              ),
              'isCovariant': Property(
                getValue: (CT_ c) => c.isCovariant,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isCovariant,
              ),
              'isNamed': Property(
                getValue: (CT_ c) => c.isNamed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isNamed,
              ),
              'isOptionalPositional': Property(
                getValue: (CT_ c) => c.isOptionalPositional,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isOptionalPositional,
              ),
              'isRequiredNamed': Property(
                getValue: (CT_ c) => c.isRequiredNamed,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isRequiredNamed,
              ),
              'isRequiredPositional': Property(
                getValue: (CT_ c) => c.isRequiredPositional,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isRequiredPositional,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'originalMember': Property(
                getValue: (CT_ c) => c.originalMember,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ParameterMember',
                        ),

                isNullValue: (CT_ c) => c.originalMember == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.originalMember,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ParameterMember']!,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Parameter(
    Parameter context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Parameter>? getProperty(String key) {
    if (propertyMap<Parameter>().containsKey(key)) {
      return propertyMap<Parameter>()[key];
    } else {
      return null;
    }
  }
}

void _render_ParameterizedElementType(
  ParameterizedElementType context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_ParameterizedElementType(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_ParameterizedElementType
    extends RendererBase<ParameterizedElementType> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends ParameterizedElementType>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_DefinedElementType.propertyMap<CT_>(),
              ..._Renderer_Rendered.propertyMap<CT_>(),
              'type': Property(
                getValue: (CT_ c) => c.type,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ParameterizedType',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.type,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ParameterizedType']!,
                  );
                },
              ),
              'typeArguments': Property(
                getValue: (CT_ c) => c.typeArguments,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ElementType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeArguments.map(
                    (e) => _render_ElementType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_ParameterizedElementType(
    ParameterizedElementType context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<ParameterizedElementType>? getProperty(String key) {
    if (propertyMap<ParameterizedElementType>().containsKey(key)) {
      return propertyMap<ParameterizedElementType>()[key];
    } else {
      return null;
    }
  }
}

String renderProperty(PropertyTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_PropertyTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_PropertyTemplateData(
  PropertyTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_PropertyTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_PropertyTemplateData
    extends RendererBase<PropertyTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends PropertyTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Field, CT_>(),
              ..._Renderer_TwoDirectoriesDown.propertyMap<Field, CT_>(),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'navLinksWithGenerics': Property(
                getValue: (CT_ c) => c.navLinksWithGenerics,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinksWithGenerics.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'property': Property(
                getValue: (CT_ c) => c.property,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Field.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Field,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Field(c.property, ast, r.template, sink, parent: r);
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Field.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Field,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Field(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_PropertyTemplateData(
    PropertyTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<PropertyTemplateData>? getProperty(String key) {
    if (propertyMap<PropertyTemplateData>().containsKey(key)) {
      return propertyMap<PropertyTemplateData>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Rendered extends RendererBase<Rendered> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Rendered>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenerics': Property(
                getValue: (CT_ c) => c.nameWithGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenericsPlain': Property(
                getValue: (CT_ c) => c.nameWithGenericsPlain,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenericsPlain,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Rendered(
    Rendered context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Rendered>? getProperty(String key) {
    if (propertyMap<Rendered>().containsKey(key)) {
      return propertyMap<Rendered>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_SourceCode extends RendererBase<SourceCode> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends SourceCode>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'characterLocation': Property(
                getValue: (CT_ c) => c.characterLocation,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'CharacterLocation',
                        ),

                isNullValue: (CT_ c) => c.characterLocation == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.characterLocation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['CharacterLocation']!,
                  );
                },
              ),
              'hasSourceCode': Property(
                getValue: (CT_ c) => c.hasSourceCode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasSourceCode,
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.library == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library!, ast, r.template, sink, parent: r);
                },
              ),
              'modelNode': Property(
                getValue: (CT_ c) => c.modelNode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'ModelNode',
                        ),

                isNullValue: (CT_ c) => c.modelNode == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.modelNode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['ModelNode']!,
                  );
                },
              ),
              'sourceCode': Property(
                getValue: (CT_ c) => c.sourceCode,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.sourceCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_SourceCode(
    SourceCode context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<SourceCode>? getProperty(String key) {
    if (propertyMap<SourceCode>().containsKey(key)) {
      return propertyMap<SourceCode>()[key];
    } else {
      return null;
    }
  }
}

void _render_String(
  String context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_String(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_String extends RendererBase<String> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends String>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'codeUnits': Property(
                getValue: (CT_ c) => c.codeUnits,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<int>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.codeUnits.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['int']!,
                    ),
                  );
                },
              ),
              'hashCode': Property(
                getValue: (CT_ c) => c.hashCode,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.hashCode,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'isEmpty': Property(
                getValue: (CT_ c) => c.isEmpty,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isEmpty,
              ),
              'isNotEmpty': Property(
                getValue: (CT_ c) => c.isNotEmpty,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isNotEmpty,
              ),
              'length': Property(
                getValue: (CT_ c) => c.length,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'int'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.length,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['int']!,
                  );
                },
              ),
              'runes': Property(
                getValue: (CT_ c) => c.runes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Runes'),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.runes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['int']!,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_String(
    String context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<String>? getProperty(String key) {
    if (propertyMap<String>().containsKey(key)) {
      return propertyMap<String>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_TemplateData<T extends Documentable>
    extends RendererBase<TemplateData<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<T extends Documentable, CT_ extends TemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateDataBase.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.aboveSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Documentable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Documentable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Documentable(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TemplateData(
    TemplateData<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TemplateData<T>>? getProperty(String key) {
    if (propertyMap<T, TemplateData<T>>().containsKey(key)) {
      return propertyMap<T, TemplateData<T>>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_TemplateDataBase extends RendererBase<TemplateDataBase> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends TemplateDataBase>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'bareHref': Property(
                getValue: (CT_ c) => c.bareHref,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.bareHref, ast, r.template, sink, parent: r);
                },
              ),
              'customFooter': Property(
                getValue: (CT_ c) => c.customFooter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.customFooter,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'customHeader': Property(
                getValue: (CT_ c) => c.customHeader,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.customHeader,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'customInnerFooter': Property(
                getValue: (CT_ c) => c.customInnerFooter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.customInnerFooter,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'defaultPackage': Property(
                getValue: (CT_ c) => c.defaultPackage,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Package.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Package,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Package(
                    c.defaultPackage,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasFooterVersion': Property(
                getValue: (CT_ c) => c.hasFooterVersion,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasFooterVersion,
              ),
              'hasHomepage': Property(
                getValue: (CT_ c) => c.hasHomepage,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasHomepage,
              ),
              'homepage': Property(
                getValue: (CT_ c) => c.homepage,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.homepage == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.homepage!, ast, r.template, sink, parent: r);
                },
              ),
              'htmlBase': Property(
                getValue: (CT_ c) => c.htmlBase,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlBase, ast, r.template, sink, parent: r);
                },
              ),
              'htmlOptions': Property(
                getValue: (CT_ c) => c.htmlOptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TemplateOptions',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.htmlOptions,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TemplateOptions']!,
                  );
                },
              ),
              'includeVersion': Property(
                getValue: (CT_ c) => c.includeVersion,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.includeVersion,
              ),
              'isParentExtension': Property(
                getValue: (CT_ c) => c.isParentExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isParentExtension,
              ),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'localPackages': Property(
                getValue: (CT_ c) => c.localPackages,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Package>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.localPackages.map(
                    (e) => _render_Package(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'navLinksWithGenerics': Property(
                getValue: (CT_ c) => c.navLinksWithGenerics,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinksWithGenerics.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'parent': Property(
                getValue: (CT_ c) => c.parent,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Documentable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Documentable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.parent == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Documentable(
                    c.parent!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'parentAsExtension': Property(
                getValue: (CT_ c) => c.parentAsExtension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.parentAsExtension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'relCanonicalPrefix': Property(
                getValue: (CT_ c) => c.relCanonicalPrefix,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.relCanonicalPrefix == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.relCanonicalPrefix!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Documentable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as Documentable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Documentable(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
              'useBaseHref': Property(
                getValue: (CT_ c) => c.useBaseHref,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.useBaseHref,
              ),
              'version': Property(
                getValue: (CT_ c) => c.version,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.version, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TemplateDataBase(
    TemplateDataBase context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TemplateDataBase>? getProperty(String key) {
    if (propertyMap<TemplateDataBase>().containsKey(key)) {
      return propertyMap<TemplateDataBase>()[key];
    } else {
      return null;
    }
  }
}

String renderSidebarForContainer<T extends Documentable>(
  TemplateDataWithContainer<T> context,
  Template template,
) {
  var buffer = StringBuffer();
  _render_TemplateDataWithContainer(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_TemplateDataWithContainer<T extends Documentable>(
  TemplateDataWithContainer<T> context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TemplateDataWithContainer(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_TemplateDataWithContainer<T extends Documentable>
    extends RendererBase<TemplateDataWithContainer<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<
    T extends Documentable,
    CT_ extends TemplateDataWithContainer
  >() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'container': Property(
                getValue: (CT_ c) => c.container,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Container.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Container,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Container(
                    c.container,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TemplateDataWithContainer(
    TemplateDataWithContainer<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TemplateDataWithContainer<T>>? getProperty(String key) {
    if (propertyMap<T, TemplateDataWithContainer<T>>().containsKey(key)) {
      return propertyMap<T, TemplateDataWithContainer<T>>()[key];
    } else {
      return null;
    }
  }
}

String renderSidebarForLibrary<T extends Documentable>(
  TemplateDataWithLibrary<T> context,
  Template template,
) {
  var buffer = StringBuffer();
  _render_TemplateDataWithLibrary(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_TemplateDataWithLibrary<T extends Documentable>(
  TemplateDataWithLibrary<T> context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TemplateDataWithLibrary(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_TemplateDataWithLibrary<T extends Documentable>
    extends RendererBase<TemplateDataWithLibrary<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<T extends Documentable, CT_ extends TemplateDataWithLibrary>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_Object.propertyMap<CT_>(),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TemplateDataWithLibrary(
    TemplateDataWithLibrary<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TemplateDataWithLibrary<T>>? getProperty(String key) {
    if (propertyMap<T, TemplateDataWithLibrary<T>>().containsKey(key)) {
      return propertyMap<T, TemplateDataWithLibrary<T>>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_TopLevelContainer extends RendererBase<TopLevelContainer> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends TopLevelContainer>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'classes': Property(
                getValue: (CT_ c) => c.classes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.classes.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'constants': Property(
                getValue: (CT_ c) => c.constants,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.constants.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'enums': Property(
                getValue: (CT_ c) => c.enums,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Enum>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.enums.map(
                    (e) => _render_Enum(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'exceptions': Property(
                getValue: (CT_ c) => c.exceptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.exceptions.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'extensionTypes': Property(
                getValue: (CT_ c) => c.extensionTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ExtensionType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensionTypes.map(
                    (e) => _render_ExtensionType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'extensions': Property(
                getValue: (CT_ c) => c.extensions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Extension>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.extensions.map(
                    (e) =>
                        _render_Extension(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'functions': Property(
                getValue: (CT_ c) => c.functions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<ModelFunction>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.functions.map(
                    (e) => _render_ModelFunction(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'hasPublicClasses': Property(
                getValue: (CT_ c) => c.hasPublicClasses,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicClasses,
              ),
              'hasPublicConstants': Property(
                getValue: (CT_ c) => c.hasPublicConstants,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicConstants,
              ),
              'hasPublicEnums': Property(
                getValue: (CT_ c) => c.hasPublicEnums,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicEnums,
              ),
              'hasPublicExceptions': Property(
                getValue: (CT_ c) => c.hasPublicExceptions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicExceptions,
              ),
              'hasPublicExtensionTypes': Property(
                getValue: (CT_ c) => c.hasPublicExtensionTypes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicExtensionTypes,
              ),
              'hasPublicExtensions': Property(
                getValue: (CT_ c) => c.hasPublicExtensions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicExtensions,
              ),
              'hasPublicFunctions': Property(
                getValue: (CT_ c) => c.hasPublicFunctions,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicFunctions,
              ),
              'hasPublicMixins': Property(
                getValue: (CT_ c) => c.hasPublicMixins,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicMixins,
              ),
              'hasPublicProperties': Property(
                getValue: (CT_ c) => c.hasPublicProperties,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicProperties,
              ),
              'hasPublicTypedefs': Property(
                getValue: (CT_ c) => c.hasPublicTypedefs,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasPublicTypedefs,
              ),
              'mixins': Property(
                getValue: (CT_ c) => c.mixins,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Mixin>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.mixins.map(
                    (e) => _render_Mixin(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'properties': Property(
                getValue: (CT_ c) => c.properties,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.properties.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicClassesSorted': Property(
                getValue: (CT_ c) => c.publicClassesSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Container>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicClassesSorted.map(
                    (e) =>
                        _render_Container(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicConstantsSorted': Property(
                getValue: (CT_ c) => c.publicConstantsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicConstantsSorted.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicEnumsSorted': Property(
                getValue: (CT_ c) => c.publicEnumsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Enum>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicEnumsSorted.map(
                    (e) => _render_Enum(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicExceptionsSorted': Property(
                getValue: (CT_ c) => c.publicExceptionsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Class>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicExceptionsSorted.map(
                    (e) => _render_Class(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicExtensionTypesSorted': Property(
                getValue: (CT_ c) => c.publicExtensionTypesSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ExtensionType>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicExtensionTypesSorted.map(
                    (e) => _render_ExtensionType(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicExtensionsSorted': Property(
                getValue: (CT_ c) => c.publicExtensionsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Extension>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicExtensionsSorted.map(
                    (e) =>
                        _render_Extension(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicFunctionsSorted': Property(
                getValue: (CT_ c) => c.publicFunctionsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<ModelFunctionTyped>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicFunctionsSorted.map(
                    (e) => _render_ModelFunctionTyped(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicMixinsSorted': Property(
                getValue: (CT_ c) => c.publicMixinsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Mixin>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicMixinsSorted.map(
                    (e) => _render_Mixin(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'publicPropertiesSorted': Property(
                getValue: (CT_ c) => c.publicPropertiesSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TopLevelVariable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicPropertiesSorted.map(
                    (e) => _render_TopLevelVariable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'publicTypedefsSorted': Property(
                getValue: (CT_ c) => c.publicTypedefsSorted,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Typedef>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.publicTypedefsSorted.map(
                    (e) => _render_Typedef(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
              'typedefs': Property(
                getValue: (CT_ c) => c.typedefs,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<Typedef>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typedefs.map(
                    (e) => _render_Typedef(e, ast, r.template, sink, parent: r),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TopLevelContainer(
    TopLevelContainer context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TopLevelContainer>? getProperty(String key) {
    if (propertyMap<TopLevelContainer>().containsKey(key)) {
      return propertyMap<TopLevelContainer>()[key];
    } else {
      return null;
    }
  }
}

String renderTopLevelProperty(
  TopLevelPropertyTemplateData context,
  Template template,
) {
  var buffer = StringBuffer();
  _render_TopLevelPropertyTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_TopLevelPropertyTemplateData(
  TopLevelPropertyTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TopLevelPropertyTemplateData(
    context,
    parent,
    template,
    sink,
  );
  renderer.renderBlock(ast);
}

class _Renderer_TopLevelPropertyTemplateData
    extends RendererBase<TopLevelPropertyTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends TopLevelPropertyTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<TopLevelVariable, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<
                TopLevelVariable,
                CT_
              >(),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'property': Property(
                getValue: (CT_ c) => c.property,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_TopLevelVariable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as TopLevelVariable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_TopLevelVariable(
                    c.property,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_TopLevelVariable.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as TopLevelVariable,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_TopLevelVariable(
                    c.self,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TopLevelPropertyTemplateData(
    TopLevelPropertyTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TopLevelPropertyTemplateData>? getProperty(String key) {
    if (propertyMap<TopLevelPropertyTemplateData>().containsKey(key)) {
      return propertyMap<TopLevelPropertyTemplateData>()[key];
    } else {
      return null;
    }
  }
}

void _render_TopLevelVariable(
  TopLevelVariable context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TopLevelVariable(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_TopLevelVariable extends RendererBase<TopLevelVariable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends TopLevelVariable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_GetterSetterCombo.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_GetterSetterCombo.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'attributes': Property(
                getValue: (CT_ c) => c.attributes,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Set<Attribute>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.attributes.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['Attribute']!,
                    ),
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'documentation': Property(
                getValue: (CT_ c) => c.documentation,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.documentation,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TopLevelVariableElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TopLevelVariableElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TopLevelVariableElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TopLevelVariableElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'enclosingExtension': Property(
                getValue: (CT_ c) => c.enclosingExtension,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Extension.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Extension,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Extension(
                    c.enclosingExtension,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'getter': Property(
                getValue: (CT_ c) => c.getter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Accessor.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Accessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.getter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Accessor(c.getter!, ast, r.template, sink, parent: r);
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isConst': Property(
                getValue: (CT_ c) => c.isConst,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isConst,
              ),
              'isFinal': Property(
                getValue: (CT_ c) => c.isFinal,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isFinal,
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'isLate': Property(
                getValue: (CT_ c) => c.isLate,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isLate,
              ),
              'isProvidedByExtension': Property(
                getValue: (CT_ c) => c.isProvidedByExtension,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isProvidedByExtension,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'setter': Property(
                getValue: (CT_ c) => c.setter,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Accessor.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Accessor,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.setter == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Accessor(c.setter!, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TopLevelVariable(
    TopLevelVariable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TopLevelVariable>? getProperty(String key) {
    if (propertyMap<TopLevelVariable>().containsKey(key)) {
      return propertyMap<TopLevelVariable>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_TwoDirectoriesDown<T extends Documentable>
    extends RendererBase<TwoDirectoriesDown<T>> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<T extends Documentable, CT_ extends TwoDirectoriesDown>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'htmlBase': Property(
                getValue: (CT_ c) => c.htmlBase,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.htmlBase, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TwoDirectoriesDown(
    TwoDirectoriesDown<T> context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TwoDirectoriesDown<T>>? getProperty(String key) {
    if (propertyMap<T, TwoDirectoriesDown<T>>().containsKey(key)) {
      return propertyMap<T, TwoDirectoriesDown<T>>()[key];
    } else {
      return null;
    }
  }
}

void _render_TypeParameter(
  TypeParameter context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TypeParameter(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_TypeParameter extends RendererBase<TypeParameter> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends TypeParameter>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_HasNoPage.propertyMap<CT_>(),
              'boundType': Property(
                getValue: (CT_ c) => c.boundType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.boundType == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.boundType!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TypeParameterElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TypeParameterElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TypeParameterElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TypeParameterElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ModelElement.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ModelElement,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ModelElement(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasParameters': Property(
                getValue: (CT_ c) => c.hasParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasParameters,
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'linkedName': Property(
                getValue: (CT_ c) => c.linkedName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'name': Property(
                getValue: (CT_ c) => c.name,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.name, ast, r.template, sink, parent: r);
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceName': Property(
                getValue: (CT_ c) => c.referenceName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.referenceName,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TypeParameter(
    TypeParameter context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TypeParameter>? getProperty(String key) {
    if (propertyMap<TypeParameter>().containsKey(key)) {
      return propertyMap<TypeParameter>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_TypeParameters extends RendererBase<TypeParameters> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends TypeParameters>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'genericParameters': Property(
                getValue: (CT_ c) => c.genericParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.genericParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'hasGenericParameters': Property(
                getValue: (CT_ c) => c.hasGenericParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.hasGenericParameters,
              ),
              'linkedGenericParameters': Property(
                getValue: (CT_ c) => c.linkedGenericParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedGenericParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenerics': Property(
                getValue: (CT_ c) => c.nameWithGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithLinkedGenerics': Property(
                getValue: (CT_ c) => c.nameWithLinkedGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithLinkedGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TypeParameters(
    TypeParameters context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TypeParameters>? getProperty(String key) {
    if (propertyMap<TypeParameters>().containsKey(key)) {
      return propertyMap<TypeParameters>()[key];
    } else {
      return null;
    }
  }
}

void _render_Typedef(
  Typedef context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_Typedef(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_Typedef extends RendererBase<Typedef> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Typedef>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_ModelElement.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              ..._Renderer_TypeParameters.propertyMap<CT_>(),
              ..._Renderer_Categorization.propertyMap<CT_>(),
              'aboveSidebarPath': Property(
                getValue: (CT_ c) => c.aboveSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.aboveSidebarPath,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'aliasedType': Property(
                getValue: (CT_ c) => c.aliasedType,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'DartType',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.aliasedType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['DartType']!,
                  );
                },
              ),
              'asCallable': Property(
                getValue: (CT_ c) => c.asCallable,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_FunctionTypedef.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as FunctionTypedef,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_FunctionTypedef(
                    c.asCallable,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'belowSidebarPath': Property(
                getValue: (CT_ c) => c.belowSidebarPath,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.belowSidebarPath == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.belowSidebarPath!,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TypeAliasElement',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TypeAliasElement']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'TypeAliasElement2',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['TypeAliasElement2']!,
                  );
                },
              ),
              'enclosingElement': Property(
                getValue: (CT_ c) => c.enclosingElement,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(
                    c.enclosingElement,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'fileName': Property(
                getValue: (CT_ c) => c.fileName,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.fileName, ast, r.template, sink, parent: r);
                },
              ),
              'genericParameters': Property(
                getValue: (CT_ c) => c.genericParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.genericParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'href': Property(
                getValue: (CT_ c) => c.href,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => c.href == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.href!, ast, r.template, sink, parent: r);
                },
              ),
              'isInherited': Property(
                getValue: (CT_ c) => c.isInherited,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'bool'),

                getBool: (CT_ c) => c.isInherited,
              ),
              'kind': Property(
                getValue: (CT_ c) => c.kind,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Kind'),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.kind,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Kind']!,
                  );
                },
              ),
              'linkedGenericParameters': Property(
                getValue: (CT_ c) => c.linkedGenericParameters,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.linkedGenericParameters,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'modelType': Property(
                getValue: (CT_ c) => c.modelType,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_ElementType.propertyMap()
                      .getValue(name);
                  return nextProperty.renderVariable(
                    self.getValue(c) as ElementType,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_ElementType(
                    c.modelType,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'nameWithGenerics': Property(
                getValue: (CT_ c) => c.nameWithGenerics,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.nameWithGenerics,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'referenceChildren': Property(
                getValue: (CT_ c) => c.referenceChildren,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Map<String, CommentReferable>',
                        ),

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.referenceChildren,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Map']!,
                  );
                },
              ),
              'referenceParents': Property(
                getValue: (CT_ c) => c.referenceParents,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Iterable<CommentReferable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.referenceParents.map(
                    (e) => renderSimple(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                      getters: _invisibleGetters['CommentReferable']!,
                    ),
                  );
                },
              ),
              'typeParameters': Property(
                getValue: (CT_ c) => c.typeParameters,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<TypeParameter>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.typeParameters.map(
                    (e) => _render_TypeParameter(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Typedef(
    Typedef context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Typedef>? getProperty(String key) {
    if (propertyMap<Typedef>().containsKey(key)) {
      return propertyMap<Typedef>()[key];
    } else {
      return null;
    }
  }
}

String renderTypedef(TypedefTemplateData context, Template template) {
  var buffer = StringBuffer();
  _render_TypedefTemplateData(context, template.ast, template, buffer);
  return buffer.toString();
}

void _render_TypedefTemplateData(
  TypedefTemplateData context,
  List<MustachioNode> ast,
  Template template,
  StringSink sink, {
  RendererBase<Object>? parent,
}) {
  var renderer = _Renderer_TypedefTemplateData(context, parent, template, sink);
  renderer.renderBlock(ast);
}

class _Renderer_TypedefTemplateData extends RendererBase<TypedefTemplateData> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>>
  propertyMap<CT_ extends TypedefTemplateData>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              ..._Renderer_TemplateData.propertyMap<Typedef, CT_>(),
              ..._Renderer_OneDirectoryDown.propertyMap<Typedef, CT_>(),
              'layoutTitle': Property(
                getValue: (CT_ c) => c.layoutTitle,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.layoutTitle,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'library': Property(
                getValue: (CT_ c) => c.library,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Library.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Library,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Library(c.library, ast, r.template, sink, parent: r);
                },
              ),
              'metaDescription': Property(
                getValue: (CT_ c) => c.metaDescription,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(
                    c.metaDescription,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                  );
                },
              ),
              'navLinks': Property(
                getValue: (CT_ c) => c.navLinks,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'List<Documentable>',
                        ),

                renderIterable: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  return c.navLinks.map(
                    (e) => _render_Documentable(
                      e,
                      ast,
                      r.template,
                      sink,
                      parent: r,
                    ),
                  );
                },
              ),
              'self': Property(
                getValue: (CT_ c) => c.self,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Typedef.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Typedef,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Typedef(c.self, ast, r.template, sink, parent: r);
                },
              ),
              'title': Property(
                getValue: (CT_ c) => c.title,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_String.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as String,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_String(c.title, ast, r.template, sink, parent: r);
                },
              ),
              'typeDef': Property(
                getValue: (CT_ c) => c.typeDef,
                renderVariable: (
                  CT_ c,
                  Property<CT_> self,
                  List<String> remainingNames,
                ) {
                  if (remainingNames.isEmpty) {
                    return self.getValue(c).toString();
                  }
                  var name = remainingNames.first;
                  var nextProperty = _Renderer_Typedef.propertyMap().getValue(
                    name,
                  );
                  return nextProperty.renderVariable(
                    self.getValue(c) as Typedef,
                    nextProperty,
                    [...remainingNames.skip(1)],
                  );
                },

                isNullValue: (CT_ c) => false,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  _render_Typedef(c.typeDef, ast, r.template, sink, parent: r);
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_TypedefTemplateData(
    TypedefTemplateData context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<TypedefTemplateData>? getProperty(String key) {
    if (propertyMap<TypedefTemplateData>().containsKey(key)) {
      return propertyMap<TypedefTemplateData>()[key];
    } else {
      return null;
    }
  }
}

class _Renderer_Warnable extends RendererBase<Warnable> {
  static final Map<Type, Object> _propertyMapCache = {};
  static Map<String, Property<CT_>> propertyMap<CT_ extends Warnable>() =>
      _propertyMapCache.putIfAbsent(
            CT_,
            () => {
              'element': Property(
                getValue: (CT_ c) => c.element,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(c, remainingNames, 'Element'),

                isNullValue: (CT_ c) => c.element == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element']!,
                  );
                },
              ),
              'element2': Property(
                getValue: (CT_ c) => c.element2,
                renderVariable:
                    (CT_ c, Property<CT_> self, List<String> remainingNames) =>
                        self.renderSimpleVariable(
                          c,
                          remainingNames,
                          'Element2',
                        ),

                isNullValue: (CT_ c) => c.element2 == null,

                renderValue: (
                  CT_ c,
                  RendererBase<CT_> r,
                  List<MustachioNode> ast,
                  StringSink sink,
                ) {
                  renderSimple(
                    c.element2,
                    ast,
                    r.template,
                    sink,
                    parent: r,
                    getters: _invisibleGetters['Element2']!,
                  );
                },
              ),
            },
          )
          as Map<String, Property<CT_>>;

  _Renderer_Warnable(
    Warnable context,
    RendererBase<Object>? parent,
    Template template,
    StringSink sink,
  ) : super(context, parent, template, sink);

  @override
  Property<Warnable>? getProperty(String key) {
    if (propertyMap<Warnable>().containsKey(key)) {
      return propertyMap<Warnable>()[key];
    } else {
      return null;
    }
  }
}

const _invisibleGetters = {
  'Attribute': {
    'cssClassName',
    'hashCode',
    'linkedName',
    'linkedNameWithParameters',
    'name',
    'runtimeType',
    'sortGroup',
  },
  'CharacterLocation': {
    'columnNumber',
    'hashCode',
    'lineNumber',
    'runtimeType',
  },
  'ClassElement': {
    'augmentation',
    'augmentationTarget',
    'augmented',
    'hasNonFinalField',
    'hashCode',
    'isAbstract',
    'isBase',
    'isConstructable',
    'isDartCoreEnum',
    'isDartCoreObject',
    'isExhaustive',
    'isFinal',
    'isInterface',
    'isMixinApplication',
    'isMixinClass',
    'isSealed',
    'isValidMixin',
    'runtimeType',
  },
  'ClassElement2': {
    'firstFragment',
    'fragments',
    'hasNonFinalField',
    'hashCode',
    'isAbstract',
    'isBase',
    'isConstructable',
    'isDartCoreEnum',
    'isDartCoreObject',
    'isExhaustive',
    'isFinal',
    'isInterface',
    'isMacro',
    'isMixinApplication',
    'isMixinClass',
    'isSealed',
    'isValidMixin',
    'runtimeType',
  },
  'CommentReferable': {
    'definingCommentReferable',
    'href',
    'library',
    'referenceChildren',
    'referenceGrandparentOverrides',
    'referenceName',
    'referenceParents',
    'scope',
  },
  'Constructable': {
    'constructors',
    'extraReferenceChildren',
    'hasPublicConstructors',
    'publicConstructorsSorted',
  },
  'ConstructorElement': {
    'augmentation',
    'augmentationTarget',
    'declaration',
    'displayName',
    'enclosingElement3',
    'hashCode',
    'isConst',
    'isDefaultConstructor',
    'isFactory',
    'isGenerative',
    'name',
    'nameEnd',
    'periodOffset',
    'redirectedConstructor',
    'returnType',
    'runtimeType',
    'superConstructor',
  },
  'ConstructorElement2': {
    'baseElement',
    'enclosingElement2',
    'firstFragment',
    'fragments',
    'hashCode',
    'isConst',
    'isDefaultConstructor',
    'isFactory',
    'isGenerative',
    'name3',
    'redirectedConstructor2',
    'returnType',
    'runtimeType',
    'superConstructor2',
  },
  'ContainerModifier': {
    'displayName',
    'hashCode',
    'hideIfPresent',
    'name',
    'order',
    'runtimeType',
  },
  'Context': {'current', 'hashCode', 'runtimeType', 'separator', 'style'},
  'DartType': {
    'alias',
    'element',
    'element3',
    'extensionTypeErasure',
    'hashCode',
    'isBottom',
    'isDartAsyncFuture',
    'isDartAsyncFutureOr',
    'isDartAsyncStream',
    'isDartCoreBool',
    'isDartCoreDouble',
    'isDartCoreEnum',
    'isDartCoreFunction',
    'isDartCoreInt',
    'isDartCoreIterable',
    'isDartCoreList',
    'isDartCoreMap',
    'isDartCoreNull',
    'isDartCoreNum',
    'isDartCoreObject',
    'isDartCoreRecord',
    'isDartCoreSet',
    'isDartCoreString',
    'isDartCoreSymbol',
    'isDartCoreType',
    'name',
    'nullabilitySuffix',
    'runtimeType',
  },
  'DartdocOptionContext': {
    'allowTools',
    'ambiguousReexportScorerMinConfidence',
    'autoIncludeDependencies',
    'categories',
    'categoryOrder',
    'context',
    'exclude',
    'excludeFooterVersion',
    'flutterRoot',
    'hashCode',
    'include',
    'includeExternal',
    'includeSource',
    'injectHtml',
    'inputDir',
    'linkToRemote',
    'linkToUrl',
    'maxFileCount',
    'maxTotalSize',
    'nodoc',
    'optionSet',
    'output',
    'packageMeta',
    'packageOrder',
    'resourceProvider',
    'runtimeType',
    'sanitizeHtml',
    'sdkDir',
    'sdkDocs',
    'showStats',
    'showUndocumentedCategories',
    'tools',
    'topLevelPackageMeta',
    'useBaseHref',
    'useCategories',
    'validateLinks',
  },
  'DocumentLocation': {'hashCode', 'index', 'runtimeType'},
  'Documentation': {'asHtml', 'asOneLiner', 'hashCode', 'runtimeType'},
  'DocumentationComment': {
    'documentationAsHtml',
    'documentationComment',
    'documentationFrom',
    'documentationLocal',
    'element2',
    'elementDocumentation',
    'hasDocumentationComment',
    'hasNodoc',
    'needsPrecache',
    'pathContext',
    'qualifiedName',
    'sourceFileName',
  },
  'Element': {
    'children',
    'context',
    'declaration',
    'displayName',
    'documentationComment',
    'enclosingElement3',
    'hasAlwaysThrows',
    'hasDeprecated',
    'hasDoNotStore',
    'hasDoNotSubmit',
    'hasFactory',
    'hasImmutable',
    'hasInternal',
    'hasIsTest',
    'hasIsTestGroup',
    'hasJS',
    'hasLiteral',
    'hasMustBeConst',
    'hasMustBeOverridden',
    'hasMustCallSuper',
    'hasNonVirtual',
    'hasOptionalTypeArgs',
    'hasOverride',
    'hasProtected',
    'hasRedeclare',
    'hasReopen',
    'hasRequired',
    'hasSealed',
    'hasUseResult',
    'hasVisibleForOverriding',
    'hasVisibleForTemplate',
    'hasVisibleForTesting',
    'hasVisibleOutsideTemplate',
    'hashCode',
    'id',
    'isPrivate',
    'isPublic',
    'isSynthetic',
    'kind',
    'library',
    'location',
    'metadata',
    'name',
    'nameLength',
    'nameOffset',
    'nonSynthetic',
    'runtimeType',
    'session',
    'sinceSdkVersion',
    'source',
  },
  'Element2': {
    'baseElement',
    'children2',
    'displayName',
    'enclosingElement2',
    'firstFragment',
    'fragments',
    'hashCode',
    'id',
    'isPrivate',
    'isPublic',
    'isSynthetic',
    'kind',
    'library2',
    'lookupName',
    'name3',
    'nonSynthetic2',
    'runtimeType',
    'session',
  },
  'EnumElement': {
    'augmentation',
    'augmentationTarget',
    'augmented',
    'hashCode',
    'runtimeType',
  },
  'EnumElement2': {
    'constants2',
    'firstFragment',
    'fragments',
    'hashCode',
    'runtimeType',
  },
  'ExecutableMember': {
    'augmentationSubstitution',
    'children',
    'children2',
    'context',
    'declaration',
    'displayName',
    'documentationComment',
    'enclosingElement2',
    'enclosingElement3',
    'formalParameters',
    'fragments',
    'hasAlwaysThrows',
    'hasDeprecated',
    'hasDoNotStore',
    'hasDoNotSubmit',
    'hasFactory',
    'hasImmutable',
    'hasImplicitReturnType',
    'hasInternal',
    'hasIsTest',
    'hasIsTestGroup',
    'hasJS',
    'hasLiteral',
    'hasMustBeConst',
    'hasMustBeOverridden',
    'hasMustCallSuper',
    'hasNonVirtual',
    'hasOptionalTypeArgs',
    'hasOverride',
    'hasProtected',
    'hasRedeclare',
    'hasReopen',
    'hasRequired',
    'hasSealed',
    'hasUseResult',
    'hasVisibleForOverriding',
    'hasVisibleForTemplate',
    'hasVisibleForTesting',
    'hasVisibleOutsideTemplate',
    'hashCode',
    'id',
    'isAbstract',
    'isAsynchronous',
    'isAugmentation',
    'isExtensionTypeMember',
    'isExternal',
    'isGenerator',
    'isOperator',
    'isPrivate',
    'isPublic',
    'isSimplyBounded',
    'isStatic',
    'isSynchronous',
    'isSynthetic',
    'kind',
    'library',
    'library2',
    'librarySource',
    'location',
    'metadata',
    'metadata2',
    'name',
    'nameLength',
    'nameOffset',
    'nonSynthetic',
    'nonSynthetic2',
    'parameters',
    'returnType',
    'runtimeType',
    'session',
    'sinceSdkVersion',
    'substitution',
    'type',
    'typeParameters',
    'typeParameters2',
  },
  'ExtensionElement': {
    'augmentation',
    'augmentationTarget',
    'augmented',
    'extendedType',
    'hashCode',
    'runtimeType',
  },
  'ExtensionElement2': {
    'extendedType',
    'firstFragment',
    'fragments',
    'hashCode',
    'runtimeType',
  },
  'ExtensionTypeElement': {
    'augmentation',
    'augmentationTarget',
    'augmented',
    'hashCode',
    'primaryConstructor',
    'representation',
    'runtimeType',
    'typeErasure',
  },
  'ExtensionTypeElement2': {
    'firstFragment',
    'fragments',
    'hashCode',
    'primaryConstructor2',
    'representation2',
    'runtimeType',
    'typeErasure',
  },
  'FieldElement': {
    'augmentation',
    'augmentationTarget',
    'declaration',
    'hashCode',
    'isAbstract',
    'isCovariant',
    'isEnumConstant',
    'isExternal',
    'isPromotable',
    'isStatic',
    'runtimeType',
  },
  'FieldElement2': {
    'baseElement',
    'enclosingElement2',
    'firstFragment',
    'fragments',
    'hashCode',
    'isAbstract',
    'isCovariant',
    'isEnumConstant',
    'isExternal',
    'isPromotable',
    'runtimeType',
  },
  'File': {'hashCode', 'lengthSync', 'modificationStamp', 'runtimeType'},
  'FormalParameterElement': {
    'baseElement',
    'defaultValueCode',
    'firstFragment',
    'formalParameters',
    'fragments',
    'hasDefaultValue',
    'hashCode',
    'isCovariant',
    'isInitializingFormal',
    'isNamed',
    'isOptional',
    'isOptionalNamed',
    'isOptionalPositional',
    'isPositional',
    'isRequired',
    'isRequiredNamed',
    'isRequiredPositional',
    'isSuperFormal',
    'runtimeType',
    'typeParameters2',
  },
  'FunctionType': {
    'element',
    'formalParameters',
    'hashCode',
    'namedParameterTypes',
    'normalParameterTypes',
    'optionalParameterTypes',
    'parameters',
    'positionalParameterTypes',
    'requiredPositionalParameterCount',
    'returnType',
    'runtimeType',
    'sortedNamedParameters',
    'typeFormals',
    'typeParameters',
  },
  'FunctionTypedElement': {
    'hashCode',
    'parameters',
    'returnType',
    'runtimeType',
    'type',
  },
  'FunctionTypedElement2': {
    'firstFragment',
    'formalParameters',
    'fragments',
    'hashCode',
    'returnType',
    'runtimeType',
    'type',
  },
  'GetterSetterCombo': {
    'allAccessors',
    'annotations',
    'arrow',
    'characterLocation',
    'comboAttributes',
    'constantValue',
    'constantValueBase',
    'constantValueTruncated',
    'documentationComment',
    'documentationFrom',
    'enclosingElement',
    'fileName',
    'getter',
    'getterSetterBothAvailable',
    'hasAccessorsWithDocs',
    'hasConstantValueForDisplay',
    'hasDocumentationComment',
    'hasExplicitGetter',
    'hasExplicitSetter',
    'hasGetter',
    'hasGetterOrSetter',
    'hasParameters',
    'hasPublicGetter',
    'hasPublicGetterNoSetter',
    'hasPublicSetter',
    'hasSetter',
    'isCallable',
    'isInherited',
    'isPublic',
    'linkedParamsNoMetadata',
    'modelType',
    'name',
    'oneLineDoc',
    'parameters',
    'readOnly',
    'readWrite',
    'referenceChildren',
    'setter',
    'writeOnly',
  },
  'Inheritable': {
    'attributes',
    'canonicalLibrary',
    'canonicalModelElement',
    'isCovariant',
    'isInherited',
    'isOverride',
    'overriddenDepth',
    'overriddenElement',
  },
  'InterfaceElement': {
    'allSupertypes',
    'augmentationTarget',
    'augmented',
    'constructors',
    'hashCode',
    'interfaces',
    'mixins',
    'name',
    'runtimeType',
    'supertype',
    'thisType',
    'unnamedConstructor',
  },
  'InterfaceElement2': {
    'allSupertypes',
    'constructors2',
    'firstFragment',
    'fragments',
    'hashCode',
    'interfaces',
    'mixins',
    'runtimeType',
    'supertype',
    'thisType',
    'unnamedConstructor2',
  },
  'Iterable': {
    'first',
    'hashCode',
    'isEmpty',
    'isNotEmpty',
    'iterator',
    'last',
    'length',
    'runtimeType',
    'single',
  },
  'Kind': {'hashCode', 'index', 'runtimeType'},
  'LibraryElement': {
    'definingCompilationUnit',
    'enclosingElement3',
    'entryPoint',
    'exportNamespace',
    'exportedLibraries',
    'featureSet',
    'hashCode',
    'identifier',
    'importedLibraries',
    'isDartAsync',
    'isDartCore',
    'isInSdk',
    'languageVersion',
    'library',
    'loadLibraryFunction',
    'name',
    'publicNamespace',
    'runtimeType',
    'session',
    'topLevelElements',
    'typeProvider',
    'typeSystem',
    'units',
  },
  'LibraryElement2': {
    'classes',
    'entryPoint2',
    'enums',
    'exportNamespace',
    'exportedLibraries2',
    'extensionTypes',
    'extensions',
    'featureSet',
    'firstFragment',
    'fragments',
    'getters',
    'hashCode',
    'identifier',
    'isDartAsync',
    'isDartCore',
    'isInSdk',
    'languageVersion',
    'library2',
    'loadLibraryFunction2',
    'mixins',
    'publicNamespace',
    'runtimeType',
    'session',
    'setters',
    'topLevelFunctions',
    'topLevelVariables',
    'typeAliases',
    'typeProvider',
    'typeSystem',
    'uri',
  },
  'LibraryFragment': {
    'accessibleExtensions2',
    'classes2',
    'element',
    'enclosingFragment',
    'enums2',
    'extensionTypes2',
    'extensions2',
    'functions2',
    'getters',
    'hashCode',
    'importedLibraries2',
    'libraryExports2',
    'libraryImports2',
    'lineInfo',
    'mixins2',
    'nextFragment',
    'partIncludes',
    'prefixes',
    'previousFragment',
    'runtimeType',
    'scope',
    'setters',
    'source',
    'topLevelVariables2',
    'typeAliases2',
  },
  'List': {'hashCode', 'length', 'reversed', 'runtimeType'},
  'Locatable': {
    'documentationFrom',
    'documentationIsLocal',
    'fullyQualifiedName',
    'href',
    'isCanonical',
    'location',
  },
  'Map': {
    'entries',
    'hashCode',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'length',
    'runtimeType',
    'values',
  },
  'Member': {
    'augmentationSubstitution',
    'children',
    'context',
    'declaration',
    'displayName',
    'documentationComment',
    'enclosingElement3',
    'hasAlwaysThrows',
    'hasDeprecated',
    'hasDoNotStore',
    'hasDoNotSubmit',
    'hasFactory',
    'hasImmutable',
    'hasInternal',
    'hasIsTest',
    'hasIsTestGroup',
    'hasJS',
    'hasLiteral',
    'hasMustBeConst',
    'hasMustBeOverridden',
    'hasMustCallSuper',
    'hasNonVirtual',
    'hasOptionalTypeArgs',
    'hasOverride',
    'hasProtected',
    'hasRedeclare',
    'hasReopen',
    'hasRequired',
    'hasSealed',
    'hasUseResult',
    'hasVisibleForOverriding',
    'hasVisibleForTemplate',
    'hasVisibleForTesting',
    'hasVisibleOutsideTemplate',
    'hashCode',
    'id',
    'isPrivate',
    'isPublic',
    'isSynthetic',
    'kind',
    'library',
    'librarySource',
    'location',
    'metadata',
    'metadata2',
    'name',
    'nameLength',
    'nameOffset',
    'nonSynthetic',
    'runtimeType',
    'session',
    'sinceSdkVersion',
    'substitution',
  },
  'MethodElement': {
    'augmentation',
    'augmentationTarget',
    'declaration',
    'hashCode',
    'runtimeType',
  },
  'MethodElement2': {
    'baseElement',
    'firstFragment',
    'fragments',
    'hashCode',
    'isOperator',
    'runtimeType',
  },
  'MixinElement': {
    'augmentation',
    'augmentationTarget',
    'augmented',
    'hashCode',
    'isBase',
    'runtimeType',
    'superclassConstraints',
  },
  'MixinElement2': {
    'firstFragment',
    'fragments',
    'hashCode',
    'isBase',
    'runtimeType',
    'superclassConstraints',
  },
  'ModelNode': {'commentData', 'hashCode', 'runtimeType', 'sourceCode'},
  'PackageGraph': {
    'allConstructedModelElements',
    'allExtensionsAdded',
    'allHrefs',
    'allImplementersAdded',
    'allInheritableElements',
    'allLibrariesAdded',
    'breadcrumbName',
    'config',
    'dartCoreObject',
    'defaultPackage',
    'defaultPackageName',
    'displayName',
    'extensions',
    'hasEmbedderSdk',
    'hasFooterVersion',
    'hashCode',
    'implementers',
    'inheritanceManager',
    'libraries',
    'libraryCount',
    'libraryExports',
    'libraryExports2',
    'localPackages',
    'localPublicLibraries',
    'name',
    'objectClass',
    'packageGraph',
    'packageMap',
    'packageMeta',
    'packageMetaProvider',
    'packageWarningCounter',
    'packages',
    'publicLibraries',
    'publicPackages',
    'referenceChildren',
    'referenceParents',
    'resourceProvider',
    'runtimeType',
    'sdkLibrarySources',
  },
  'PackageMeta': {
    'dir',
    'hashCode',
    'homepage',
    'hostedAt',
    'isSdk',
    'isValid',
    'name',
    'requiresFlutter',
    'resolvedDir',
    'resourceProvider',
    'runtimeType',
    'version',
  },
  'ParameterElement': {
    'declaration',
    'defaultValueCode',
    'element',
    'hasDefaultValue',
    'hashCode',
    'isCovariant',
    'isInitializingFormal',
    'isNamed',
    'isOptional',
    'isOptionalNamed',
    'isOptionalPositional',
    'isPositional',
    'isRequired',
    'isRequiredNamed',
    'isRequiredPositional',
    'isSuperFormal',
    'name',
    'parameterKind',
    'parameters',
    'runtimeType',
    'typeParameters',
  },
  'ParameterMember': {
    'augmentationSubstitution',
    'baseElement',
    'children',
    'children2',
    'context',
    'declaration',
    'defaultValueCode',
    'displayName',
    'documentationComment',
    'element',
    'enclosingElement2',
    'enclosingElement3',
    'firstFragment',
    'formalParameters',
    'fragments',
    'hasAlwaysThrows',
    'hasDefaultValue',
    'hasDeprecated',
    'hasDoNotStore',
    'hasDoNotSubmit',
    'hasFactory',
    'hasImmutable',
    'hasImplicitType',
    'hasInternal',
    'hasIsTest',
    'hasIsTestGroup',
    'hasJS',
    'hasLiteral',
    'hasMustBeConst',
    'hasMustBeOverridden',
    'hasMustCallSuper',
    'hasNonVirtual',
    'hasOptionalTypeArgs',
    'hasOverride',
    'hasProtected',
    'hasRedeclare',
    'hasReopen',
    'hasRequired',
    'hasSealed',
    'hasUseResult',
    'hasVisibleForOverriding',
    'hasVisibleForTemplate',
    'hasVisibleForTesting',
    'hasVisibleOutsideTemplate',
    'hashCode',
    'id',
    'isConst',
    'isConstantEvaluated',
    'isCovariant',
    'isFinal',
    'isInitializingFormal',
    'isLate',
    'isPrivate',
    'isPublic',
    'isStatic',
    'isSuperFormal',
    'isSynthetic',
    'kind',
    'library',
    'library2',
    'librarySource',
    'location',
    'lookupName',
    'metadata',
    'metadata2',
    'name',
    'name3',
    'nameLength',
    'nameOffset',
    'nameShared',
    'nonSynthetic',
    'nonSynthetic2',
    'parameterKind',
    'parameters',
    'runtimeType',
    'session',
    'sinceSdkVersion',
    'source',
    'substitution',
    'type',
    'typeParameters',
    'typeParameters2',
    'typeShared',
  },
  'ParameterizedType': {'hashCode', 'runtimeType', 'typeArguments'},
  'PropertyAccessorElement': {
    'augmentation',
    'augmentationTarget',
    'correspondingGetter',
    'correspondingSetter',
    'declaration',
    'enclosingElement3',
    'hashCode',
    'isGetter',
    'isSetter',
    'runtimeType',
    'variable2',
  },
  'PropertyAccessorElement2': {
    'baseElement',
    'firstFragment',
    'fragments',
    'hashCode',
    'runtimeType',
    'variable3',
  },
  'Scope': {'hashCode', 'runtimeType'},
  'TemplateOptions': {
    'customFooterContent',
    'customHeaderContent',
    'customInnerFooterText',
    'hashCode',
    'relCanonicalPrefix',
    'runtimeType',
    'toolVersion',
    'useBaseHref',
  },
  'TopLevelFunctionElement': {
    'baseElement',
    'firstFragment',
    'fragments',
    'hashCode',
    'isDartCoreIdentical',
    'isEntryPoint',
    'runtimeType',
  },
  'TopLevelVariableElement': {
    'augmentation',
    'augmentationTarget',
    'declaration',
    'hashCode',
    'isExternal',
    'runtimeType',
  },
  'TopLevelVariableElement2': {
    'baseElement',
    'firstFragment',
    'fragments',
    'hashCode',
    'isExternal',
    'runtimeType',
  },
  'TypeAliasElement': {
    'aliasedElement',
    'aliasedType',
    'enclosingElement3',
    'hashCode',
    'isAugmentation',
    'name',
    'runtimeType',
  },
  'TypeAliasElement2': {
    'aliasedElement2',
    'aliasedType',
    'enclosingElement2',
    'firstFragment',
    'fragments',
    'hashCode',
    'runtimeType',
  },
  'TypeParameterElement': {
    'bound',
    'declaration',
    'displayName',
    'hashCode',
    'name',
    'runtimeType',
  },
  'TypeParameterElement2': {
    'baseElement',
    'bound',
    'firstFragment',
    'fragments',
    'hashCode',
    'runtimeType',
  },
  'int': {
    'bitLength',
    'hashCode',
    'isEven',
    'isFinite',
    'isInfinite',
    'isNaN',
    'isNegative',
    'isOdd',
    'runtimeType',
    'sign',
  },
};
