From fccd7f8b126a4ea96c34ebe0151ae22b2926f8ce Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Thu, 10 Dec 2020 16:43:30 -0800 Subject: [PATCH 1/4] Most of SimpleRenderers --- lib/src/mustachio/renderer_base.dart | 16 +++++ tool/mustachio/codegen_runtime_renderer.dart | 68 ++++++++++++++++---- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/lib/src/mustachio/renderer_base.dart b/lib/src/mustachio/renderer_base.dart index dd5ab315fd..6c70933d5e 100644 --- a/lib/src/mustachio/renderer_base.dart +++ b/lib/src/mustachio/renderer_base.dart @@ -117,6 +117,22 @@ abstract class RendererBase { } } +abstract class SimpleRendererBase extends RendererBase { + static const _needsVisibleToMustachio = + 'This type something needs @visibleToMustachio'; + + SimpleRendererBase(T context, RendererBase parent) + : super(context, parent); + + @override + Property getProperty(String key) => + throw UnsupportedError(_needsVisibleToMustachio); + + @override + String getFields(List keyParts) => + throw UnsupportedError(_needsVisibleToMustachio); +} + /// An individual property of objects of type [T], including functions for /// rendering various types of Mustache nodes. class Property { diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index b308e87958..f8fa153aea 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/dart/element/type_system.dart'; import 'package:dart_style/dart_style.dart'; +import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; /// The specification of a renderer, as derived from a @Renderer annotation. @@ -86,7 +87,13 @@ import '${p.basename(_sourceUri.path)}'; while (_typesToProcess.isNotEmpty) { var info = _typesToProcess.removeFirst(); - _buildRenderer(info); + if (info.isFullRenderer) { + _typeToRenderFunctionName[info._contextType.element] = + info._functionName; + _typeToRendererClassName[info._contextType.element] = + info._rendererClassName; + _buildRenderer(info); + } } return _buffer.toString(); @@ -103,7 +110,7 @@ import '${p.basename(_sourceUri.path)}'; spec._contextType.accessors.forEach(_addPropertyToProcess); var superclass = spec._contextType.superclass; while (superclass != null) { - _addTypeToProcess(superclass.element.thisType); + _addTypeToProcess(superclass.element.thisType, isFullRenderer: true); superclass.accessors.forEach(_addPropertyToProcess); superclass = superclass.superclass; } @@ -118,6 +125,7 @@ import '${p.basename(_sourceUri.path)}'; if (property.isPrivate || property.isStatic || property.isSetter) return; if (property.hasProtected || property.hasVisibleForTesting) return; var type = property.type.returnType; + var isFullRenderer = _hasVisibleToMustache(type.element); if (_typeSystem.isAssignableTo(type, _typeProvider.iterableDynamicType)) { var iterableElement = _typeProvider.iterableElement; @@ -129,19 +137,21 @@ import '${p.basename(_sourceUri.path)}'; // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. while (innerType != null && innerType is InterfaceType) { - _addTypeToProcess((innerType as InterfaceType).element.thisType); + _addTypeToProcess((innerType as InterfaceType).element.thisType, + isFullRenderer: true); innerType = (innerType as InterfaceType).superclass; } } while (type != null && type is InterfaceType) { - _addTypeToProcess((type as InterfaceType).element.thisType); + _addTypeToProcess((type as InterfaceType).element.thisType, + isFullRenderer: isFullRenderer); type = (type as InterfaceType).superclass; } } /// Adds [type] to the [_typesToProcess] queue, if it is not already there. - void _addTypeToProcess(InterfaceType type) { + void _addTypeToProcess(InterfaceType type, {@required isFullRenderer}) { if (type == _typeProvider.typeType) { // The [Type] type is the first case of a type we don't want to traverse. return; @@ -152,11 +162,28 @@ import '${p.basename(_sourceUri.path)}'; .singleWhere((rs) => rs._contextType == type, orElse: () => null); if (typeToProcess == null) { var rendererInfo = _RendererInfo(type, renderFunctionName, - public: _rendererClassesArePublic); + public: _rendererClassesArePublic, isFullRenderer: isFullRenderer); _typesToProcess.add(rendererInfo); _typeToRenderFunctionName[type.element] = renderFunctionName; _typeToRendererClassName[type.element] = rendererInfo._rendererClassName; + } else { + if (isFullRenderer && !typeToProcess.isFullRenderer) { + // This is the only case in which we update a type-to-render. + typeToProcess.isFullRenderer = true; + } + } + } + + /// Returns whether [element] or any of its supertypes are annotated with + /// `visibleToMustache`. + bool _hasVisibleToMustache(ClassElement element) { + if (element.metadata.any((m) => m.element?.name == 'visibleToMustache')) { + return true; + } + if (element.supertype == null) { + return false; } + return _hasVisibleToMustache(element.supertype.element); } /// Builds both the render function and the renderer class for [renderer]. @@ -177,11 +204,16 @@ String ${renderer._functionName}${renderer._typeParametersString}( '''); // Write out the renderer class. + var rendererBaseClass = renderer.isFullRenderer + ? 'RendererBase<$typeName>' + : 'SimpleRendererBase<$typeName>'; _buffer.write(''' class ${renderer._rendererClassName}${renderer._typeParametersString} - extends RendererBase<$typeName> { + extends $rendererBaseClass { '''); - _writePropertyMap(renderer); + if (renderer.isFullRenderer) { + _writePropertyMap(renderer); + } // Write out the constructor. _buffer.writeln(''' ${renderer._rendererClassName}($typeName context, RendererBase parent) @@ -189,8 +221,9 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} '''); var propertyMapTypeArguments = renderer._typeArgumentsStringWith(typeName); var propertyMapName = 'propertyMap$propertyMapTypeArguments'; - // Write out `getProperty`. - _buffer.writeln(''' + if (renderer.isFullRenderer) { + // Write out `getProperty`. + _buffer.writeln(''' @override Property<$typeName> getProperty(String key) { if ($propertyMapName().containsKey(key)) { @@ -200,6 +233,7 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} } } '''); + } // Close the class. _buffer.writeln('}'); } @@ -350,17 +384,25 @@ class _RendererInfo { /// private otherwise. final String _functionName; + /// Whether the renderer should be a full renderer. + /// + /// It may be initially determined that we only need an abbreviated, then + /// later determined that we need a full renderer, so this field is not final. + bool isFullRenderer; + factory _RendererInfo(InterfaceType contextType, String functionName, - {bool public = false}) { + {bool public = false, bool isFullRenderer = true}) { var typeBaseName = contextType.element.name; var rendererClassName = public ? 'Renderer_$typeBaseName' : '_Renderer_$typeBaseName'; - return _RendererInfo._(contextType, functionName, rendererClassName); + return _RendererInfo._(contextType, functionName, rendererClassName, + isFullRenderer: isFullRenderer); } _RendererInfo._( - this._contextType, this._functionName, this._rendererClassName); + this._contextType, this._functionName, this._rendererClassName, + {@required this.isFullRenderer}); String get _typeName => _contextType.getDisplayString(withNullability: false); From 07bb42261c6cd27c9f01672ba6884ef39104fe20 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Fri, 11 Dec 2020 14:31:36 -0800 Subject: [PATCH 2/4] Finish 'full renderers' implementation --- lib/src/generator/templates.renderers.dart | 3751 ++---------------- lib/src/mustachio/annotations.dart | 8 + lib/src/mustachio/renderer_base.dart | 53 +- test/mustachio/builder_test.dart | 50 +- test/mustachio/foo.dart | 6 + test/mustachio/foo.renderers.dart | 542 +-- test/mustachio/renderer_test.dart | 26 +- tool/mustachio/codegen_runtime_renderer.dart | 160 +- 8 files changed, 484 insertions(+), 4112 deletions(-) diff --git a/lib/src/generator/templates.renderers.dart b/lib/src/generator/templates.renderers.dart index c7e854c664..5efe4f59c0 100644 --- a/lib/src/generator/templates.renderers.dart +++ b/lib/src/generator/templates.renderers.dart @@ -25,14 +25,11 @@ class _Renderer_PackageTemplateData extends RendererBase { getValue: (CT_ c) => c.hasHomepage, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, getBool: (CT_ c) => c.hasHomepage == true, @@ -41,52 +38,43 @@ class _Renderer_PackageTemplateData extends RendererBase { getValue: (CT_ c) => c.homepage, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.homepage == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.homepage, ast, parent: r); + return renderSimple(c.homepage, ast, parent: r); }, ), 'htmlBase': Property( getValue: (CT_ c) => c.htmlBase, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.htmlBase == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.htmlBase, ast, parent: r); + return renderSimple(c.htmlBase, ast, parent: r); }, ), 'includeVersion': Property( getValue: (CT_ c) => c.includeVersion, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, getBool: (CT_ c) => c.includeVersion == true, @@ -95,52 +83,43 @@ class _Renderer_PackageTemplateData extends RendererBase { getValue: (CT_ c) => c.layoutTitle, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.layoutTitle == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.layoutTitle, ast, parent: r); + return renderSimple(c.layoutTitle, ast, parent: r); }, ), 'metaDescription': Property( getValue: (CT_ c) => c.metaDescription, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.metaDescription == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.metaDescription, ast, parent: r); + return renderSimple(c.metaDescription, ast, parent: r); }, ), 'navLinks': Property( getValue: (CT_ c) => c.navLinks, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isEmptyIterable: (CT_ c) => c.navLinks?.isEmpty ?? true, @@ -148,7 +127,7 @@ class _Renderer_PackageTemplateData extends RendererBase { (CT_ c, RendererBase r, List ast) { var buffer = StringBuffer(); for (var e in c.navLinks) { - buffer.write(_render_Documentable(e, ast, parent: r)); + buffer.write(renderSimple(e, ast, parent: r)); } return buffer.toString(); }, @@ -157,57 +136,48 @@ class _Renderer_PackageTemplateData extends RendererBase { getValue: (CT_ c) => c.package, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Package.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Package.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.package == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Package(c.package, ast, parent: r); + return renderSimple(c.package, ast, parent: r); }, ), 'self': Property( getValue: (CT_ c) => c.self, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Package.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Package.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.self == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Package(c.self, ast, parent: r); + return renderSimple(c.self, ast, parent: r); }, ), 'title': Property( getValue: (CT_ c) => c.title, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.title == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.title, ast, parent: r); + return renderSimple(c.title, ast, parent: r); }, ), ..._Renderer_TemplateData.propertyMap(), @@ -227,353 +197,113 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -String _render_Package(Package context, List ast, +String _render_Object(Object context, List ast, {RendererBase parent}) { - var renderer = _Renderer_Package(context, parent); + var renderer = _Renderer_Object(context, parent); renderer.renderBlock(ast); return renderer.buffer.toString(); } -class _Renderer_Package extends RendererBase { - static Map> propertyMap() => { - 'allLibraries': Property( - getValue: (CT_ c) => c.allLibraries, - ), - 'baseHref': Property( - getValue: (CT_ c) => c.baseHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.baseHref == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.baseHref, ast, parent: r); - }, - ), - 'canonicalLibrary': Property( - getValue: (CT_ c) => c.canonicalLibrary, - ), - 'categories': Property( - getValue: (CT_ c) => c.categories, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'categoriesWithPublicLibraries': Property( - getValue: (CT_ c) => c.categoriesWithPublicLibraries, - isEmptyIterable: (CT_ c) => - c.categoriesWithPublicLibraries?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.categoriesWithPublicLibraries) { - buffer.write(_render_LibraryContainer(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'config': Property( - getValue: (CT_ c) => c.config, - ), - 'containerOrder': Property( - getValue: (CT_ c) => c.containerOrder, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.containerOrder?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.containerOrder) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'defaultCategory': Property( - getValue: (CT_ c) => c.defaultCategory, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_LibraryContainer.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_LibraryContainer.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.defaultCategory == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_LibraryContainer(c.defaultCategory, ast, parent: r); - }, - ), - 'documentation': Property( - getValue: (CT_ c) => c.documentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentation == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentation, ast, parent: r); - }, - ), - 'documentationAsHtml': Property( - getValue: (CT_ c) => c.documentationAsHtml, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentationAsHtml == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentationAsHtml, ast, parent: r); - }, - ), - 'documentationFile': Property( - getValue: (CT_ c) => c.documentationFile, - ), - 'documentationFrom': Property( - getValue: (CT_ c) => c.documentationFrom, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'documentedCategories': Property( - getValue: (CT_ c) => c.documentedCategories, - ), - 'documentedCategoriesSorted': Property( - getValue: (CT_ c) => c.documentedCategoriesSorted, - ), - 'documentedWhere': Property( - getValue: (CT_ c) => c.documentedWhere, - ), - 'element': Property( - getValue: (CT_ c) => c.element, - ), - 'enclosingElement': Property( - getValue: (CT_ c) => c.enclosingElement, - ), - 'enclosingName': Property( - getValue: (CT_ c) => c.enclosingName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.enclosingName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.enclosingName, ast, parent: r); - }, - ), - 'filePath': Property( - getValue: (CT_ c) => c.filePath, +class _Renderer_Object extends RendererBase { + static Map> propertyMap() => { + 'hashCode': Property( + getValue: (CT_ c) => c.hashCode, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.filePath == null, + isNullValue: (CT_ c) => c.hashCode == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.filePath, ast, parent: r); + return renderSimple(c.hashCode, ast, parent: r); }, ), - 'fileType': Property( - getValue: (CT_ c) => c.fileType, + }; + + _Renderer_Object(Object context, RendererBase parent) + : super(context, parent); + + @override + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; + } else { + return null; + } + } +} + +String _render_TemplateData( + TemplateData context, List ast, + {RendererBase parent}) { + var renderer = _Renderer_TemplateData(context, parent); + renderer.renderBlock(ast); + return renderer.buffer.toString(); +} + +class _Renderer_TemplateData + extends RendererBase> { + static Map> propertyMap() => + { + 'bareHref': Property( + getValue: (CT_ c) => c.bareHref, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.fileType == null, + isNullValue: (CT_ c) => c.bareHref == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fileType, ast, parent: r); + return renderSimple(c.bareHref, ast, parent: r); }, ), - 'fullyQualifiedName': Property( - getValue: (CT_ c) => c.fullyQualifiedName, + 'defaultPackage': Property( + getValue: (CT_ c) => c.defaultPackage, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.fullyQualifiedName == null, + isNullValue: (CT_ c) => c.defaultPackage == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fullyQualifiedName, ast, parent: r); - }, - ), - 'hasCategories': Property( - getValue: (CT_ c) => c.hasCategories, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasCategories == true, - ), - 'hasDocumentation': Property( - getValue: (CT_ c) => c.hasDocumentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasDocumentation == true, - ), - 'hasDocumentationFile': Property( - getValue: (CT_ c) => c.hasDocumentationFile, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasDocumentationFile == true, - ), - 'hasDocumentedCategories': Property( - getValue: (CT_ c) => c.hasDocumentedCategories, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } + return renderSimple(c.defaultPackage, ast, parent: r); }, - getBool: (CT_ c) => c.hasDocumentedCategories == true, ), - 'hasExtendedDocumentation': Property( - getValue: (CT_ c) => c.hasExtendedDocumentation, + 'hasFooterVersion': Property( + getValue: (CT_ c) => c.hasFooterVersion, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - getBool: (CT_ c) => c.hasExtendedDocumentation == true, + getBool: (CT_ c) => c.hasFooterVersion == true, ), 'hasHomepage': Property( getValue: (CT_ c) => c.hasHomepage, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, getBool: (CT_ c) => c.hasHomepage == true, @@ -582,3248 +312,245 @@ class _Renderer_Package extends RendererBase { getValue: (CT_ c) => c.homepage, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.homepage == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.homepage, ast, parent: r); + return renderSimple(c.homepage, ast, parent: r); }, ), - 'href': Property( - getValue: (CT_ c) => c.href, + 'htmlBase': Property( + getValue: (CT_ c) => c.htmlBase, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.href == null, + isNullValue: (CT_ c) => c.htmlBase == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.href, ast, parent: r); + return renderSimple(c.htmlBase, ast, parent: r); }, ), - 'isCanonical': Property( - getValue: (CT_ c) => c.isCanonical, + 'htmlOptions': Property( + getValue: (CT_ c) => c.htmlOptions, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - getBool: (CT_ c) => c.isCanonical == true, - ), - 'isDocumented': Property( - getValue: (CT_ c) => c.isDocumented, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } + isNullValue: (CT_ c) => c.htmlOptions == null, + renderValue: (CT_ c, RendererBase r, List ast) { + return renderSimple(c.htmlOptions, ast, parent: r); }, - getBool: (CT_ c) => c.isDocumented == true, ), - 'isFirstPackage': Property( - getValue: (CT_ c) => c.isFirstPackage, + 'includeVersion': Property( + getValue: (CT_ c) => c.includeVersion, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - getBool: (CT_ c) => c.isFirstPackage == true, + getBool: (CT_ c) => c.includeVersion == true, ), - 'isLocal': Property( - getValue: (CT_ c) => c.isLocal, + 'layoutTitle': Property( + getValue: (CT_ c) => c.layoutTitle, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - getBool: (CT_ c) => c.isLocal == true, + isNullValue: (CT_ c) => c.layoutTitle == null, + renderValue: (CT_ c, RendererBase r, List ast) { + return renderSimple(c.layoutTitle, ast, parent: r); + }, ), - 'isPublic': Property( - getValue: (CT_ c) => c.isPublic, + 'localPackages': Property( + getValue: (CT_ c) => c.localPackages, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - getBool: (CT_ c) => c.isPublic == true, - ), - 'isSdk': Property( - getValue: (CT_ c) => c.isSdk, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); + isEmptyIterable: (CT_ c) => c.localPackages?.isEmpty ?? true, + renderIterable: + (CT_ c, RendererBase r, List ast) { + var buffer = StringBuffer(); + for (var e in c.localPackages) { + buffer.write(renderSimple(e, ast, parent: r)); } + return buffer.toString(); }, - getBool: (CT_ c) => c.isSdk == true, ), - 'kind': Property( - getValue: (CT_ c) => c.kind, + 'metaDescription': Property( + getValue: (CT_ c) => c.metaDescription, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.kind == null, + isNullValue: (CT_ c) => c.metaDescription == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.kind, ast, parent: r); + return renderSimple(c.metaDescription, ast, parent: r); }, ), - 'location': Property( - getValue: (CT_ c) => c.location, + 'navLinks': Property( + getValue: (CT_ c) => c.navLinks, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.location == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.location, ast, parent: r); - }, - ), - 'locationPieces': Property( - getValue: (CT_ c) => c.locationPieces, - isEmptyIterable: (CT_ c) => c.locationPieces?.isEmpty ?? true, + isEmptyIterable: (CT_ c) => c.navLinks?.isEmpty ?? true, renderIterable: (CT_ c, RendererBase r, List ast) { var buffer = StringBuffer(); - for (var e in c.locationPieces) { - buffer.write(_render_String(e, ast, parent: r)); + for (var e in c.navLinks) { + buffer.write(renderSimple(e, ast, parent: r)); } return buffer.toString(); }, ), - 'name': Property( - getValue: (CT_ c) => c.name, + 'navLinksWithGenerics': Property( + getValue: (CT_ c) => c.navLinksWithGenerics, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.name == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.name, ast, parent: r); + isEmptyIterable: (CT_ c) => c.navLinksWithGenerics?.isEmpty ?? true, + renderIterable: + (CT_ c, RendererBase r, List ast) { + var buffer = StringBuffer(); + for (var e in c.navLinksWithGenerics) { + buffer.write(renderSimple(e, ast, parent: r)); + } + return buffer.toString(); }, ), - 'nameToCategory': Property( - getValue: (CT_ c) => c.nameToCategory, - ), - 'oneLineDoc': Property( - getValue: (CT_ c) => c.oneLineDoc, + 'parent': Property( + getValue: (CT_ c) => c.parent, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.oneLineDoc == null, + isNullValue: (CT_ c) => c.parent == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.oneLineDoc, ast, parent: r); + return renderSimple(c.parent, ast, parent: r); }, ), - 'package': Property( - getValue: (CT_ c) => c.package, + 'relCanonicalPrefix': Property( + getValue: (CT_ c) => c.relCanonicalPrefix, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Package.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Package.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.package == null, + isNullValue: (CT_ c) => c.relCanonicalPrefix == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Package(c.package, ast, parent: r); + return renderSimple(c.relCanonicalPrefix, ast, parent: r); }, ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, - ), - 'packageMeta': Property( - getValue: (CT_ c) => c.packageMeta, - ), - 'packagePath': Property( - getValue: (CT_ c) => c.packagePath, + 'title': Property( + getValue: (CT_ c) => c.title, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.packagePath == null, + isNullValue: (CT_ c) => c.title == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.packagePath, ast, parent: r); + return renderSimple(c.title, ast, parent: r); }, ), - 'publicLibraries': Property( - getValue: (CT_ c) => c.publicLibraries, - ), - 'toolInvocationIndex': Property( - getValue: (CT_ c) => c.toolInvocationIndex, + 'useBaseHref': Property( + getValue: (CT_ c) => c.useBaseHref, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.toolInvocationIndex == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.toolInvocationIndex, ast, parent: r); - }, - ), - 'usedAnimationIdsByHref': Property( - getValue: (CT_ c) => c.usedAnimationIdsByHref, + getBool: (CT_ c) => c.useBaseHref == true, ), 'version': Property( getValue: (CT_ c) => c.version, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.version == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.version, ast, parent: r); + return renderSimple(c.version, ast, parent: r); }, ), - ..._Renderer_LibraryContainer.propertyMap(), + ..._Renderer_Object.propertyMap(), }; - _Renderer_Package(Package context, RendererBase parent) + _Renderer_TemplateData(TemplateData context, RendererBase parent) : super(context, parent); @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_LibraryContainer( - LibraryContainer context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_LibraryContainer(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_LibraryContainer extends RendererBase { - static Map> propertyMap< - CT_ extends LibraryContainer>() => - { - 'containerOrder': Property( - getValue: (CT_ c) => c.containerOrder, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.containerOrder?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.containerOrder) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'enclosingName': Property( - getValue: (CT_ c) => c.enclosingName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.enclosingName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.enclosingName, ast, parent: r); - }, - ), - 'hasPublicLibraries': Property( - getValue: (CT_ c) => c.hasPublicLibraries, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicLibraries == true, - ), - 'isSdk': Property( - getValue: (CT_ c) => c.isSdk, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isSdk == true, - ), - 'libraries': Property( - getValue: (CT_ c) => c.libraries, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, - ), - 'publicLibraries': Property( - getValue: (CT_ c) => c.publicLibraries, - ), - 'publicLibrariesSorted': Property( - getValue: (CT_ c) => c.publicLibrariesSorted, - ), - 'sortKey': Property( - getValue: (CT_ c) => c.sortKey, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sortKey == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.sortKey, ast, parent: r); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_LibraryContainer( - LibraryContainer context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Object(Object context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_Object(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Object extends RendererBase { - static Map> propertyMap() => { - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - }; - - _Renderer_Object(Object context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_bool(bool context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_bool(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_bool extends RendererBase { - static Map> propertyMap() => { - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_bool(bool context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Documentable(Documentable context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_Documentable(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Documentable extends RendererBase { - static Map> propertyMap() => { - 'config': Property( - getValue: (CT_ c) => c.config, - ), - 'documentation': Property( - getValue: (CT_ c) => c.documentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentation == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentation, ast, parent: r); - }, - ), - 'documentationAsHtml': Property( - getValue: (CT_ c) => c.documentationAsHtml, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentationAsHtml == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentationAsHtml, ast, parent: r); - }, - ), - 'hasDocumentation': Property( - getValue: (CT_ c) => c.hasDocumentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasDocumentation == true, - ), - 'hasExtendedDocumentation': Property( - getValue: (CT_ c) => c.hasExtendedDocumentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasExtendedDocumentation == true, - ), - 'href': Property( - getValue: (CT_ c) => c.href, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.href == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.href, ast, parent: r); - }, - ), - 'isDocumented': Property( - getValue: (CT_ c) => c.isDocumented, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isDocumented == true, - ), - 'kind': Property( - getValue: (CT_ c) => c.kind, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.kind == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.kind, ast, parent: r); - }, - ), - 'oneLineDoc': Property( - getValue: (CT_ c) => c.oneLineDoc, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.oneLineDoc == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.oneLineDoc, ast, parent: r); - }, - ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, - ), - ..._Renderer_Nameable.propertyMap(), - }; - - _Renderer_Documentable(Documentable context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Nameable(Nameable context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_Nameable(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Nameable extends RendererBase { - static Map> propertyMap() => { - 'fullyQualifiedName': Property( - getValue: (CT_ c) => c.fullyQualifiedName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.fullyQualifiedName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fullyQualifiedName, ast, parent: r); - }, - ), - 'name': Property( - getValue: (CT_ c) => c.name, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.name == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.name, ast, parent: r); - }, - ), - 'namePart': Property( - getValue: (CT_ c) => c.namePart, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.namePart == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.namePart, ast, parent: r); - }, - ), - 'namePieces': Property( - getValue: (CT_ c) => c.namePieces, - isEmptyIterable: (CT_ c) => c.namePieces?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.namePieces) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_Nameable(Nameable context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_List(List context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_List(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_List extends RendererBase> { - static Map> propertyMap>() => { - 'length': Property( - getValue: (CT_ c) => c.length, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.length == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.length, ast, parent: r); - }, - ), - 'reversed': Property( - getValue: (CT_ c) => c.reversed, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_List(List context, RendererBase parent) - : super(context, parent); - - @override - Property> getProperty(String key) { - if (propertyMap>().containsKey(key)) { - return propertyMap>()[key]; - } else { - return null; - } - } -} - -String _render_String(String context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_String(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_String extends RendererBase { - static Map> propertyMap() => { - 'codeUnits': Property( - getValue: (CT_ c) => c.codeUnits, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.codeUnits?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.codeUnits) { - buffer.write(_render_int(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - 'isEmpty': Property( - getValue: (CT_ c) => c.isEmpty, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isEmpty == true, - ), - 'isNotEmpty': Property( - getValue: (CT_ c) => c.isNotEmpty, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNotEmpty == true, - ), - 'length': Property( - getValue: (CT_ c) => c.length, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.length == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.length, ast, parent: r); - }, - ), - 'runes': Property( - getValue: (CT_ c) => c.runes, - isEmptyIterable: (CT_ c) => c.runes?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.runes) { - buffer.write(_render_int(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_String(String context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_TemplateData( - TemplateData context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_TemplateData(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_TemplateData - extends RendererBase> { - static Map> propertyMap>() => - { - 'bareHref': Property( - getValue: (CT_ c) => c.bareHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.bareHref == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.bareHref, ast, parent: r); - }, - ), - 'defaultPackage': Property( - getValue: (CT_ c) => c.defaultPackage, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Package.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Package.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.defaultPackage == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Package(c.defaultPackage, ast, parent: r); - }, - ), - 'hasFooterVersion': Property( - getValue: (CT_ c) => c.hasFooterVersion, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasFooterVersion == true, - ), - 'hasHomepage': Property( - getValue: (CT_ c) => c.hasHomepage, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasHomepage == true, - ), - 'homepage': Property( - getValue: (CT_ c) => c.homepage, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.homepage == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.homepage, ast, parent: r); - }, - ), - 'htmlBase': Property( - getValue: (CT_ c) => c.htmlBase, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.htmlBase == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.htmlBase, ast, parent: r); - }, - ), - 'htmlOptions': Property( - getValue: (CT_ c) => c.htmlOptions, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_TemplateOptions.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_TemplateOptions.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.htmlOptions == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_TemplateOptions(c.htmlOptions, ast, parent: r); - }, - ), - 'includeVersion': Property( - getValue: (CT_ c) => c.includeVersion, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.includeVersion == true, - ), - 'layoutTitle': Property( - getValue: (CT_ c) => c.layoutTitle, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.layoutTitle == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.layoutTitle, ast, parent: r); - }, - ), - 'localPackages': Property( - getValue: (CT_ c) => c.localPackages, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.localPackages?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.localPackages) { - buffer.write(_render_Package(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'metaDescription': Property( - getValue: (CT_ c) => c.metaDescription, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.metaDescription == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.metaDescription, ast, parent: r); - }, - ), - 'navLinks': Property( - getValue: (CT_ c) => c.navLinks, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.navLinks?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.navLinks) { - buffer.write(_render_Documentable(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'navLinksWithGenerics': Property( - getValue: (CT_ c) => c.navLinksWithGenerics, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.navLinksWithGenerics?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.navLinksWithGenerics) { - buffer.write(_render_Container(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'parent': Property( - getValue: (CT_ c) => c.parent, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Documentable.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Documentable.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.parent == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Documentable(c.parent, ast, parent: r); - }, - ), - 'relCanonicalPrefix': Property( - getValue: (CT_ c) => c.relCanonicalPrefix, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.relCanonicalPrefix == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.relCanonicalPrefix, ast, parent: r); - }, - ), - 'title': Property( - getValue: (CT_ c) => c.title, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.title == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.title, ast, parent: r); - }, - ), - 'useBaseHref': Property( - getValue: (CT_ c) => c.useBaseHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.useBaseHref == true, - ), - 'version': Property( - getValue: (CT_ c) => c.version, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.version == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.version, ast, parent: r); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_TemplateData(TemplateData context, RendererBase parent) - : super(context, parent); - - @override - Property> getProperty(String key) { - if (propertyMap>().containsKey(key)) { - return propertyMap>()[key]; - } else { - return null; - } - } -} - -String _render_TemplateOptions(TemplateOptions context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_TemplateOptions(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_TemplateOptions extends RendererBase { - static Map> propertyMap< - CT_ extends TemplateOptions>() => - { - 'relCanonicalPrefix': Property( - getValue: (CT_ c) => c.relCanonicalPrefix, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.relCanonicalPrefix == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.relCanonicalPrefix, ast, parent: r); - }, - ), - 'toolVersion': Property( - getValue: (CT_ c) => c.toolVersion, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.toolVersion == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.toolVersion, ast, parent: r); - }, - ), - 'useBaseHref': Property( - getValue: (CT_ c) => c.useBaseHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.useBaseHref == true, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_TemplateOptions( - TemplateOptions context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Container(Container context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_Container(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Container extends RendererBase { - static Map> propertyMap() => { - 'allElements': Property( - getValue: (CT_ c) => c.allElements, - ), - 'allModelElements': Property( - getValue: (CT_ c) => c.allModelElements, - isEmptyIterable: (CT_ c) => c.allModelElements?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.allModelElements) { - buffer.write(_render_ModelElement(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'allModelElementsByNamePart': Property( - getValue: (CT_ c) => c.allModelElementsByNamePart, - ), - 'constantFields': Property( - getValue: (CT_ c) => c.constantFields, - ), - 'declaredFields': Property( - getValue: (CT_ c) => c.declaredFields, - ), - 'declaredMethods': Property( - getValue: (CT_ c) => c.declaredMethods, - ), - 'declaredOperators': Property( - getValue: (CT_ c) => c.declaredOperators, - ), - 'hasInstanceFields': Property( - getValue: (CT_ c) => c.hasInstanceFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasInstanceFields == true, - ), - 'hasPublicConstantFields': Property( - getValue: (CT_ c) => c.hasPublicConstantFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicConstantFields == true, - ), - 'hasPublicInstanceFields': Property( - getValue: (CT_ c) => c.hasPublicInstanceFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicInstanceFields == true, - ), - 'hasPublicInstanceMethods': Property( - getValue: (CT_ c) => c.hasPublicInstanceMethods, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicInstanceMethods == true, - ), - 'hasPublicInstanceOperators': Property( - getValue: (CT_ c) => c.hasPublicInstanceOperators, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicInstanceOperators == true, - ), - 'hasPublicStaticFields': Property( - getValue: (CT_ c) => c.hasPublicStaticFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicStaticFields == true, - ), - 'hasPublicStaticMethods': Property( - getValue: (CT_ c) => c.hasPublicStaticMethods, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicStaticMethods == true, - ), - 'hasPublicVariableStaticFields': Property( - getValue: (CT_ c) => c.hasPublicVariableStaticFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasPublicVariableStaticFields == true, - ), - 'instanceAccessors': Property( - getValue: (CT_ c) => c.instanceAccessors, - ), - 'instanceFields': Property( - getValue: (CT_ c) => c.instanceFields, - ), - 'instanceMethods': Property( - getValue: (CT_ c) => c.instanceMethods, - ), - 'instanceOperators': Property( - getValue: (CT_ c) => c.instanceOperators, - ), - 'isClass': Property( - getValue: (CT_ c) => c.isClass, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isClass == true, - ), - 'isClassOrExtension': Property( - getValue: (CT_ c) => c.isClassOrExtension, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isClassOrExtension == true, - ), - 'isEnum': Property( - getValue: (CT_ c) => c.isEnum, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isEnum == true, - ), - 'isExtension': Property( - getValue: (CT_ c) => c.isExtension, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isExtension == true, - ), - 'isMixin': Property( - getValue: (CT_ c) => c.isMixin, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isMixin == true, - ), - 'publicConstantFields': Property( - getValue: (CT_ c) => c.publicConstantFields, - ), - 'publicConstantFieldsSorted': Property( - getValue: (CT_ c) => c.publicConstantFieldsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicInheritedInstanceFields': Property( - getValue: (CT_ c) => c.publicInheritedInstanceFields, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.publicInheritedInstanceFields == true, - ), - 'publicInheritedInstanceMethods': Property( - getValue: (CT_ c) => c.publicInheritedInstanceMethods, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.publicInheritedInstanceMethods == true, - ), - 'publicInheritedInstanceOperators': Property( - getValue: (CT_ c) => c.publicInheritedInstanceOperators, - ), - 'publicInstanceFields': Property( - getValue: (CT_ c) => c.publicInstanceFields, - ), - 'publicInstanceFieldsSorted': Property( - getValue: (CT_ c) => c.publicInstanceFieldsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicInstanceMethods': Property( - getValue: (CT_ c) => c.publicInstanceMethods, - ), - 'publicInstanceMethodsSorted': Property( - getValue: (CT_ c) => c.publicInstanceMethodsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicInstanceOperators': Property( - getValue: (CT_ c) => c.publicInstanceOperators, - ), - 'publicInstanceOperatorsSorted': Property( - getValue: (CT_ c) => c.publicInstanceOperatorsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicStaticFields': Property( - getValue: (CT_ c) => c.publicStaticFields, - ), - 'publicStaticFieldsSorted': Property( - getValue: (CT_ c) => c.publicStaticFieldsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicStaticMethods': Property( - getValue: (CT_ c) => c.publicStaticMethods, - ), - 'publicStaticMethodsSorted': Property( - getValue: (CT_ c) => c.publicStaticMethodsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'publicVariableStaticFields': Property( - getValue: (CT_ c) => c.publicVariableStaticFields, - ), - 'publicVariableStaticFieldsSorted': Property( - getValue: (CT_ c) => c.publicVariableStaticFieldsSorted, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'staticAccessors': Property( - getValue: (CT_ c) => c.staticAccessors, - ), - 'staticFields': Property( - getValue: (CT_ c) => c.staticFields, - ), - 'staticMethods': Property( - getValue: (CT_ c) => c.staticMethods, - ), - 'variableStaticFields': Property( - getValue: (CT_ c) => c.variableStaticFields, - ), - ..._Renderer_ModelElement.propertyMap(), - }; - - _Renderer_Container(Container context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_ModelElement(ModelElement context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_ModelElement(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_ModelElement extends RendererBase { - static Map> propertyMap() => { - 'allParameters': Property( - getValue: (CT_ c) => c.allParameters, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'annotations': Property( - getValue: (CT_ c) => c.annotations, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.annotations?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.annotations) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'canHaveParameters': Property( - getValue: (CT_ c) => c.canHaveParameters, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.canHaveParameters == true, - ), - 'canonicalLibrary': Property( - getValue: (CT_ c) => c.canonicalLibrary, - ), - 'canonicalModelElement': Property( - getValue: (CT_ c) => c.canonicalModelElement, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_ModelElement.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_ModelElement.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.canonicalModelElement == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_ModelElement(c.canonicalModelElement, ast, - parent: r); - }, - ), - 'characterLocation': Property( - getValue: (CT_ c) => c.characterLocation, - ), - 'commentRefs': Property( - getValue: (CT_ c) => c.commentRefs, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'compilationUnitElement': Property( - getValue: (CT_ c) => c.compilationUnitElement, - ), - 'computeDocumentationFrom': Property( - getValue: (CT_ c) => c.computeDocumentationFrom, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => - c.computeDocumentationFrom?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.computeDocumentationFrom) { - buffer.write(_render_ModelElement(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'config': Property( - getValue: (CT_ c) => c.config, - ), - 'definingLibrary': Property( - getValue: (CT_ c) => c.definingLibrary, - ), - 'displayedCategories': Property( - getValue: (CT_ c) => c.displayedCategories, - ), - 'documentation': Property( - getValue: (CT_ c) => c.documentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentation == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentation, ast, parent: r); - }, - ), - 'documentationAsHtml': Property( - getValue: (CT_ c) => c.documentationAsHtml, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentationAsHtml == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentationAsHtml, ast, parent: r); - }, - ), - 'documentationFrom': Property( - getValue: (CT_ c) => c.documentationFrom, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.documentationFrom?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.documentationFrom) { - buffer.write(_render_ModelElement(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'documentationLocal': Property( - getValue: (CT_ c) => c.documentationLocal, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.documentationLocal == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.documentationLocal, ast, parent: r); - }, - ), - 'element': Property( - getValue: (CT_ c) => c.element, - ), - 'exportedInLibraries': Property( - getValue: (CT_ c) => c.exportedInLibraries, - ), - 'extendedDocLink': Property( - getValue: (CT_ c) => c.extendedDocLink, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.extendedDocLink == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.extendedDocLink, ast, parent: r); - }, - ), - 'features': Property( - getValue: (CT_ c) => c.features, - isEmptyIterable: (CT_ c) => c.features?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.features) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'featuresAsString': Property( - getValue: (CT_ c) => c.featuresAsString, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.featuresAsString == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.featuresAsString, ast, parent: r); - }, - ), - 'fileName': Property( - getValue: (CT_ c) => c.fileName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.fileName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fileName, ast, parent: r); - }, - ), - 'filePath': Property( - getValue: (CT_ c) => c.filePath, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.filePath == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.filePath, ast, parent: r); - }, - ), - 'fileType': Property( - getValue: (CT_ c) => c.fileType, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.fileType == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fileType, ast, parent: r); - }, - ), - 'fullyQualifiedName': Property( - getValue: (CT_ c) => c.fullyQualifiedName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.fullyQualifiedName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fullyQualifiedName, ast, parent: r); - }, - ), - 'fullyQualifiedNameWithoutLibrary': Property( - getValue: (CT_ c) => c.fullyQualifiedNameWithoutLibrary, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.fullyQualifiedNameWithoutLibrary == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.fullyQualifiedNameWithoutLibrary, ast, - parent: r); - }, - ), - 'hasAnnotations': Property( - getValue: (CT_ c) => c.hasAnnotations, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasAnnotations == true, - ), - 'hasCategoryNames': Property( - getValue: (CT_ c) => c.hasCategoryNames, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasCategoryNames == true, - ), - 'hasDocumentation': Property( - getValue: (CT_ c) => c.hasDocumentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasDocumentation == true, - ), - 'hasExtendedDocumentation': Property( - getValue: (CT_ c) => c.hasExtendedDocumentation, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasExtendedDocumentation == true, - ), - 'hasParameters': Property( - getValue: (CT_ c) => c.hasParameters, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasParameters == true, - ), - 'hasSourceHref': Property( - getValue: (CT_ c) => c.hasSourceHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.hasSourceHref == true, - ), - 'href': Property( - getValue: (CT_ c) => c.href, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.href == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.href, ast, parent: r); - }, - ), - 'htmlId': Property( - getValue: (CT_ c) => c.htmlId, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.htmlId == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.htmlId, ast, parent: r); - }, - ), - 'isAsynchronous': Property( - getValue: (CT_ c) => c.isAsynchronous, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isAsynchronous == true, - ), - 'isCanonical': Property( - getValue: (CT_ c) => c.isCanonical, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isCanonical == true, - ), - 'isConst': Property( - getValue: (CT_ c) => c.isConst, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isConst == true, - ), - 'isDeprecated': Property( - getValue: (CT_ c) => c.isDeprecated, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isDeprecated == true, - ), - 'isDocumented': Property( - getValue: (CT_ c) => c.isDocumented, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isDocumented == true, - ), - 'isExecutable': Property( - getValue: (CT_ c) => c.isExecutable, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isExecutable == true, - ), - 'isFinal': Property( - getValue: (CT_ c) => c.isFinal, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isFinal == true, - ), - 'isLate': Property( - getValue: (CT_ c) => c.isLate, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isLate == true, - ), - 'isLocalElement': Property( - getValue: (CT_ c) => c.isLocalElement, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isLocalElement == true, - ), - 'isPropertyAccessor': Property( - getValue: (CT_ c) => c.isPropertyAccessor, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isPropertyAccessor == true, - ), - 'isPropertyInducer': Property( - getValue: (CT_ c) => c.isPropertyInducer, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isPropertyInducer == true, - ), - 'isPublic': Property( - getValue: (CT_ c) => c.isPublic, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isPublic == true, - ), - 'isPublicAndPackageDocumented': Property( - getValue: (CT_ c) => c.isPublicAndPackageDocumented, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isPublicAndPackageDocumented == true, - ), - 'isStatic': Property( - getValue: (CT_ c) => c.isStatic, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isStatic == true, - ), - 'kind': Property( - getValue: (CT_ c) => c.kind, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.kind == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.kind, ast, parent: r); - }, - ), - 'library': Property( - getValue: (CT_ c) => c.library, - ), - 'linkedName': Property( - getValue: (CT_ c) => c.linkedName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.linkedName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedName, ast, parent: r); - }, - ), - 'linkedParams': Property( - getValue: (CT_ c) => c.linkedParams, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.linkedParams == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedParams, ast, parent: r); - }, - ), - 'linkedParamsLines': Property( - getValue: (CT_ c) => c.linkedParamsLines, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.linkedParamsLines == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedParamsLines, ast, parent: r); - }, - ), - 'linkedParamsNoMetadata': Property( - getValue: (CT_ c) => c.linkedParamsNoMetadata, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.linkedParamsNoMetadata == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedParamsNoMetadata, ast, parent: r); - }, - ), - 'linkedParamsNoMetadataOrNames': Property( - getValue: (CT_ c) => c.linkedParamsNoMetadataOrNames, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.linkedParamsNoMetadataOrNames == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.linkedParamsNoMetadataOrNames, ast, - parent: r); - }, - ), - 'location': Property( - getValue: (CT_ c) => c.location, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.location == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.location, ast, parent: r); - }, - ), - 'locationPieces': Property( - getValue: (CT_ c) => c.locationPieces, - isEmptyIterable: (CT_ c) => c.locationPieces?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.locationPieces) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'modelNode': Property( - getValue: (CT_ c) => c.modelNode, - ), - 'modelType': Property( - getValue: (CT_ c) => c.modelType, - ), - 'name': Property( - getValue: (CT_ c) => c.name, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.name == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.name, ast, parent: r); - }, - ), - 'oneLineDoc': Property( - getValue: (CT_ c) => c.oneLineDoc, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.oneLineDoc == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.oneLineDoc, ast, parent: r); - }, - ), - 'originalMember': Property( - getValue: (CT_ c) => c.originalMember, - ), - 'package': Property( - getValue: (CT_ c) => c.package, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_Package.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_Package.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.package == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_Package(c.package, ast, parent: r); - }, - ), - 'packageGraph': Property( - getValue: (CT_ c) => c.packageGraph, - ), - 'parameters': Property( - getValue: (CT_ c) => c.parameters, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'pathContext': Property( - getValue: (CT_ c) => c.pathContext, - ), - 'sourceCode': Property( - getValue: (CT_ c) => c.sourceCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sourceCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.sourceCode, ast, parent: r); - }, - ), - 'sourceFileName': Property( - getValue: (CT_ c) => c.sourceFileName, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sourceFileName == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.sourceFileName, ast, parent: r); - }, - ), - 'sourceHref': Property( - getValue: (CT_ c) => c.sourceHref, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sourceHref == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.sourceHref, ast, parent: r); - }, - ), - ..._Renderer_Canonicalization.propertyMap(), - }; - - _Renderer_ModelElement(ModelElement context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_Canonicalization( - Canonicalization context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_Canonicalization(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_Canonicalization extends RendererBase { - static Map> propertyMap< - CT_ extends Canonicalization>() => - { - 'canonicalLibrary': Property( - getValue: (CT_ c) => c.canonicalLibrary, - ), - 'commentRefs': Property( - getValue: (CT_ c) => c.commentRefs, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - ), - 'isCanonical': Property( - getValue: (CT_ c) => c.isCanonical, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isCanonical == true, - ), - 'locationPieces': Property( - getValue: (CT_ c) => c.locationPieces, - isEmptyIterable: (CT_ c) => c.locationPieces?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.locationPieces) { - buffer.write(_render_String(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_Canonicalization( - Canonicalization context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_int(int context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_int(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_int extends RendererBase { - static Map> propertyMap() => { - 'bitLength': Property( - getValue: (CT_ c) => c.bitLength, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.bitLength == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.bitLength, ast, parent: r); - }, - ), - 'isEven': Property( - getValue: (CT_ c) => c.isEven, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isEven == true, - ), - 'isOdd': Property( - getValue: (CT_ c) => c.isOdd, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isOdd == true, - ), - 'sign': Property( - getValue: (CT_ c) => c.sign, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sign == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.sign, ast, parent: r); - }, - ), - ..._Renderer_num.propertyMap(), - }; - - _Renderer_int(int context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_num(num context, List ast, - {RendererBase parent}) { - var renderer = _Renderer_num(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class _Renderer_num extends RendererBase { - static Map> propertyMap() => { - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - 'isFinite': Property( - getValue: (CT_ c) => c.isFinite, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isFinite == true, - ), - 'isInfinite': Property( - getValue: (CT_ c) => c.isInfinite, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isInfinite == true, - ), - 'isNaN': Property( - getValue: (CT_ c) => c.isNaN, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNaN == true, - ), - 'isNegative': Property( - getValue: (CT_ c) => c.isNegative, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNegative == true, - ), - 'sign': Property( - getValue: (CT_ c) => c.sign, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_num.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_num.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sign == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_num(c.sign, ast, parent: r); - }, - ), - ..._Renderer_Object.propertyMap(), - }; - - _Renderer_num(num context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; + Property> getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; } else { return null; } diff --git a/lib/src/mustachio/annotations.dart b/lib/src/mustachio/annotations.dart index 2b7eb8b948..450b1ef70a 100644 --- a/lib/src/mustachio/annotations.dart +++ b/lib/src/mustachio/annotations.dart @@ -17,3 +17,11 @@ class Renderer { class Context { const Context(); } + +class _VisibleToMustache { + const _VisibleToMustache(); +} + +/// An annotation used to denote a class which should have a "full renderer." A +/// full renderer gives Mustachio access to the class's fields (getters). +const visibleToMustache = _VisibleToMustache(); diff --git a/lib/src/mustachio/renderer_base.dart b/lib/src/mustachio/renderer_base.dart index 6c70933d5e..30382deb27 100644 --- a/lib/src/mustachio/renderer_base.dart +++ b/lib/src/mustachio/renderer_base.dart @@ -20,6 +20,9 @@ abstract class RendererBase { void write(String text) => buffer.write(text); + String get contextChainString => + parent == null ? '$T' : '${parent.contextChainString} > $T'; + /// Returns the [Property] on this renderer named [name]. /// /// If no property named [name] exists for this renderer, `null` is returned. @@ -39,19 +42,21 @@ abstract class RendererBase { if (property != null) { try { return property.renderVariable(context, property, [...names.skip(1)]); - } on MustachioResolutionError { + } on PartialMustachioResolutionError catch (e) { // The error thrown by [Property.renderVariable] does not have all of // the names required for a decent error. We throw a new error here. throw MustachioResolutionError( - 'Failed to resolve $names as a property chain on any types in the ' - 'current context'); + "Failed to resolve '${e.name}' on ${e.contextType} while resolving " + '${names.skip(1)} as a property chain on any types in the context ' + "chain: $contextChainString, after first resolving '${names.first}'" + 'to a property on $T'); } } else if (parent != null) { return parent.getFields(names); } else { throw MustachioResolutionError( 'Failed to resolve ${names.first} as a property on any types in the ' - 'current context'); + 'context chain: $contextChainString'); } } @@ -117,20 +122,31 @@ abstract class RendererBase { } } -abstract class SimpleRendererBase extends RendererBase { - static const _needsVisibleToMustachio = - 'This type something needs @visibleToMustachio'; +String renderSimple(Object context, List ast, + {RendererBase parent}) { + var renderer = SimpleRenderer(context, parent); + renderer.renderBlock(ast); + return renderer.buffer.toString(); +} - SimpleRendererBase(T context, RendererBase parent) +class SimpleRenderer extends RendererBase { + SimpleRenderer(Object context, RendererBase parent) : super(context, parent); @override - Property getProperty(String key) => - throw UnsupportedError(_needsVisibleToMustachio); + Property getProperty(String key) => null; @override - String getFields(List keyParts) => - throw UnsupportedError(_needsVisibleToMustachio); + String getFields(List keyParts) { + if (keyParts.length == 1 && keyParts.single == '.') { + return context.toString(); + } + if (parent != null) { + return parent.getFields(keyParts); + } else { + return 'null'; + } + } } /// An individual property of objects of type [T], including functions for @@ -172,4 +188,17 @@ class MustachioResolutionError extends Error { String message; MustachioResolutionError([this.message]); + + @override + String toString() => 'MustachioResolutionError: $message'; +} + +/// An error indicating that a renderer failed to resolve a follow-on name in a +/// multi-name key. +class PartialMustachioResolutionError extends Error { + String name; + + Type contextType; + + PartialMustachioResolutionError(this.name, this.contextType); } diff --git a/test/mustachio/builder_test.dart b/test/mustachio/builder_test.dart index 4618011572..211c7663b1 100644 --- a/test/mustachio/builder_test.dart +++ b/test/mustachio/builder_test.dart @@ -24,6 +24,7 @@ class Context { const _libraryFrontMatter = ''' @Renderer(#renderFoo, Context()) +@Renderer(#renderBar, Context()) library foo; import 'package:mustachio/annotations.dart'; '''; @@ -115,7 +116,7 @@ class Bar {} }); test('for a type found in a getter', () { - expect(renderersLibrary.getTopLevelFunction('_render_Bar'), isNotNull); + expect(renderersLibrary.getTopLevelFunction('renderBar'), isNotNull); expect(renderersLibrary.getType('_Renderer_Bar'), isNotNull); }); @@ -137,14 +138,11 @@ class Bar {} getValue: (CT_ c) => c.b1, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + \'Failed to resolve simple renderer use @visibleToMustache\'); } }, getBool: (CT_ c) => c.b1 == true, @@ -158,14 +156,11 @@ class Bar {} getValue: (CT_ c) => c.l1, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isEmptyIterable: (CT_ c) => c.l1?.isEmpty ?? true, @@ -173,7 +168,7 @@ class Bar {} (CT_ c, RendererBase r, List ast) { var buffer = StringBuffer(); for (var e in c.l1) { - buffer.write(_render_int(e, ast, parent: r)); + buffer.write(renderSimple(e, ast, parent: r)); } return buffer.toString(); }, @@ -187,19 +182,16 @@ class Bar {} getValue: (CT_ c) => c.s1, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (_Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = _Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.s1 == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.s1, ast, parent: r); + return renderSimple(c.s1, ast, parent: r); }, ), ''')); @@ -276,6 +268,7 @@ import 'package:mustachio/annotations.dart'; test('builds a renderer for a generic, bounded type', () async { await testMustachioBuilder(''' class Foo {} +class Bar {} '''); var renderersLibrary = await resolveGeneratedLibrary(writer); @@ -288,9 +281,6 @@ class Foo {} expect(fooRendererClass.typeParameters, hasLength(1)); var cBound = fooRenderFunction.typeParameters.single.bound; expect(cBound.getDisplayString(withNullability: false), equals('num')); - - expect(renderersLibrary.getTopLevelFunction('_render_num'), isNotNull); - expect(renderersLibrary.getType('_Renderer_num'), isNotNull); }); group('does not generate a renderer', () { @@ -305,6 +295,7 @@ class Foo { void set setter1(Setter s); Method method1(Method m); } +class Bar {} class Static {} class Private {} class Setter {} @@ -332,6 +323,11 @@ class Method {} expect(renderersLibrary.getTopLevelFunction('_render_Method'), isNull); expect(renderersLibrary.getType('_Renderer_Method'), isNull); }); + + test('for types not @visibleToMustache', () { + expect(renderersLibrary.getTopLevelFunction('_render_String'), isNull); + expect(renderersLibrary.getType('_Renderer_String'), isNull); + }); }); } diff --git a/test/mustachio/foo.dart b/test/mustachio/foo.dart index bc9cde3924..45e8c6f9d0 100644 --- a/test/mustachio/foo.dart +++ b/test/mustachio/foo.dart @@ -1,5 +1,6 @@ @Renderer(#renderFoo, Context()) @Renderer(#renderBar, Context()) +@Renderer(#renderBaz, Context()) library dartdoc.testing.foo; import 'package:dartdoc/src/mustachio/annotations.dart'; @@ -8,9 +9,14 @@ class Foo { String s1; bool b1; List l1; + Baz baz; } class Bar { Foo foo; String s2; } + +class Baz { + Bar bar; +} diff --git a/test/mustachio/foo.renderers.dart b/test/mustachio/foo.renderers.dart index 6b5a65e48c..f1841e6e67 100644 --- a/test/mustachio/foo.renderers.dart +++ b/test/mustachio/foo.renderers.dart @@ -21,32 +21,45 @@ class Renderer_Foo extends RendererBase { static Map> propertyMap() => { 'b1': Property( getValue: (CT_ c) => c.b1, + renderVariable: + (CT_ c, Property self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } else { + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); + } + }, + getBool: (CT_ c) => c.b1 == true, + ), + 'baz': Property( + getValue: (CT_ c) => c.baz, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) return self.getValue(c).toString(); var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; + if (Renderer_Baz.propertyMap().containsKey(name)) { + var nextProperty = Renderer_Baz.propertyMap()[name]; return nextProperty.renderVariable( self.getValue(c), nextProperty, [...remainingNames.skip(1)]); } else { - throw MustachioResolutionError(); + throw PartialMustachioResolutionError(name, CT_); } }, - getBool: (CT_ c) => c.b1 == true, + isNullValue: (CT_ c) => c.baz == null, + renderValue: (CT_ c, RendererBase r, List ast) { + return renderBaz(c.baz, ast, parent: r); + }, ), 'l1': Property( getValue: (CT_ c) => c.l1, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isEmptyIterable: (CT_ c) => c.l1?.isEmpty ?? true, @@ -54,7 +67,7 @@ class Renderer_Foo extends RendererBase { (CT_ c, RendererBase r, List ast) { var buffer = StringBuffer(); for (var e in c.l1) { - buffer.write(_render_int(e, ast, parent: r)); + buffer.write(renderSimple(e, ast, parent: r)); } return buffer.toString(); }, @@ -63,19 +76,16 @@ class Renderer_Foo extends RendererBase { getValue: (CT_ c) => c.s1, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = Renderer_String.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.s1 == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.s1, ast, parent: r); + return renderSimple(c.s1, ast, parent: r); }, ), ...Renderer_Object.propertyMap(), @@ -94,137 +104,6 @@ class Renderer_Foo extends RendererBase { } } -String _render_String(String context, List ast, - {RendererBase parent}) { - var renderer = Renderer_String(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class Renderer_String extends RendererBase { - static Map> propertyMap() => { - 'codeUnits': Property( - getValue: (CT_ c) => c.codeUnits, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_List.propertyMap().containsKey(name)) { - var nextProperty = Renderer_List.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isEmptyIterable: (CT_ c) => c.codeUnits?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.codeUnits) { - buffer.write(_render_int(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - 'isEmpty': Property( - getValue: (CT_ c) => c.isEmpty, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isEmpty == true, - ), - 'isNotEmpty': Property( - getValue: (CT_ c) => c.isNotEmpty, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNotEmpty == true, - ), - 'length': Property( - getValue: (CT_ c) => c.length, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.length == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.length, ast, parent: r); - }, - ), - 'runes': Property( - getValue: (CT_ c) => c.runes, - isEmptyIterable: (CT_ c) => c.runes?.isEmpty ?? true, - renderIterable: - (CT_ c, RendererBase r, List ast) { - var buffer = StringBuffer(); - for (var e in c.runes) { - buffer.write(_render_int(e, ast, parent: r)); - } - return buffer.toString(); - }, - ), - ...Renderer_Object.propertyMap(), - }; - - Renderer_String(String context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - String _render_Object(Object context, List ast, {RendererBase parent}) { var renderer = Renderer_Object(context, parent); @@ -238,19 +117,16 @@ class Renderer_Object extends RendererBase { getValue: (CT_ c) => c.hashCode, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, isNullValue: (CT_ c) => c.hashCode == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); + return renderSimple(c.hashCode, ast, parent: r); }, ), }; @@ -268,376 +144,104 @@ class Renderer_Object extends RendererBase { } } -String _render_bool(bool context, List ast, - {RendererBase parent}) { - var renderer = Renderer_bool(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class Renderer_bool extends RendererBase { - static Map> propertyMap() => { - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - ...Renderer_Object.propertyMap(), - }; - - Renderer_bool(bool context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_int(int context, List ast, - {RendererBase parent}) { - var renderer = Renderer_int(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class Renderer_int extends RendererBase { - static Map> propertyMap() => { - 'bitLength': Property( - getValue: (CT_ c) => c.bitLength, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.bitLength == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.bitLength, ast, parent: r); - }, - ), - 'isEven': Property( - getValue: (CT_ c) => c.isEven, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isEven == true, - ), - 'isOdd': Property( - getValue: (CT_ c) => c.isOdd, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isOdd == true, - ), - 'sign': Property( - getValue: (CT_ c) => c.sign, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.sign == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.sign, ast, parent: r); - }, - ), - ...Renderer_num.propertyMap(), - }; - - Renderer_int(int context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_num(num context, List ast, +String renderBar(Bar context, List ast, {RendererBase parent}) { - var renderer = Renderer_num(context, parent); + var renderer = Renderer_Bar(context, parent); renderer.renderBlock(ast); return renderer.buffer.toString(); } -class Renderer_num extends RendererBase { - static Map> propertyMap() => { - 'hashCode': Property( - getValue: (CT_ c) => c.hashCode, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.hashCode == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.hashCode, ast, parent: r); - }, - ), - 'isFinite': Property( - getValue: (CT_ c) => c.isFinite, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isFinite == true, - ), - 'isInfinite': Property( - getValue: (CT_ c) => c.isInfinite, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isInfinite == true, - ), - 'isNaN': Property( - getValue: (CT_ c) => c.isNaN, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNaN == true, - ), - 'isNegative': Property( - getValue: (CT_ c) => c.isNegative, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_bool.propertyMap().containsKey(name)) { - var nextProperty = Renderer_bool.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - getBool: (CT_ c) => c.isNegative == true, - ), - 'sign': Property( - getValue: (CT_ c) => c.sign, +class Renderer_Bar extends RendererBase { + static Map> propertyMap() => { + 'foo': Property( + getValue: (CT_ c) => c.foo, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) return self.getValue(c).toString(); var name = remainingNames.first; - if (Renderer_num.propertyMap().containsKey(name)) { - var nextProperty = Renderer_num.propertyMap()[name]; + if (Renderer_Foo.propertyMap().containsKey(name)) { + var nextProperty = Renderer_Foo.propertyMap()[name]; return nextProperty.renderVariable( self.getValue(c), nextProperty, [...remainingNames.skip(1)]); } else { - throw MustachioResolutionError(); + throw PartialMustachioResolutionError(name, CT_); } }, - isNullValue: (CT_ c) => c.sign == null, + isNullValue: (CT_ c) => c.foo == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_num(c.sign, ast, parent: r); + return renderFoo(c.foo, ast, parent: r); }, ), - ...Renderer_Object.propertyMap(), - }; - - Renderer_num(num context, RendererBase parent) - : super(context, parent); - - @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; - } else { - return null; - } - } -} - -String _render_List(List context, List ast, - {RendererBase parent}) { - var renderer = Renderer_List(context, parent); - renderer.renderBlock(ast); - return renderer.buffer.toString(); -} - -class Renderer_List extends RendererBase> { - static Map> propertyMap>() => { - 'length': Property( - getValue: (CT_ c) => c.length, + 's2': Property( + getValue: (CT_ c) => c.s2, renderVariable: (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_int.propertyMap().containsKey(name)) { - var nextProperty = Renderer_int.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); } else { - throw MustachioResolutionError(); + throw MustachioResolutionError( + 'Failed to resolve simple renderer use @visibleToMustache'); } }, - isNullValue: (CT_ c) => c.length == null, + isNullValue: (CT_ c) => c.s2 == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_int(c.length, ast, parent: r); + return renderSimple(c.s2, ast, parent: r); }, ), - 'reversed': Property( - getValue: (CT_ c) => c.reversed, - ), ...Renderer_Object.propertyMap(), }; - Renderer_List(List context, RendererBase parent) + Renderer_Bar(Bar context, RendererBase parent) : super(context, parent); @override - Property> getProperty(String key) { - if (propertyMap>().containsKey(key)) { - return propertyMap>()[key]; + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; } else { return null; } } } -String renderBar(Bar context, List ast, +String renderBaz(Baz context, List ast, {RendererBase parent}) { - var renderer = Renderer_Bar(context, parent); + var renderer = Renderer_Baz(context, parent); renderer.renderBlock(ast); return renderer.buffer.toString(); } -class Renderer_Bar extends RendererBase { - static Map> propertyMap() => { - 'foo': Property( - getValue: (CT_ c) => c.foo, - renderVariable: - (CT_ c, Property self, List remainingNames) { - if (remainingNames.isEmpty) return self.getValue(c).toString(); - var name = remainingNames.first; - if (Renderer_Foo.propertyMap().containsKey(name)) { - var nextProperty = Renderer_Foo.propertyMap()[name]; - return nextProperty.renderVariable( - self.getValue(c), nextProperty, [...remainingNames.skip(1)]); - } else { - throw MustachioResolutionError(); - } - }, - isNullValue: (CT_ c) => c.foo == null, - renderValue: (CT_ c, RendererBase r, List ast) { - return renderFoo(c.foo, ast, parent: r); - }, - ), - 's2': Property( - getValue: (CT_ c) => c.s2, +class Renderer_Baz extends RendererBase { + static Map> propertyMap() => { + 'bar': Property( + getValue: (CT_ c) => c.bar, renderVariable: (CT_ c, Property self, List remainingNames) { if (remainingNames.isEmpty) return self.getValue(c).toString(); var name = remainingNames.first; - if (Renderer_String.propertyMap().containsKey(name)) { - var nextProperty = Renderer_String.propertyMap()[name]; + if (Renderer_Bar.propertyMap().containsKey(name)) { + var nextProperty = Renderer_Bar.propertyMap()[name]; return nextProperty.renderVariable( self.getValue(c), nextProperty, [...remainingNames.skip(1)]); } else { - throw MustachioResolutionError(); + throw PartialMustachioResolutionError(name, CT_); } }, - isNullValue: (CT_ c) => c.s2 == null, + isNullValue: (CT_ c) => c.bar == null, renderValue: (CT_ c, RendererBase r, List ast) { - return _render_String(c.s2, ast, parent: r); + return renderBar(c.bar, ast, parent: r); }, ), ...Renderer_Object.propertyMap(), }; - Renderer_Bar(Bar context, RendererBase parent) + Renderer_Baz(Baz context, RendererBase parent) : super(context, parent); @override - Property getProperty(String key) { - if (propertyMap().containsKey(key)) { - return propertyMap()[key]; + Property getProperty(String key) { + if (propertyMap().containsKey(key)) { + return propertyMap()[key]; } else { return null; } diff --git a/test/mustachio/renderer_test.dart b/test/mustachio/renderer_test.dart index c08277845c..238b7af1c7 100644 --- a/test/mustachio/renderer_test.dart +++ b/test/mustachio/renderer_test.dart @@ -7,10 +7,11 @@ import 'foo.renderers.dart'; void main() { test('property map contains all public getters', () { var propertyMap = Renderer_Foo.propertyMap(); - expect(propertyMap.keys, hasLength(4)); + expect(propertyMap.keys, hasLength(5)); expect(propertyMap['b1'], isNotNull); expect(propertyMap['s1'], isNotNull); expect(propertyMap['l1'], isNotNull); + expect(propertyMap['baz'], isNotNull); expect(propertyMap['hashCode'], isNotNull); }); @@ -173,10 +174,10 @@ void main() { }); test('Renderer renders a value section node', () { - var parser = MustachioParser('Text {{#s1}}"{{.}}" ({{length}}){{/s1}}'); + var parser = MustachioParser('Text {{#foo}}Foo: {{s1}}{{/foo}}'); var ast = parser.parse(); - var foo = Foo()..s1 = 'hello'; - expect(renderFoo(foo, ast), equals('Text "hello" (5)')); + var bar = Bar()..foo = (Foo()..s1 = 'hello'); + expect(renderBar(bar, ast), equals('Text Foo: hello')); }); test('Renderer renders a null value section node as blank', () { @@ -236,23 +237,20 @@ void main() { }); test('Renderer resolves outer variable with key with three names', () { - var parser = MustachioParser('Text {{#foo}}{{foo.s1.length}}{{/foo}}'); + var parser = MustachioParser('Text {{#bar}}{{bar.foo.s1}}{{/bar}}'); var ast = parser.parse(); - var bar = Bar() - ..foo = (Foo()..s1 = 'hello') - ..s2 = 'goodbye'; - expect(renderBar(bar, ast), equals('Text 5')); + var baz = Baz()..bar = (Bar()..foo = (Foo()..s1 = 'hello')); + expect(renderBaz(baz, ast), equals('Text hello')); }); test('Renderer resolves outer variable with key with more than three names', () { var parser = - MustachioParser('Text {{#foo}}{{foo.s1.length.isEven}}{{/foo}}'); + MustachioParser('Text {{#bar}}{{bar.foo.baz.bar.foo.s1}}{{/bar}}'); var ast = parser.parse(); - var bar = Bar() - ..foo = (Foo()..s1 = 'hello') - ..s2 = 'goodbye'; - expect(renderBar(bar, ast), equals('Text false')); + var baz = Baz()..bar = (Bar()..foo = (Foo()..s1 = 'hello')); + baz.bar.foo.baz = baz; + expect(renderBaz(baz, ast), equals('Text hello')); }); test('Renderer throws when it cannot resolve a variable key', () { diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index f8fa153aea..71cc551e47 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -88,10 +88,6 @@ import '${p.basename(_sourceUri.path)}'; var info = _typesToProcess.removeFirst(); if (info.isFullRenderer) { - _typeToRenderFunctionName[info._contextType.element] = - info._functionName; - _typeToRendererClassName[info._contextType.element] = - info._rendererClassName; _buildRenderer(info); } } @@ -101,18 +97,19 @@ import '${p.basename(_sourceUri.path)}'; void _addTypesForRendererSpec(RendererSpec spec) { var element = spec._contextType.element; - var rendererInfo = _RendererInfo(element.thisType, spec._name, - public: _rendererClassesArePublic); + var rendererInfo = + _RendererInfo(element, spec._name, public: _rendererClassesArePublic); _typesToProcess.add(rendererInfo); _typeToRenderFunctionName[element] = spec._name; _typeToRendererClassName[element] = rendererInfo._rendererClassName; spec._contextType.accessors.forEach(_addPropertyToProcess); - var superclass = spec._contextType.superclass; + var superclass = spec._contextType.element.supertype; while (superclass != null) { - _addTypeToProcess(superclass.element.thisType, isFullRenderer: true); + // Any type specified with a renderer spec (`@Renderer`) is full. + _addTypeToProcess(superclass.element, isFullRenderer: true); superclass.accessors.forEach(_addPropertyToProcess); - superclass = superclass.superclass; + superclass = superclass.element.supertype; } } @@ -120,7 +117,8 @@ import '${p.basename(_sourceUri.path)}'; /// is a "valid" property. /// /// A "valid" property is a public, instance getter with an interface type - /// return type. + /// return type. Getters annotated with @internal, @protected, + /// @visibleForTesting are not valid. void _addPropertyToProcess(PropertyAccessorElement property) { if (property.isPrivate || property.isStatic || property.isSetter) return; if (property.hasProtected || property.hasVisibleForTesting) return; @@ -136,40 +134,41 @@ import '${p.basename(_sourceUri.path)}'; // renderer for. // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. + var isFullRenderer = _hasVisibleToMustache(innerType.element); while (innerType != null && innerType is InterfaceType) { - _addTypeToProcess((innerType as InterfaceType).element.thisType, - isFullRenderer: true); + _addTypeToProcess((innerType as InterfaceType).element, + isFullRenderer: isFullRenderer); innerType = (innerType as InterfaceType).superclass; } } while (type != null && type is InterfaceType) { - _addTypeToProcess((type as InterfaceType).element.thisType, + _addTypeToProcess((type as InterfaceType).element, isFullRenderer: isFullRenderer); type = (type as InterfaceType).superclass; } } /// Adds [type] to the [_typesToProcess] queue, if it is not already there. - void _addTypeToProcess(InterfaceType type, {@required isFullRenderer}) { - if (type == _typeProvider.typeType) { - // The [Type] type is the first case of a type we don't want to traverse. - return; - } - var typeName = type.element.name; + void _addTypeToProcess(ClassElement element, {@required isFullRenderer}) { + var typeName = element.name; var renderFunctionName = '_render_$typeName'; var typeToProcess = _typesToProcess - .singleWhere((rs) => rs._contextType == type, orElse: () => null); + .singleWhere((rs) => rs._contextClass == element, orElse: () => null); if (typeToProcess == null) { - var rendererInfo = _RendererInfo(type, renderFunctionName, + var rendererInfo = _RendererInfo(element, renderFunctionName, public: _rendererClassesArePublic, isFullRenderer: isFullRenderer); _typesToProcess.add(rendererInfo); - _typeToRenderFunctionName[type.element] = renderFunctionName; - _typeToRendererClassName[type.element] = rendererInfo._rendererClassName; + if (isFullRenderer) { + _typeToRenderFunctionName[element] = renderFunctionName; + _typeToRendererClassName[element] = rendererInfo._rendererClassName; + } } else { if (isFullRenderer && !typeToProcess.isFullRenderer) { // This is the only case in which we update a type-to-render. typeToProcess.isFullRenderer = true; + _typeToRenderFunctionName[element] = renderFunctionName; + _typeToRendererClassName[element] = typeToProcess._rendererClassName; } } } @@ -191,11 +190,12 @@ import '${p.basename(_sourceUri.path)}'; /// The function and the class are each written as Dart code to [_buffer]. void _buildRenderer(_RendererInfo renderer) { var typeName = renderer._typeName; + var typeWithVariables = '$typeName${renderer._typeVariablesString}'; // Write out the render function. _buffer.writeln(''' String ${renderer._functionName}${renderer._typeParametersString}( - $typeName context, List ast, + $typeWithVariables context, List ast, {RendererBase parent}) { var renderer = ${renderer._rendererClassName}(context, parent); renderer.renderBlock(ast); @@ -204,28 +204,22 @@ String ${renderer._functionName}${renderer._typeParametersString}( '''); // Write out the renderer class. - var rendererBaseClass = renderer.isFullRenderer - ? 'RendererBase<$typeName>' - : 'SimpleRendererBase<$typeName>'; _buffer.write(''' class ${renderer._rendererClassName}${renderer._typeParametersString} - extends $rendererBaseClass { + extends RendererBase<$typeWithVariables> { '''); - if (renderer.isFullRenderer) { - _writePropertyMap(renderer); - } + _writePropertyMap(renderer); // Write out the constructor. _buffer.writeln(''' - ${renderer._rendererClassName}($typeName context, RendererBase parent) + ${renderer._rendererClassName}($typeWithVariables context, RendererBase parent) : super(context, parent); '''); var propertyMapTypeArguments = renderer._typeArgumentsStringWith(typeName); var propertyMapName = 'propertyMap$propertyMapTypeArguments'; - if (renderer.isFullRenderer) { - // Write out `getProperty`. - _buffer.writeln(''' + // Write out `getProperty`. + _buffer.writeln(''' @override - Property<$typeName> getProperty(String key) { + Property<$typeWithVariables> getProperty(String key) { if ($propertyMapName().containsKey(key)) { return $propertyMapName()[key]; } else { @@ -233,7 +227,6 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} } } '''); - } // Close the class. _buffer.writeln('}'); } @@ -243,27 +236,29 @@ class ${renderer._rendererClassName}${renderer._typeParametersString} /// For each valid property of the context type of [renderer], this maps the /// property's name to the property's [Property] object. void _writePropertyMap(_RendererInfo renderer) { - var type = renderer._contextType; + var contextClass = renderer._contextClass; var generics = renderer._typeParametersStringWith( '$_contextTypeVariable extends ${renderer._typeName}'); _buffer.writeln('static Map> ' 'propertyMap$generics() => {'); - var interfaceTypedProperties = type.accessors + var interfaceTypedProperties = contextClass.accessors .where((property) => property.type.returnType is InterfaceType); for (var property in [...interfaceTypedProperties] ..sort((a, b) => a.name.compareTo(b.name))) { _writeProperty(renderer, property); } - if (type.superclass != null) { + if (contextClass.supertype != null) { var superclassRendererName = - _typeToRendererClassName[type.superclass.element]; - var superMapName = '$superclassRendererName.propertyMap'; - var generics = _asGenerics([ - ...type.superclass.typeArguments - .map((e) => e.getDisplayString(withNullability: false)), - _contextTypeVariable - ]); - _buffer.writeln(' ...$superMapName$generics(),'); + _typeToRendererClassName[contextClass.supertype.element]; + if (superclassRendererName != null) { + var superMapName = '$superclassRendererName.propertyMap'; + var generics = _asGenerics([ + ...contextClass.supertype.typeArguments + .map((e) => e.getDisplayString(withNullability: false)), + _contextTypeVariable + ]); + _buffer.writeln(' ...$superMapName$generics(),'); + } } _buffer.writeln('};'); _buffer.writeln(''); @@ -299,7 +294,18 @@ renderVariable: return nextProperty.renderVariable( self.getValue(c), nextProperty, [...remainingNames.skip(1)]); } else { - throw MustachioResolutionError(); + throw PartialMustachioResolutionError(name, $_contextTypeVariable); + } +}, +'''); + } else { + _buffer.writeln(''' +renderVariable: + ($_contextTypeVariable c, Property<$_contextTypeVariable> self, List remainingNames) { + if (remainingNames.isEmpty) { + return self.getValue(c).toString(); + } else { + throw MustachioResolutionError('Failed to resolve simple renderer use @visibleToMustache'); } }, '''); @@ -319,14 +325,9 @@ renderVariable: // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. if (innerType is! TypeParameterType) { - var rendererName = _typeToRenderFunctionName[innerType.element]; - if (rendererName == null) { - // We currently don't create renderers for all accessors of all - // accessors of all ... - // TODO(srawlins): Do that, ensuring that the renderer count doesn't - // explode. - } else { - _buffer.writeln(''' + var rendererName = + _typeToRenderFunctionName[innerType.element] ?? 'renderSimple'; + _buffer.writeln(''' isEmptyIterable: ($_contextTypeVariable c) => c.$getterName?.isEmpty ?? true, renderIterable: @@ -338,7 +339,6 @@ renderIterable: return buffer.toString(); }, '''); - } } } else { // Don't add Iterable functions for a generic type, for example @@ -347,14 +347,9 @@ renderIterable: // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. if (getterName is! TypeParameterType) { - var rendererName = _typeToRenderFunctionName[getterType.element]; - if (rendererName == null) { - // We currently don't create renderers for all accessors of all - // accessors of all ... - // TODO(srawlins): Do that, ensuring that the renderer count doesn't - // explode. - } else { - _buffer.writeln(''' + var rendererName = + _typeToRenderFunctionName[getterType.element] ?? 'renderSimple'; + _buffer.writeln(''' isNullValue: ($_contextTypeVariable c) => c.$getterName == null, renderValue: @@ -362,7 +357,6 @@ renderValue: return $rendererName(c.$getterName, ast, parent: r); }, '''); - } } } _buffer.writeln('),'); @@ -376,7 +370,7 @@ renderValue: /// functions and the renderer class), and also to refer from one renderer to /// another. class _RendererInfo { - final InterfaceType _contextType; + final ClassElement _contextClass; /// The name of the top level render function. /// @@ -386,50 +380,60 @@ class _RendererInfo { /// Whether the renderer should be a full renderer. /// + /// If a render spec is not specified with @Renderer, then a class needs to be + /// annotated with @visibleToRender in order to get a full renderer. + /// Otherwise, the [SimpleRenderer] will be used. + /// /// It may be initially determined that we only need an abbreviated, then /// later determined that we need a full renderer, so this field is not final. bool isFullRenderer; - factory _RendererInfo(InterfaceType contextType, String functionName, + factory _RendererInfo(ClassElement contextClass, String functionName, {bool public = false, bool isFullRenderer = true}) { - var typeBaseName = contextType.element.name; + var typeBaseName = contextClass.name; var rendererClassName = public ? 'Renderer_$typeBaseName' : '_Renderer_$typeBaseName'; - return _RendererInfo._(contextType, functionName, rendererClassName, + return _RendererInfo._(contextClass, functionName, rendererClassName, isFullRenderer: isFullRenderer); } _RendererInfo._( - this._contextType, this._functionName, this._rendererClassName, + this._contextClass, this._functionName, this._rendererClassName, {@required this.isFullRenderer}); - String get _typeName => _contextType.getDisplayString(withNullability: false); + String get _typeName => _contextClass.name; final String _rendererClassName; /// The type parameters of the context type, if any, as a String, including - /// the angled brackets, otherwise a blank String. + /// bounds and the angled brackets, otherwise a blank String. String get _typeParametersString { - return _asGenerics(_contextType.element.typeParameters + return _asGenerics(_contextClass.typeParameters .map((tp) => tp.getDisplayString(withNullability: false))); } + /// The type variables of the context type, if any, as a String, including + /// the angled brackets, otherwise a blank String. + String get _typeVariablesString { + return _asGenerics(_contextClass.typeParameters.map((tp) => tp.name)); + } + /// Returns the type parameters of the context type, and [extra], as they /// appear in a list of generics. String _typeParametersStringWith(String extra) { return _asGenerics([ - ..._contextType.element.typeParameters + ..._contextClass.typeParameters .map((tp) => tp.getDisplayString(withNullability: false)), extra, ]); } - /// Returns the type parameters of the context type, and [extra], as they + /// Returns the type arguments of the context type, and [extra], as they /// appear in a list of generics. String _typeArgumentsStringWith(String extra) { return _asGenerics([ - ..._contextType.typeArguments + ..._contextClass.thisType.typeArguments .map((tp) => tp.getDisplayString(withNullability: false)), extra, ]); From a9e4b5aa3ad736a6eb4b81e5b92e69fa7e620b1a Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Fri, 11 Dec 2020 14:49:21 -0800 Subject: [PATCH 3/4] nit --- tool/mustachio/codegen_runtime_renderer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 71cc551e47..005703de1e 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -117,7 +117,7 @@ import '${p.basename(_sourceUri.path)}'; /// is a "valid" property. /// /// A "valid" property is a public, instance getter with an interface type - /// return type. Getters annotated with @internal, @protected, + /// return type. Getters annotated with @internal, @protected, or /// @visibleForTesting are not valid. void _addPropertyToProcess(PropertyAccessorElement property) { if (property.isPrivate || property.isStatic || property.isSetter) return; From 527df4e35045568ab45e2d00fd51a1be21bd7710 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 14 Dec 2020 11:01:19 -0800 Subject: [PATCH 4/4] Switch visibleToMustache annotation to be a field on @Renderer --- lib/src/mustachio/annotations.dart | 17 ++++++------ test/mustachio/builder_test.dart | 9 ++++--- tool/mustachio/builder.dart | 10 ++++++- tool/mustachio/codegen_runtime_renderer.dart | 28 +++++++++++++------- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/lib/src/mustachio/annotations.dart b/lib/src/mustachio/annotations.dart index 450b1ef70a..d101fd182b 100644 --- a/lib/src/mustachio/annotations.dart +++ b/lib/src/mustachio/annotations.dart @@ -7,7 +7,14 @@ class Renderer { /// The type of the context type, specified as the [Context] type argument. final Context context; - const Renderer(this.name, this.context); + /// A set of types which are "visible" to Mustache. Mustache rendering has + /// access to all of a type's public getters if it is visible to Mustache. + /// + /// Note that all subtypes and supertypes of a "visible" type are also visible + /// to Mustache. + final Set visibleTypes; + + const Renderer(this.name, this.context, {this.visibleTypes = const {}}); } /// A container for a type, [T], which is the type of a context object, @@ -17,11 +24,3 @@ class Renderer { class Context { const Context(); } - -class _VisibleToMustache { - const _VisibleToMustache(); -} - -/// An annotation used to denote a class which should have a "full renderer." A -/// full renderer gives Mustachio access to the class's fields (getters). -const visibleToMustache = _VisibleToMustache(); diff --git a/test/mustachio/builder_test.dart b/test/mustachio/builder_test.dart index 211c7663b1..260d8b8cd4 100644 --- a/test/mustachio/builder_test.dart +++ b/test/mustachio/builder_test.dart @@ -13,7 +13,9 @@ class Renderer { final Context context; - const Renderer(this.name, this.context); + final Set visibleTypes; + + const Renderer(this.name, this.context, {this.visibleTypes = const {}}); } class Context { @@ -23,8 +25,7 @@ class Context { }; const _libraryFrontMatter = ''' -@Renderer(#renderFoo, Context()) -@Renderer(#renderBar, Context()) +@Renderer(#renderFoo, Context(), visibleTypes: {Bar}) library foo; import 'package:mustachio/annotations.dart'; '''; @@ -116,7 +117,7 @@ class Bar {} }); test('for a type found in a getter', () { - expect(renderersLibrary.getTopLevelFunction('renderBar'), isNotNull); + expect(renderersLibrary.getTopLevelFunction('_render_Bar'), isNotNull); expect(renderersLibrary.getType('_Renderer_Bar'), isNotNull); }); diff --git a/tool/mustachio/builder.dart b/tool/mustachio/builder.dart index 29b13e0b77..dd9fd0c960 100644 --- a/tool/mustachio/builder.dart +++ b/tool/mustachio/builder.dart @@ -90,7 +90,15 @@ class _RendererGatherer { assert(contextFieldType.typeArguments.length == 1); var contextType = contextFieldType.typeArguments.single; - return RendererSpec(nameField.toSymbolValue(), contextType); + var visibleTypesField = constantValue.getField('visibleTypes'); + if (visibleTypesField.isNull) { + throw StateError('@Renderer visibleTypes must not be null'); + } + var visibleTypes = { + ...visibleTypesField.toSetValue().map((object) => object.toTypeValue()) + }; + + return RendererSpec(nameField.toSymbolValue(), contextType, visibleTypes); } } diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 005703de1e..67456ebb45 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -19,14 +19,22 @@ class RendererSpec { final InterfaceType _contextType; - RendererSpec(this._name, this._contextType); + final Set _visibleTypes; + + RendererSpec(this._name, this._contextType, this._visibleTypes); } /// Builds [specs] into a Dart library containing runtime renderers. String buildTemplateRenderers(Set specs, Uri sourceUri, TypeProvider typeProvider, TypeSystem typeSystem, {bool rendererClassesArePublic = false}) { - var raw = RuntimeRenderersBuilder(sourceUri, typeProvider, typeSystem, + var allVisibleTypes = specs + .map((spec) => spec._visibleTypes) + .reduce((value, element) => value.union(element)) + .map((type) => type.element) + .toSet(); + var raw = RuntimeRenderersBuilder( + sourceUri, typeProvider, typeSystem, allVisibleTypes, rendererClassesArePublic: rendererClassesArePublic) ._buildTemplateRenderers(specs); return DartFormatter().format(raw.toString()); @@ -55,10 +63,13 @@ class RuntimeRenderersBuilder { final TypeProvider _typeProvider; final TypeSystem _typeSystem; + final Set _allVisibleElements; + /// Whether renderer classes are public. This should only be true for testing. final bool _rendererClassesArePublic; RuntimeRenderersBuilder(this._sourceUri, this._typeProvider, this._typeSystem, + this._allVisibleElements, {bool rendererClassesArePublic = false}) : _rendererClassesArePublic = rendererClassesArePublic; @@ -123,7 +134,7 @@ import '${p.basename(_sourceUri.path)}'; if (property.isPrivate || property.isStatic || property.isSetter) return; if (property.hasProtected || property.hasVisibleForTesting) return; var type = property.type.returnType; - var isFullRenderer = _hasVisibleToMustache(type.element); + var isFullRenderer = _isVisibleToMustache(type.element); if (_typeSystem.isAssignableTo(type, _typeProvider.iterableDynamicType)) { var iterableElement = _typeProvider.iterableElement; @@ -134,7 +145,7 @@ import '${p.basename(_sourceUri.path)}'; // renderer for. // TODO(srawlins): Find a solution for this. We can track all of the // concrete types substituted for `E` for example. - var isFullRenderer = _hasVisibleToMustache(innerType.element); + var isFullRenderer = _isVisibleToMustache(innerType.element); while (innerType != null && innerType is InterfaceType) { _addTypeToProcess((innerType as InterfaceType).element, isFullRenderer: isFullRenderer); @@ -173,16 +184,15 @@ import '${p.basename(_sourceUri.path)}'; } } - /// Returns whether [element] or any of its supertypes are annotated with - /// `visibleToMustache`. - bool _hasVisibleToMustache(ClassElement element) { - if (element.metadata.any((m) => m.element?.name == 'visibleToMustache')) { + /// Returns whether [element] or any of its supertypes are "visible" to Mustache. + bool _isVisibleToMustache(ClassElement element) { + if (_allVisibleElements.contains(element)) { return true; } if (element.supertype == null) { return false; } - return _hasVisibleToMustache(element.supertype.element); + return _isVisibleToMustache(element.supertype.element); } /// Builds both the render function and the renderer class for [renderer].