Finish package-centered refactor of template data (#1699)

* Fix bug where --version didn't do anything

* Review comments

* Rebuild test package docs for retype deprecation in dev.55

* dartdoc_test as full integration test now

* Eliminate unused initializer and update pubspec

* allow unversioned

* Add test

* Add gitignore to test_package_minimum

* Squash changes

* fix tests

* dartfmt + fix class templating

* dartfmt

* Remove extra copy of contextFromArgvTemp introduced in merge resolution
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index 6f963c1..1861e48 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -219,7 +219,7 @@
     }
 
     if (referredFromElements.isEmpty && referredFrom == 'index.html')
-      referredFromElements.add(packageGraph);
+      referredFromElements.add(packageGraph.defaultPackage);
     String message = warnOn;
     if (referredFrom == 'index.json') message = '$warnOn (from index.json)';
     packageGraph.warnOnElement(warnOnElement, kind,
diff --git a/lib/src/html/html_generator_instance.dart b/lib/src/html/html_generator_instance.dart
index c4bc561..58c8ae3 100644
--- a/lib/src/html/html_generator_instance.dart
+++ b/lib/src/html/html_generator_instance.dart
@@ -87,7 +87,7 @@
   void _generateDocs() {
     if (_packageGraph == null) return;
 
-    generatePackage();
+    generatePackage(_packageGraph, _packageGraph.defaultPackage);
 
     for (var package in _packageGraph.localPackages) {
       for (var lib in filterNonDocumented(package.libraries)) {
@@ -164,9 +164,10 @@
     }
   }
 
-  void generatePackage() {
-    TemplateData data = new PackageTemplateData(_options, _packageGraph);
-    logInfo('documenting ${_packageGraph.name}');
+  void generatePackage(PackageGraph packageGraph, Package package) {
+    TemplateData data =
+        new PackageTemplateData(_options, packageGraph, package);
+    logInfo('documenting ${package.name}');
 
     _build('index.html', _templates.indexTemplate, data);
   }
diff --git a/lib/src/html/template_data.dart b/lib/src/html/template_data.dart
index 7014a5c..290640e 100644
--- a/lib/src/html/template_data.dart
+++ b/lib/src/html/template_data.dart
@@ -82,8 +82,10 @@
   }
 }
 
-class PackageTemplateData extends TemplateData<PackageGraph> {
-  PackageTemplateData(HtmlOptions htmlOptions, PackageGraph packageGraph)
+class PackageTemplateData extends TemplateData<Package> {
+  final Package package;
+  PackageTemplateData(
+      HtmlOptions htmlOptions, PackageGraph packageGraph, this.package)
       : super(htmlOptions, packageGraph);
 
   @override
@@ -91,26 +93,25 @@
   @override
   List get navLinks => [];
   @override
-  String get title => '${packageGraph.name} - Dart API docs';
+  String get title => '${package.name} - Dart API docs';
   @override
-  PackageGraph get self => packageGraph;
+  Package get self => package;
   @override
-  String get layoutTitle => _layoutTitle(packageGraph.name, kind, false);
+  String get layoutTitle => _layoutTitle(package.name, kind, false);
   @override
   String get metaDescription =>
-      '${packageGraph.name} API docs, for the Dart programming language.';
+      '${package.name} API docs, for the Dart programming language.';
   @override
   Iterable<Subnav> getSubNavItems() {
-    return [new Subnav('Libraries', '${packageGraph.href}#libraries')];
+    return [new Subnav('Libraries', '${package.href}#libraries')];
   }
 
   @override
-  bool get hasHomepage => packageGraph.hasHomepage;
+  bool get hasHomepage => package.hasHomepage;
   @override
-  String get homepage => packageGraph.homepage;
-
+  String get homepage => package.homepage;
   @override
-  String get kind => packageGraph.kind;
+  String get kind => package.kind;
 
   /// `null` for packages because they are at the root – not needed
   @override
@@ -134,7 +135,7 @@
   String get metaDescription =>
       '${library.name} library API docs, for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph];
+  List get navLinks => [packageGraph.defaultPackage];
   @override
   Iterable<Subnav> getSubNavItems() sync* {
     if (library.hasPublicClasses)
@@ -186,7 +187,7 @@
   String get layoutTitle => _layoutTitle(
       clazz.nameWithLinkedGenerics, clazz.fullkind, clazz.isDeprecated);
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   String get htmlBase => '..';
   @override
@@ -238,7 +239,7 @@
   String get layoutTitle => _layoutTitle(
       constructor.name, constructor.fullKind, constructor.isDeprecated);
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   List get navLinksWithGenerics => [clazz];
   @override
@@ -273,7 +274,7 @@
       'API docs for the ${eNum.name} enum from the ${library.name} library, '
       'for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   String get htmlBase => '..';
   @override
@@ -306,7 +307,7 @@
       'API docs for the ${function.name} function from the '
       '${library.name} library, for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   Iterable<Subnav> getSubNavItems() => _gatherSubnavForInvokable(function);
   @override
@@ -335,7 +336,7 @@
       'API docs for the ${method.name} method from the ${clazz.name} class, '
       'for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   List get navLinksWithGenerics => [clazz];
   @override
@@ -367,7 +368,7 @@
       'API docs for the ${property.name} $type from the ${clazz.name} class, '
       'for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   List get navLinksWithGenerics => [clazz];
   @override
@@ -407,7 +408,7 @@
       'API docs for the ${typeDef.name} property from the '
       '${library.name} library, for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   String get htmlBase => '..';
   @override
@@ -436,7 +437,7 @@
       'API docs for the ${property.name} $_type from the '
       '${library.name} library, for the Dart programming language.';
   @override
-  List get navLinks => [packageGraph, library];
+  List get navLinks => [packageGraph.defaultPackage, library];
   @override
   String get htmlBase => '..';
 
diff --git a/lib/src/html/templates.dart b/lib/src/html/templates.dart
index 42189ef..c339092 100644
--- a/lib/src/html/templates.dart
+++ b/lib/src/html/templates.dart
@@ -13,6 +13,7 @@
 const _partials = const <String>[
   'callable',
   'callable_multiline',
+  'class',
   'constant',
   'footer',
   'head',
diff --git a/lib/src/model.dart b/lib/src/model.dart
index 5d3750b..c41682a 100644
--- a/lib/src/model.dart
+++ b/lib/src/model.dart
@@ -1064,7 +1064,7 @@
       o is Class &&
       name == o.name &&
       o.library.name == library.name &&
-      o.library.packageGraph.name == library.packageGraph.name;
+      o.library.package.name == library.package.name;
 }
 
 class Constructor extends ModelElement
@@ -1222,7 +1222,7 @@
     // Penalty for deprecated libraries.
     if (lib.isDeprecated) scoredCandidate.alterScore(-1.0, 'is deprecated');
     // Give a big boost if the library has the package name embedded in it.
-    if (packageGraph.namePieces.intersection(lib.namePieces).length > 0) {
+    if (lib.package.namePieces.intersection(lib.namePieces).length > 0) {
       scoredCandidate.alterScore(1.0, 'embeds package name');
     }
     // Give a tiny boost for libraries with long names, assuming they're
@@ -3928,8 +3928,7 @@
   String get typeName => 'operator';
 }
 
-class PackageGraph extends Canonicalization
-    with Nameable, Warnable, LibraryContainer {
+class PackageGraph {
   // TODO(jcollins-g): This constructor is convoluted.  Clean this up by
   // building Libraries and adding them to Packages, then adding Packages
   // to this graph.
@@ -3952,6 +3951,10 @@
       assert(!_elementToLibrary.containsKey(lib.element));
       _elementToLibrary[element] = lib;
     });
+
+    // Make sure the default package exists, even if it has no libraries.
+    // This can happen for packages that only contain embedder SDKs.
+    new Package.fromPackageMeta(packageMeta, this);
     allLibrariesAdded = true;
 
     // Go through docs of every ModelElement in package to pre-build the macros
@@ -3975,12 +3978,6 @@
   /// is true.
   bool allImplementorsAdded = false;
 
-  @override
-  List<String> get containerOrder => [];
-
-  @override
-  LibraryContainer get enclosingContainer => null;
-
   Map<String, List<Class>> get implementors {
     assert(allImplementorsAdded);
     return _implementors;
@@ -4007,8 +4004,10 @@
   /// PackageMeta for the default package.
   final PackageMeta packageMeta;
 
+  /// Name of the default package.
+  String get defaultPackageName => packageMeta.name;
+
   /// Dartdoc's configuration flags.
-  @override
   final DartdocOptionContext config;
 
   Map<String, Map<String, dynamic>> __crossdartJson;
@@ -4032,16 +4031,14 @@
     return __crossdartJson;
   }
 
-  @override
-  Set<String> get locationPieces => new Set();
+  Package _defaultPackage;
+  Package get defaultPackage {
+    if (_defaultPackage == null) {
+      _defaultPackage = new Package.fromPackageMeta(packageMeta, this);
+    }
+    return _defaultPackage;
+  }
 
-  @override
-  Library get canonicalLibrary => null;
-
-  Package get defaultPackage =>
-      localPackages.firstWhere((p) => p.packageMeta == packageMeta);
-
-  @override
   PackageGraph get packageGraph => this;
 
   /// Map of package name to Package.
@@ -4061,20 +4058,7 @@
     return _sdkLibrarySources;
   }
 
-  @override
-  bool get isDocumented => true;
-
-  @override
-  List<Locatable> get documentationFrom => [defaultPackage];
-
-  @override
-  Warnable get enclosingElement => null;
-
-  @override
-  bool get hasExtendedDocumentation => documentation.isNotEmpty;
-
   final Map<Element, Library> _elementToLibrary = {};
-  String _docsAsHtml;
   final Map<String, String> _macros = {};
   bool allLibrariesAdded = false;
   bool _macrosAdded = false;
@@ -4092,12 +4076,6 @@
     return (_allRootDirs.contains(element.library.packageMeta?.resolvedDir));
   }
 
-  @override
-  Element get element => null;
-
-  @override
-  String get location => '(top level package)';
-
   /// Flush out any warnings we might have collected while
   /// [PackageWarningOptions.autoFlush] was false.
   void flushWarnings() {
@@ -4106,25 +4084,8 @@
 
   Tuple2<int, int> get lineAndColumn => null;
 
-  @override
-  String get fullyQualifiedName => name;
-
-  @override
-  bool get isCanonical => true;
-
   PackageWarningCounter get packageWarningCounter => _packageWarningCounter;
 
-  @override
-  void warn(PackageWarning kind,
-      {String message,
-      Iterable<Locatable> referredFrom,
-      Iterable<String> extendedDebug}) {
-    warnOnElement(this, kind,
-        message: message,
-        referredFrom: referredFrom,
-        extendedDebug: extendedDebug);
-  }
-
   /// Returns colon-stripped name and location of the given locatable.
   static Tuple2<String, String> nameAndLocation(Locatable locatable) {
     String locatableName = '<unknown>';
@@ -4358,11 +4319,6 @@
     return _libraryElementReexportedBy;
   }
 
-  @override
-  String get documentation {
-    return hasDocumentationFile ? documentationFile.contents : null;
-  }
-
   /// A lookup index for hrefs to allow warnings to indicate where a broken
   /// link or orphaned file may have come from.  Not cached because
   /// [ModelElement]s can be created at any time and we're basing this
@@ -4395,32 +4351,6 @@
     return hrefMap;
   }
 
-  @override
-  String get documentationAsHtml {
-    if (_docsAsHtml != null) return _docsAsHtml;
-    _docsAsHtml = new Documentation.forElement(this).asHtml;
-
-    return _docsAsHtml;
-  }
-
-  FileContents get documentationFile => packageMeta.getReadmeContents();
-
-  // TODO: make this work
-  @override
-  bool get hasDocumentation =>
-      documentationFile != null && documentationFile.contents.isNotEmpty;
-
-  // TODO: Clients should use [documentationFile] so they can act differently on
-  // plain text or markdown.
-  bool get hasDocumentationFile => documentationFile != null;
-
-  // TODO: make this work
-  @override
-  String get href => 'index.html';
-
-  @override
-  bool get isSdk => packageMeta.isSdk;
-
   void _addToImplementors(Class c) {
     assert(!allImplementorsAdded);
     _implementors.putIfAbsent(c.href, () => []);
@@ -4448,12 +4378,10 @@
     }
   }
 
-  @override
   List<Library> get libraries =>
       packages.expand((p) => p.libraries).toList()..sort();
 
   List<Library> _publicLibraries;
-  @override
   Iterable<Library> get publicLibraries {
     if (_publicLibraries == null) {
       assert(allLibrariesAdded);
@@ -4481,18 +4409,6 @@
     return _localPublicLibraries;
   }
 
-  bool get hasHomepage =>
-      packageMeta.homepage != null && packageMeta.homepage.isNotEmpty;
-  String get homepage => packageMeta.homepage;
-
-  @override
-  String get name => packageMeta.name;
-
-  String get kind => (packageGraph.isSdk) ? 'SDK' : 'package';
-
-  @override
-  String get oneLineDoc => '';
-
   // Written from ModelElement.from.
   ModelElement _objectElement;
 
@@ -4532,8 +4448,6 @@
     return _inheritThrough;
   }
 
-  String get version => packageMeta.version ?? '0.0.0-unknown';
-
   /// Looks up some [Library] that is reexporting this [Element]; not
   /// necessarily the canonical [Library].
   Library findLibraryFor(Element element) {
@@ -4556,7 +4470,7 @@
   }
 
   @override
-  String toString() => isSdk ? 'SDK' : 'Package $name';
+  String toString() => 'PackageGraph built from ${defaultPackage.name}';
 
   final Map<Element, Library> _canonicalLibraryFor = new Map();
 
@@ -4780,9 +4694,9 @@
     implements Comparable<LibraryContainer> {
   final List<Library> _libraries = [];
 
-  /// An enclosing container's [libraries] must be a superset of this object's
-  /// [libraries].
-  LibraryContainer get enclosingContainer;
+  /// The name of the container or object that this LibraryContainer is a part
+  /// of.  Used for sorting in [containerOrder].
+  String get enclosingName;
 
   List<Library> get libraries => _libraries;
   Iterable<Library> get publicLibraries => filterNonPublic(libraries);
@@ -4799,16 +4713,15 @@
 
   /// Returns:
   /// -1 if this container is listed in [containerOrder].
-  /// 0 if this container is named the same as the [enclosingContainer].
+  /// 0 if this container is named the same as the [enclosingName].
   /// 1 if this container represents the SDK.
-  /// 2 if this group has a name that contains the name of the [enclosingContainer].
+  /// 2 if this group has a name that contains the name [enclosingName].
   /// 3 otherwise.
   int get _group {
     if (containerOrder.contains(name)) return -1;
-    if (equalsIgnoreAsciiCase(name, enclosingContainer.name)) return 0;
+    if (equalsIgnoreAsciiCase(name, enclosingName)) return 0;
     if (isSdk) return 1;
-    if (name.toLowerCase().contains(enclosingContainer.name.toLowerCase()))
-      return 2;
+    if (name.toLowerCase().contains(enclosingName.toLowerCase())) return 2;
     return 3;
   }
 
@@ -4845,7 +4758,7 @@
   List<String> get containerOrder => config.categoryOrder;
 
   @override
-  Package get enclosingContainer => package;
+  String get enclosingName => package.name;
 
   PackageGraph get packageGraph => package.packageGraph;
 }
@@ -4863,11 +4776,8 @@
 /// A [LibraryContainer] that contains [Library] objects related to a particular
 /// package.
 class Package extends LibraryContainer
-    with
-        Locatable
-    // TODO(jcollins-g): implements Documentable
-    implements
-        Privacy {
+    with Locatable, Canonicalization, Warnable
+    implements Privacy, Documentable {
   String _name;
   PackageGraph _packageGraph;
   final _isLocal;
@@ -4898,9 +4808,26 @@
   }
 
   Package._(this._name, this._packageGraph, this._packageMeta, this._isLocal);
+  @override
+  bool get isCanonical => true;
+  @override
+  Library get canonicalLibrary => null;
+
+  /// Pieces of the location split by [locationSplitter] (removing package: and
+  /// slashes).
+  @override
+  Set<String> get locationPieces => new Set();
 
   final Set<Library> _allLibraries = new Set();
 
+  bool get hasHomepage =>
+      packageMeta.homepage != null && packageMeta.homepage.isNotEmpty;
+  String get homepage => packageMeta.homepage;
+  String get kind => (isSdk) ? 'SDK' : 'package';
+
+  @override
+  List<Locatable> get documentationFrom => [this];
+
   /// Returns all libraries added to this package.  May include non-documented
   /// libraries, but is not guaranteed to include a complete list of
   /// non-documented libraries unless they are all referenced by documented ones.
@@ -4916,8 +4843,42 @@
 
   LibraryContainer get defaultCategory => nameToCategory[null];
 
+  String _documentationAsHtml;
   @override
-  List<Locatable> get documentationFrom => [this];
+  String get documentationAsHtml {
+    if (_documentationAsHtml != null) return _documentationAsHtml;
+    _documentationAsHtml = new Documentation.forElement(this).asHtml;
+
+    return _documentationAsHtml;
+  }
+
+  @override
+  String get documentation {
+    return hasDocumentationFile ? documentationFile.contents : null;
+  }
+
+  @override
+  bool get hasDocumentation =>
+      documentationFile != null && documentationFile.contents.isNotEmpty;
+
+  @override
+  bool get hasExtendedDocumentation => documentation.isNotEmpty;
+
+  // TODO: Clients should use [documentationFile] so they can act differently on
+  // plain text or markdown.
+  bool get hasDocumentationFile => documentationFile != null;
+
+  FileContents get documentationFile => packageMeta.getReadmeContents();
+
+  @override
+  String get oneLineDoc => '';
+
+  @override
+  bool get isDocumented =>
+      isFirstPackage || documentedWhere != DocumentLocation.missing;
+
+  @override
+  Warnable get enclosingElement => null;
 
   bool _isPublic;
   @override
@@ -4942,7 +4903,7 @@
   }
 
   @override
-  PackageGraph get enclosingContainer => packageGraph;
+  String get enclosingName => packageGraph.defaultPackageName;
 
   @override
   String get fullyQualifiedName => 'package:$name';
@@ -4990,6 +4951,7 @@
   @override
   String get name => _name;
 
+  @override
   PackageGraph get packageGraph => _packageGraph;
 
   // Workaround for mustache4dart issue where templates do not recognize
@@ -5024,6 +4986,7 @@
   }
 
   DartdocOptionContext _config;
