66library dartdoc.models;
77
88import 'dart:convert' ;
9+ import 'dart:io' ;
910
1011import 'package:analyzer/dart/ast/ast.dart'
1112 show AnnotatedNode, Annotation, Declaration;
@@ -16,6 +17,7 @@ import 'package:analyzer/src/generated/resolver.dart'
1617import 'package:analyzer/src/generated/source_io.dart' ;
1718import 'package:analyzer/src/generated/utilities_dart.dart' show ParameterKind;
1819import 'package:collection/collection.dart' ;
20+ import 'package:path/path.dart' as p;
1921import 'package:quiver/core.dart' show hash3;
2022
2123import 'config.dart' ;
@@ -921,6 +923,7 @@ class Library extends ModelElement {
921923 List <TopLevelVariable > _variables;
922924 Namespace _exportedNamespace;
923925 String _name;
926+ String _packageName;
924927
925928 factory Library (LibraryElement element, Package package) {
926929 String key = element == null ? 'null' : element.name;
@@ -1020,6 +1023,21 @@ class Library extends ModelElement {
10201023 @override
10211024 String get href => '$dirName /$fileName ' ;
10221025
1026+ String get packageName {
1027+ if (_packageName == null ) {
1028+ String sourcePath = _library.source.fullName;
1029+ File file = new File (sourcePath);
1030+ if (file.existsSync ()) {
1031+ _packageName = _getPackageName (file.parent);
1032+ if (_packageName == null ) _packageName = '' ;
1033+ } else {
1034+ _packageName = '' ;
1035+ }
1036+ }
1037+
1038+ return _packageName;
1039+ }
1040+
10231041 bool get isAnonymous => element.name == null || element.name.isEmpty;
10241042
10251043 bool get isDocumented => oneLineDoc.isNotEmpty;
@@ -1143,6 +1161,20 @@ class Library extends ModelElement {
11431161
11441162 return _variables;
11451163 }
1164+
1165+ static String _getPackageName (Directory dir) {
1166+ if (! dir.existsSync () || ! dir.path.contains (Platform .pathSeparator)) {
1167+ return null ;
1168+ }
1169+
1170+ File pubspec = new File (p.join (dir.path, 'pubspec.yaml' ));
1171+ if (pubspec.existsSync ()) {
1172+ PackageMeta meta = new PackageMeta .fromDir (dir);
1173+ return meta.name;
1174+ } else {
1175+ return _getPackageName (dir.parent);
1176+ }
1177+ }
11461178}
11471179
11481180class Method extends ModelElement
@@ -1718,6 +1750,25 @@ class Package implements Nameable, Documentable {
17181750
17191751 List <Library > get libraries => _libraries;
17201752
1753+ List <PackageCategory > get categories {
1754+ Map <String , PackageCategory > result = {};
1755+
1756+ for (Library library in _libraries) {
1757+ String name = '' ;
1758+
1759+ if (library.name.startsWith ('dart:' )) {
1760+ name = 'Dart Core' ;
1761+ } else {
1762+ name = library.packageName;
1763+ }
1764+
1765+ if (! result.containsKey (name)) result[name] = new PackageCategory (name);
1766+ result[name]._libraries.add (library);
1767+ }
1768+
1769+ return result.values.toList ()..sort ();
1770+ }
1771+
17211772 String get name => packageMeta.name;
17221773
17231774 String get oneLineDoc => '' ;
@@ -1780,6 +1831,17 @@ class Package implements Nameable, Documentable {
17801831 }
17811832}
17821833
1834+ class PackageCategory implements Comparable {
1835+ final String name;
1836+ final List <Library > _libraries = [];
1837+
1838+ PackageCategory (this .name);
1839+
1840+ List <Library > get libraries => _libraries;
1841+
1842+ int compareTo (PackageCategory other) => name.compareTo (other.name);
1843+ }
1844+
17831845class Parameter extends ModelElement implements EnclosedElement {
17841846 Parameter (ParameterElement element, Library library)
17851847 : super (element, library) {
0 commit comments