Access TemplateRenderer from PackageGraph like other renderers (#2114)

* Consolidate property templates

* Access TemplateRenderer from package graph

* Update test file
diff --git a/lib/src/html/html_generator_instance.dart b/lib/src/html/html_generator_instance.dart
index b82bbc4..e82fe1b 100644
--- a/lib/src/html/html_generator_instance.dart
+++ b/lib/src/html/html_generator_instance.dart
@@ -8,7 +8,6 @@
 
 import 'package:collection/collection.dart' show compareNatural;
 import 'package:dartdoc/src/html/html_generator.dart' show HtmlGeneratorOptions;
-import 'package:dartdoc/src/html/template_render_helper.dart';
 import 'package:dartdoc/src/html/resource_loader.dart' as loader;
 import 'package:dartdoc/src/html/resources.g.dart' as resources;
 import 'package:dartdoc/src/html/template_data.dart';
@@ -29,7 +28,6 @@
   final PackageGraph _packageGraph;
   final List<Indexable> _indexedElements = <Indexable>[];
   final FileWriter _writer;
-  final HtmlRenderHelper _templateHelper = HtmlRenderHelper();
 
   HtmlGeneratorInstance(
       this._options, this._templates, this._packageGraph, this._writer);
@@ -281,8 +279,7 @@
   }
 
   void generatePackage(PackageGraph packageGraph, Package package) {
-    TemplateData data =
-        PackageTemplateData(_options, packageGraph, _templateHelper, package);
+    TemplateData data = PackageTemplateData(_options, packageGraph, package);
     logInfo('documenting ${package.name}');
 
     _build(package.filePath, _templates.indexTemplate, data);
@@ -292,8 +289,7 @@
   void generateCategory(PackageGraph packageGraph, Category category) {
     logInfo(
         'Generating docs for category ${category.name} from ${category.package.fullyQualifiedName}...');
-    TemplateData data =
-        CategoryTemplateData(_options, packageGraph, _templateHelper, category);
+    TemplateData data = CategoryTemplateData(_options, packageGraph, category);
 
     _build(category.filePath, _templates.categoryTemplate, data);
   }
@@ -304,98 +300,86 @@
     if (!lib.isAnonymous && !lib.hasDocumentation) {
       packageGraph.warnOnElement(lib, PackageWarning.noLibraryLevelDocs);
     }
-    TemplateData data =
-        LibraryTemplateData(_options, packageGraph, _templateHelper, lib);
+    TemplateData data = LibraryTemplateData(_options, packageGraph, lib);
 
     _build(lib.filePath, _templates.libraryTemplate, data);
   }
 
   void generateClass(PackageGraph packageGraph, Library lib, Class clazz) {
-    TemplateData data =
-        ClassTemplateData(_options, packageGraph, _templateHelper, lib, clazz);
+    TemplateData data = ClassTemplateData(_options, packageGraph, lib, clazz);
     _build(clazz.filePath, _templates.classTemplate, data);
   }
 
   void generateExtension(
       PackageGraph packageGraph, Library lib, Extension extension) {
-    TemplateData data = ExtensionTemplateData(
-        _options, packageGraph, _templateHelper, lib, extension);
+    TemplateData data =
+        ExtensionTemplateData(_options, packageGraph, lib, extension);
     _build(extension.filePath, _templates.extensionTemplate, data);
   }
 
   void generateMixins(PackageGraph packageGraph, Library lib, Mixin mixin) {
-    TemplateData data =
-        MixinTemplateData(_options, packageGraph, _templateHelper, lib, mixin);
+    TemplateData data = MixinTemplateData(_options, packageGraph, lib, mixin);
     _build(mixin.filePath, _templates.mixinTemplate, data);
   }
 
   void generateConstructor(PackageGraph packageGraph, Library lib, Class clazz,
       Constructor constructor) {
     TemplateData data = ConstructorTemplateData(
-        _options, packageGraph, _templateHelper, lib, clazz, constructor);
+        _options, packageGraph, lib, clazz, constructor);
 
     _build(constructor.filePath, _templates.constructorTemplate, data);
   }
 
   void generateEnum(PackageGraph packageGraph, Library lib, Enum eNum) {
-    TemplateData data =
-        EnumTemplateData(_options, packageGraph, _templateHelper, lib, eNum);
+    TemplateData data = EnumTemplateData(_options, packageGraph, lib, eNum);
 
     _build(eNum.filePath, _templates.enumTemplate, data);
   }
 
   void generateFunction(
       PackageGraph packageGraph, Library lib, ModelFunction function) {
-    TemplateData data = FunctionTemplateData(
-        _options, packageGraph, _templateHelper, lib, function);
+    TemplateData data =
+        FunctionTemplateData(_options, packageGraph, lib, function);
 
     _build(function.filePath, _templates.functionTemplate, data);
   }
 
   void generateMethod(
       PackageGraph packageGraph, Library lib, Container clazz, Method method) {
-    TemplateData data = MethodTemplateData(
-        _options, packageGraph, _templateHelper, lib, clazz, method);
+    TemplateData data =
+        MethodTemplateData(_options, packageGraph, lib, clazz, method);
 
     _build(method.filePath, _templates.methodTemplate, data);
   }
 