+  @override
   DartdocOptionContext get config {
     if (_config == null) {
       _config = new DartdocOptionContext.fromContext(
@@ -5047,11 +5010,27 @@
     return _packagePath;
   }
 
+  String get version => packageMeta.version ?? '0.0.0-unknown';
+
+  @override
+  void warn(PackageWarning kind,
+      {String message,
+      Iterable<Locatable> referredFrom,
+      Iterable<String> extendedDebug}) {
+    packageGraph.warnOnElement(this, kind,
+        message: message,
+        referredFrom: referredFrom,
+        extendedDebug: extendedDebug);
+  }
+
   final PackageMeta _packageMeta;
   PackageMeta get packageMeta => _packageMeta;
 
   @override
   String toString() => name;
+
+  @override
+  Element get element => null;
 }
 
 class Parameter extends ModelElement implements EnclosedElement {
diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index a2949b9..b227f17 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -85,8 +85,7 @@
     // [config] is only here for sdkDir, and it's OK that it is the wrong
     // context since sdkDir is argOnly and this is supposed to be a temporary
     // workaround.
-    // Workaround for dart-lang/sdk#32707.  Replace with isInSdk once that works.
-    if (libraryElement.source.uri.scheme == 'dart')
+    if (libraryElement.isInSdk)
       return new PackageMeta.fromDir(new Directory(config.sdkDir));
     return new PackageMeta.fromDir(
         new File(pathLib.canonicalize(libraryElement.source.fullName)).parent);
diff --git a/lib/templates/_class.html b/lib/templates/_class.html
new file mode 100644
index 0000000..11d3d82
--- /dev/null
+++ b/lib/templates/_class.html
@@ -0,0 +1,6 @@
+<dt id="{{htmlId}}">
+  <span class="name {{#isDeprecated}}deprecated{{/isDeprecated}}">{{{linkedName}}}{{{linkedGenericParameters}}}</span>
+</dt>
+<dd>
+  {{{ oneLineDoc }}}
+</dd>
diff --git a/lib/templates/_footer.html b/lib/templates/_footer.html
index c7a6d04..3aa83c9 100644
--- a/lib/templates/_footer.html
+++ b/lib/templates/_footer.html
@@ -2,7 +2,7 @@
 
 <footer>
   <span class="no-break">
-    {{packageGraph.name}} {{packageGraph.version}}
+    {{packageGraph.defaultPackage.name}} {{packageGraph.defaultPackage.version}}
   </span>
 
   <!-- footer-text placeholder -->
diff --git a/lib/templates/index.html b/lib/templates/index.html
index 684448a..41a041f 100644
--- a/lib/templates/index.html
+++ b/lib/templates/index.html
@@ -6,9 +6,11 @@
   </div>
 
   <div class="col-xs-12 col-sm-9 col-md-8 main-content">
-    {{#packageGraph}}
+    {{#packageGraph.defaultPackage}}
       {{>documentation}}
+    {{/packageGraph.defaultPackage}}
 
+    {{#packageGraph}}
       {{#localPackages}}
         <section class="summary">
           {{#isFirstPackage}}
diff --git a/lib/templates/library.html b/lib/templates/library.html
index 89e3eee..e735a4d 100644
--- a/lib/templates/library.html
+++ b/lib/templates/library.html
@@ -18,12 +18,7 @@
 
       <dl>
         {{#library.publicClasses}}
-        <dt id="{{htmlId}}">
-          <span class="name {{#isDeprecated}}deprecated{{/isDeprecated}}">{{{linkedName}}}{{{linkedGenericParameters}}}</span>
-        </dt>
-        <dd>
-          {{{ oneLineDoc }}}
-        </dd>
+        {{>class}}
         {{/library.publicClasses}}
       </dl>
     </section>
@@ -71,12 +66,7 @@
 
       <dl>
         {{#library.publicEnums}}
-        <dt id="{{htmlId}}">
-          {{{linkedName}}}
-        </dt>
-        <dd>
-          {{{ oneLineDoc }}}
-        </dd>
+        {{>class}}
         {{/library.publicEnums}}
       </dl>
     </section>
@@ -100,12 +90,7 @@
 
       <dl>
         {{#library.publicExceptions}}
-        <dt id="{{htmlId}}">
-          <span class="name {{#isDeprecated}}deprecated{{/isDeprecated}}">{{{linkedName}}}</span>
-        </dt>
-        <dd>
-          {{{ oneLineDoc }}}
-        </dd>
+        {{>class}}
         {{/library.publicExceptions}}
       </dl>
     </section>
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index 7bf6b1b..df6c17c 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -39,7 +39,7 @@
               ['--input', testPackageMinimumDir.path]));
       DartdocResults results = await dartdoc.generateDocs();
       PackageGraph p = results.packageGraph;
-      assert(p.version == '0.0.0-unknown');
+      assert(p.defaultPackage.version == '0.0.0-unknown');
     });
 
     test('basic interlinking test', () async {
@@ -79,11 +79,12 @@
       DartdocResults results = await dartdoc.generateDocs();
       expect(results.packageGraph, isNotNull);
 
-      PackageGraph p = results.packageGraph;
+      PackageGraph packageGraph = results.packageGraph;
+      Package p = packageGraph.defaultPackage;
       expect(p.name, 'test_package');
       expect(p.hasDocumentationFile, isTrue);
-      expect(p.defaultPackage.publicLibraries, hasLength(10));
-      expect(p.localPackages.length, equals(1));
+      expect(packageGraph.defaultPackage.publicLibraries, hasLength(10));
+      expect(packageGraph.localPackages.length, equals(1));
     });
 
     test('generate docs for ${pathLib.basename(testPackageBadDir.path)} fails',
@@ -109,9 +110,9 @@
       expect(results.packageGraph, isNotNull);
 
       PackageGraph p = results.packageGraph;
-      expect(p.name, 'test_package_small');
-      expect(p.hasHomepage, isFalse);
-      expect(p.hasDocumentationFile, isFalse);
+      expect(p.defaultPackage.name, 'test_package_small');
+      expect(p.defaultPackage.hasHomepage, isFalse);
+      expect(p.defaultPackage.hasDocumentationFile, isFalse);
       expect(p.localPublicLibraries, hasLength(1));
     });
 
@@ -124,8 +125,8 @@
       expect(results.packageGraph, isNotNull);
 
       PackageGraph p = results.packageGraph;
-      expect(p.name, 'test_package');
-      expect(p.hasDocumentationFile, isTrue);
+      expect(p.defaultPackage.name, 'test_package');
+      expect(p.defaultPackage.hasDocumentationFile, isTrue);
       expect(p.libraries, hasLength(1));
       expect(p.libraries.map((lib) => lib.name), contains('fake'));
     });
@@ -139,8 +140,8 @@
       expect(results.packageGraph, isNotNull);
 
       PackageGraph p = results.packageGraph;
-      expect(p.name, 'test_package');
-      expect(p.hasDocumentationFile, isTrue);
+      expect(p.defaultPackage.name, 'test_package');
+      expect(p.defaultPackage.hasDocumentationFile, isTrue);
       expect(p.localPublicLibraries, hasLength(9));
       expect(p.localPublicLibraries.map((lib) => lib.name).contains('fake'),
           isFalse);
@@ -157,16 +158,16 @@
       expect(results.packageGraph, isNotNull);
 
       PackageGraph p = results.packageGraph;
-      expect(p.name, 'test_package_embedder_yaml');
-      expect(p.hasDocumentationFile, isFalse);
+      expect(p.defaultPackage.name, 'test_package_embedder_yaml');
+      expect(p.defaultPackage.hasDocumentationFile, isFalse);
       expect(p.libraries, hasLength(3));
       expect(p.libraries.map((lib) => lib.name).contains('dart:core'), isTrue);
       expect(p.libraries.map((lib) => lib.name).contains('dart:async'), isTrue);
       expect(p.libraries.map((lib) => lib.name).contains('dart:bear'), isTrue);
-      expect(p.packageMap.length, equals(1));
-      // Things that do not override the core SDK do not belong in their own package.
+      expect(p.packageMap.length, equals(2));
+      // Things that do not override the core SDK belong in their own package.
       expect(p.packageMap["Dart"].isSdk, isTrue);
-      expect(p.packageMap["test_package_embedder_yaml"], isNull);
+      expect(p.packageMap["test_package_embedder_yaml"].isSdk, isFalse);
       // Should be true once dart-lang/sdk#32707 is fixed.
       //expect(
       //    p.publicLibraries,
@@ -174,9 +175,8 @@
       //        (l.element as LibraryElement).isInSdk == l.packageMeta.isSdk));
       // Ensure that we actually parsed some source by checking for
       // the 'Bear' class.
-      Library dart_bear =
-          p.libraries.firstWhere((lib) => lib.name == 'dart:bear');
-      expect(dart_bear, isNotNull);
+      Library dart_bear = p.packageMap["Dart"].libraries
+          .firstWhere((lib) => lib.name == 'dart:bear');
       expect(
           dart_bear.allClasses.map((cls) => cls.name).contains('Bear'), isTrue);
       expect(p.packageMap["Dart"].publicLibraries, hasLength(3));
diff --git a/test/model_test.dart b/test/model_test.dart
index 97cd678..f0a22ed 100644
--- a/test/model_test.dart
+++ b/test/model_test.dart
@@ -19,13 +19,16 @@
   @override
   final List<String> containerOrder;
   @override
-  final LibraryContainer enclosingContainer;
+  String enclosingName;
   @override
   final String name;
   @override
   bool get isSdk => false;
 
-  TestLibraryContainer(this.name, this.containerOrder, this.enclosingContainer);
+  TestLibraryContainer(
+      this.name, this.containerOrder, LibraryContainer enclosingContainer) {
+    enclosingName = enclosingContainer?.name;
+  }
 }
 
 class TestLibraryContainerSdk extends TestLibraryContainer {
@@ -200,7 +203,7 @@
   group('Package', () {
     group('test package', () {
       test('name', () {
-        expect(packageGraph.name, 'test_package');
+        expect(packageGraph.defaultPackage.name, 'test_package');
       });
 
       test('libraries', () {
@@ -209,8 +212,9 @@
       });
 
       test('homepage', () {
-        expect(packageGraph.hasHomepage, true);
-        expect(packageGraph.homepage, equals('http://github.com/dart-lang'));
+        expect(packageGraph.defaultPackage.hasHomepage, true);
+        expect(packageGraph.defaultPackage.homepage,
+            equals('http://github.com/dart-lang'));
       });
 
       test('packages', () {
@@ -232,36 +236,39 @@
       });
 
       test('has documentation', () {
-        expect(packageGraph.hasDocumentationFile, isTrue);
-        expect(packageGraph.hasDocumentation, isTrue);
+        expect(packageGraph.defaultPackage.hasDocumentationFile, isTrue);
+        expect(packageGraph.defaultPackage.hasDocumentation, isTrue);
       });
 
       test('documentation exists', () {
-        expect(packageGraph.documentation.startsWith('# Best Package'), isTrue);
+        expect(
+            packageGraph.defaultPackage.documentation
+                .startsWith('# Best Package'),
+            isTrue);
       });
 
       test('documentation can be rendered as HTML', () {
-        expect(packageGraph.documentationAsHtml,
+        expect(packageGraph.defaultPackage.documentationAsHtml,
             contains('<h1>Best Package</h1>'));
       });
 
       test('sdk name', () {
-        expect(sdkAsPackageGraph.name, equals('Dart'));
-        expect(sdkAsPackageGraph.kind, equals('SDK'));
+        expect(sdkAsPackageGraph.defaultPackage.name, equals('Dart'));
+        expect(sdkAsPackageGraph.defaultPackage.kind, equals('SDK'));
       });
 
       test('sdk homepage', () {
-        expect(sdkAsPackageGraph.hasHomepage, isTrue);
-        expect(sdkAsPackageGraph.homepage,
+        expect(sdkAsPackageGraph.defaultPackage.hasHomepage, isTrue);
+        expect(sdkAsPackageGraph.defaultPackage.homepage,
             equals('https://github.com/dart-lang/sdk'));
       });
 
       test('sdk version', () {
-        expect(sdkAsPackageGraph.version, isNotNull);
+        expect(sdkAsPackageGraph.defaultPackage.version, isNotNull);
       });
 
       test('sdk description', () {
-        expect(sdkAsPackageGraph.documentation,
+        expect(sdkAsPackageGraph.defaultPackage.documentation,
             startsWith('Welcome to the Dart API reference doc'));
       });
 
@@ -279,10 +286,14 @@
 
     group('test small package', () {
       test('does not have documentation', () {
-        expect(utils.testPackageGraphSmall.hasDocumentation, isFalse);
-        expect(utils.testPackageGraphSmall.hasDocumentationFile, isFalse);
-        expect(utils.testPackageGraphSmall.documentationFile, isNull);
-        expect(utils.testPackageGraphSmall.documentation, isNull);
+        expect(utils.testPackageGraphSmall.defaultPackage.hasDocumentation,
+            isFalse);
+        expect(utils.testPackageGraphSmall.defaultPackage.hasDocumentationFile,
+            isFalse);
+        expect(utils.testPackageGraphSmall.defaultPackage.documentationFile,
+            isNull);
+        expect(
+            utils.testPackageGraphSmall.defaultPackage.documentation, isNull);
       });
     });
 
diff --git a/testing/test_package_docs/ex/ex-library.html b/testing/test_package_docs/ex/ex-library.html
index 1e707a0..443ea26 100644
--- a/testing/test_package_docs/ex/ex-library.html
+++ b/testing/test_package_docs/ex/ex-library.html
@@ -425,7 +425,7 @@
 
       <dl>
         <dt id="Animal">
-          <a href="ex/Animal-class.html">Animal</a>
+          <span class="name "><a href="ex/Animal-class.html">Animal</a></span>
         </dt>
         <dd>
           Referencing <a href="ex/processMessage.html">processMessage</a> (or other things) here should not break
diff --git a/testing/test_package_docs/fake/fake-library.html b/testing/test_package_docs/fake/fake-library.html
index 75e9a75..79f8d42 100644
--- a/testing/test_package_docs/fake/fake-library.html
+++ b/testing/test_package_docs/fake/fake-library.html
@@ -818,7 +818,7 @@
 
       <dl>
         <dt id="Color">
-          <a href="fake/Color-class.html">Color</a>
+          <span class="name "><a href="fake/Color-class.html">Color</a></span>
         </dt>
         <dd>
           An <code>enum</code> for ROYGBIV constants.