-  void generateConstant(
-      PackageGraph packageGraph, Library lib, Container clazz, Field property) {
-    TemplateData data = ConstantTemplateData(
-        _options, packageGraph, _templateHelper, lib, clazz, property);
-
-    _build(property.filePath, _templates.constantTemplate, data);
-  }
+  void generateConstant(PackageGraph packageGraph, Library lib, Container clazz,
+          Field property) =>
+      generateProperty(packageGraph, lib, clazz, property);
 
   void generateProperty(
       PackageGraph packageGraph, Library lib, Container clazz, Field property) {
-    TemplateData data = PropertyTemplateData(
-        _options, packageGraph, _templateHelper, lib, clazz, property);
+    TemplateData data =
+        PropertyTemplateData(_options, packageGraph, lib, clazz, property);
 
     _build(property.filePath, _templates.propertyTemplate, data);
   }
 
   void generateTopLevelProperty(
       PackageGraph packageGraph, Library lib, TopLevelVariable property) {
-    TemplateData data = TopLevelPropertyTemplateData(
-        _options, packageGraph, _templateHelper, lib, property);
+    TemplateData data =
+        TopLevelPropertyTemplateData(_options, packageGraph, lib, property);
 
     _build(property.filePath, _templates.topLevelPropertyTemplate, data);
   }
 
   void generateTopLevelConstant(
-      PackageGraph packageGraph, Library lib, TopLevelVariable property) {
-    TemplateData data = TopLevelConstTemplateData(
-        _options, packageGraph, _templateHelper, lib, property);
-
-    _build(property.filePath, _templates.topLevelConstantTemplate, data);
-  }
+          PackageGraph packageGraph, Library lib, TopLevelVariable property) =>
+      generateTopLevelProperty(packageGraph, lib, property);
 
   void generateTypeDef(
       PackageGraph packageGraph, Library lib, Typedef typeDef) {
-    TemplateData data = TypedefTemplateData(
-        _options, packageGraph, _templateHelper, lib, typeDef);
+    TemplateData data =
+        TypedefTemplateData(_options, packageGraph, lib, typeDef);
 
     _build(typeDef.filePath, _templates.typeDefTemplate, data);
   }
diff --git a/lib/src/html/template_data.dart b/lib/src/html/template_data.dart
index 0bcef5e..464bff6 100644
--- a/lib/src/html/template_data.dart
+++ b/lib/src/html/template_data.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:dartdoc/src/html/template_render_helper.dart';
+import 'package:dartdoc/src/render/template_renderer.dart';
 import 'package:dartdoc/src/model/model.dart';
 
 abstract class HtmlOptions {
@@ -14,9 +14,8 @@
 abstract class TemplateData<T extends Documentable> {
   final PackageGraph packageGraph;
   final HtmlOptions htmlOptions;
-  final TemplateRenderHelper _renderHelper;
 
-  TemplateData(this.htmlOptions, this.packageGraph, this._renderHelper);
+  TemplateData(this.htmlOptions, this.packageGraph);
 
   String get title;
   String get layoutTitle;
@@ -42,14 +41,15 @@
   bool get useBaseHref => htmlOptions.useBaseHref;
 
   String _layoutTitle(String name, String kind, bool isDeprecated) =>
-      _renderHelper.composeLayoutTitle(name, kind, isDeprecated);
+      packageGraph.rendererFactory.templateRenderer
+          .composeLayoutTitle(name, kind, isDeprecated);
 }
 
 class PackageTemplateData extends TemplateData<Package> {
   final Package package;
-  PackageTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.package)
-      : super(htmlOptions, packageGraph, renderHelper);
+  PackageTemplateData(
+      HtmlOptions htmlOptions, PackageGraph packageGraph, this.package)
+      : super(htmlOptions, packageGraph);
 
   @override
   bool get includeVersion => true;
@@ -77,9 +77,9 @@
 class CategoryTemplateData extends TemplateData<Category> {
   final Category category;
 
-  CategoryTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.category)
-      : super(htmlOptions, packageGraph, renderHelper);
+  CategoryTemplateData(
+      HtmlOptions htmlOptions, PackageGraph packageGraph, this.category)
+      : super(htmlOptions, packageGraph);
 
   @override
   String get title => '${category.name} ${category.kind} - Dart API';
@@ -104,9 +104,9 @@
 class LibraryTemplateData extends TemplateData<Library> {
   final Library library;
 
-  LibraryTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.library)
-      : super(htmlOptions, packageGraph, renderHelper);
+  LibraryTemplateData(
+      HtmlOptions htmlOptions, PackageGraph packageGraph, this.library)
+      : super(htmlOptions, packageGraph);
 
   @override
   String get title => '${library.name} library - Dart API';
@@ -131,8 +131,8 @@
   final Mixin mixin;
 
   MixinTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, Library library, this.mixin)
-      : super(htmlOptions, packageGraph, renderHelper, library, mixin);
+      Library library, this.mixin)
+      : super(htmlOptions, packageGraph, library, mixin);
 
   @override
   Mixin get self => mixin;
@@ -145,8 +145,8 @@
   Class _objectType;
 
   ClassTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.library, this.clazz)
-      : super(htmlOptions, packageGraph, renderHelper);
+      this.library, this.clazz)
+      : super(htmlOptions, packageGraph);
 
   @override
   T get self => clazz;
@@ -190,8 +190,8 @@
   final Library library;
 
   ExtensionTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.library, this.extension)
-      : super(htmlOptions, packageGraph, renderHelper);
+      this.library, this.extension)
+      : super(htmlOptions, packageGraph);
 
   @override
   T get self => extension;
@@ -217,14 +217,9 @@
   final Class clazz;
   final Constructor constructor;
 
-  ConstructorTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      this.library,
-      this.clazz,
-      this.constructor)
-      : super(htmlOptions, packageGraph, renderHelper);
+  ConstructorTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
+      this.library, this.clazz, this.constructor)
+      : super(htmlOptions, packageGraph);
 
   @override
   Constructor get self => constructor;
@@ -250,8 +245,8 @@
 
 class EnumTemplateData extends ClassTemplateData<Enum> {
   EnumTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, Library library, Enum eNum)
-      : super(htmlOptions, packageGraph, renderHelper, library, eNum);
+      Library library, Enum eNum)
+      : super(htmlOptions, packageGraph, library, eNum);
 
   Enum get eNum => clazz;
   @override
@@ -263,8 +258,8 @@
   final Library library;
 
   FunctionTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.library, this.function)
-      : super(htmlOptions, packageGraph, renderHelper);
+      this.library, this.function)
+      : super(htmlOptions, packageGraph);
 
   @override
   ModelFunction get self => function;
@@ -290,14 +285,9 @@
   final Container container;
   String containerDesc;
 
-  MethodTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      this.library,
-      this.container,
-      this.method)
-      : super(htmlOptions, packageGraph, renderHelper) {
+  MethodTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
+      this.library, this.container, this.method)
+      : super(htmlOptions, packageGraph) {
     containerDesc = container.isClass ? 'class' : 'extension';
   }
 
@@ -328,14 +318,9 @@
   final Field property;
   String containerDesc;
 
-  PropertyTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      this.library,
-      this.container,
-      this.property)
-      : super(htmlOptions, packageGraph, renderHelper) {
+  PropertyTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
+      this.library, this.container, this.property)
+      : super(htmlOptions, packageGraph) {
     containerDesc = container.isClass ? 'class' : 'extension';
   }
 
@@ -344,14 +329,14 @@
 
   @override
   String get title =>
-      '${property.name} $type - ${container.name} ${containerDesc} - '
+      '${property.name} $_type - ${container.name} ${containerDesc} - '
       '${library.name} library - Dart API';
   @override
   String get layoutTitle =>
-      _layoutTitle(property.name, type, property.isDeprecated);
+      _layoutTitle(property.name, _type, property.isDeprecated);
   @override
   String get metaDescription =>
-      'API docs for the ${property.name} $type from the '
+      'API docs for the ${property.name} $_type from the '
       '${container.name} ${containerDesc}, for the Dart programming language.';
   @override
   List get navLinks => [packageGraph.defaultPackage, library];
@@ -360,22 +345,7 @@
   @override
   String get htmlBase => '../../';
 
-  String get type => 'property';
-}
-
-class ConstantTemplateData extends PropertyTemplateData {
-  ConstantTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      Library library,
-      Container container,
-      Field property)
-      : super(htmlOptions, packageGraph, renderHelper, library, container,
-            property);
-
-  @override
-  String get type => 'constant';
+  String get _type => property.isConst ? 'constant' : 'property';
 }
 
 class TypedefTemplateData extends TemplateData<Typedef> {
@@ -383,8 +353,8 @@
   final Typedef typeDef;
 
   TypedefTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper, this.library, this.typeDef)
-      : super(htmlOptions, packageGraph, renderHelper);
+      this.library, this.typeDef)
+      : super(htmlOptions, packageGraph);
 
   @override
   Typedef get self => typeDef;
@@ -409,13 +379,9 @@
   final Library library;
   final TopLevelVariable property;
 
-  TopLevelPropertyTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      this.library,
-      this.property)
-      : super(htmlOptions, packageGraph, renderHelper);
+  TopLevelPropertyTemplateData(HtmlOptions htmlOptions,
+      PackageGraph packageGraph, this.library, this.property)
+      : super(htmlOptions, packageGraph);
 
   @override
   TopLevelVariable get self => property;
@@ -435,18 +401,5 @@
   @override
   String get htmlBase => '../';
 
-  String get _type => 'property';
-}
-
-class TopLevelConstTemplateData extends TopLevelPropertyTemplateData {
-  TopLevelConstTemplateData(
-      HtmlOptions htmlOptions,
-      PackageGraph packageGraph,
-      TemplateRenderHelper renderHelper,
-      Library library,
-      TopLevelVariable property)
-      : super(htmlOptions, packageGraph, renderHelper, library, property);
-
-  @override
-  String get _type => 'constant';
+  String get _type => property.isConst ? 'constant' : 'property';
 }
diff --git a/lib/src/render/renderer_factory.dart b/lib/src/render/renderer_factory.dart
index 7144c3f..f878722 100644
--- a/lib/src/render/renderer_factory.dart
+++ b/lib/src/render/renderer_factory.dart
@@ -9,10 +9,13 @@
 import 'package:dartdoc/src/render/enum_field_renderer.dart';
 import 'package:dartdoc/src/render/model_element_renderer.dart';
 import 'package:dartdoc/src/render/parameter_renderer.dart';
+import 'package:dartdoc/src/render/template_renderer.dart';
 import 'package:dartdoc/src/render/type_parameters_renderer.dart';
 import 'package:dartdoc/src/render/typedef_renderer.dart';
 
 abstract class RendererFactory {
+  TemplateRenderer get templateRenderer;
+
   CategoryRenderer get categoryRenderer;
 
   DocumentationRenderer get documentationRenderer;
@@ -40,6 +43,9 @@
 
 class HtmlRenderFactory extends RendererFactory {
   @override
+  TemplateRenderer get templateRenderer => HtmlTemplateRenderer();
+
+  @override
   CategoryRenderer get categoryRenderer => CategoryRendererHtml();
 
   @override
diff --git a/lib/src/html/template_render_helper.dart b/lib/src/render/template_renderer.dart
similarity index 84%
rename from lib/src/html/template_render_helper.dart
rename to lib/src/render/template_renderer.dart
index bef51f3..3e0ed15 100644
--- a/lib/src/html/template_render_helper.dart
+++ b/lib/src/render/template_renderer.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class TemplateRenderHelper {
+abstract class TemplateRenderer {
   String composeLayoutTitle(String name, String kind, bool isDeprecated);
 }
 
-class HtmlRenderHelper implements TemplateRenderHelper {
+class HtmlTemplateRenderer implements TemplateRenderer {
   @override
   String composeLayoutTitle(String name, String kind, bool isDeprecated) {
     if (isDeprecated) {
diff --git a/test/html/html_render_helper_test.dart b/test/html/html_template_renderer_test.dart
similarity index 61%
rename from test/html/html_render_helper_test.dart
rename to test/html/html_template_renderer_test.dart
index fb0fd1f..e0611b9 100644
--- a/test/html/html_render_helper_test.dart
+++ b/test/html/html_template_renderer_test.dart
@@ -2,24 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:dartdoc/src/html/template_render_helper.dart';
+import 'package:dartdoc/src/render/template_renderer.dart';
 import 'package:test/test.dart';
 
 void main() {
-  group('HtmlTemplateHelper', () {
-    HtmlRenderHelper renderHelper;
+  group('HtmlTemplateRenderer', () {
+    HtmlTemplateRenderer renderer;
 
     setUpAll(() {
-      renderHelper = HtmlRenderHelper();
+      renderer = HtmlTemplateRenderer();
     });
 
     test('composeLayoutTitle', () {
-      String test = renderHelper.composeLayoutTitle('Banana', 'Fruit', false);
+      String test = renderer.composeLayoutTitle('Banana', 'Fruit', false);
       expect(test, equals('Banana Fruit'));
     });
 
     test('composeLayoutTitle deprecated', () {
-      String test = renderHelper.composeLayoutTitle('Banana', 'Fruit', true);
+      String test = renderer.composeLayoutTitle('Banana', 'Fruit', true);
       expect(test, equals('<span class="deprecated">Banana</span> Fruit'));
     });
   });