diff --git a/lib/src/config.dart b/lib/src/config.dart index 03b752e8f6..70c732e520 100644 --- a/lib/src/config.dart +++ b/lib/src/config.dart @@ -8,7 +8,6 @@ import 'dart:io'; import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/dartdoc.dart'; -import 'package:path/path.dart' as pathLib; import 'model.dart'; @@ -20,21 +19,7 @@ class LocalConfig { LocalConfig._(this.categoryMap, this.packageMeta); factory LocalConfig.fromLibrary(LibraryElement element) { - return new LocalConfig._({}, getPackageMeta(element)); - } - - static PackageMeta getPackageMeta(LibraryElement element) { - String sourcePath = element.source.fullName; - File file = new File(pathLib.canonicalize(sourcePath)); - Directory dir = file.parent; - while (dir.parent.path != dir.path && dir.existsSync()) { - File pubspec = new File(pathLib.join(dir.path, 'pubspec.yaml')); - if (pubspec.existsSync()) { - return new PackageMeta.fromDir(dir); - } - dir = dir.parent; - } - return null; + return new LocalConfig._({}, new PackageMeta.fromElement(element)); } } diff --git a/lib/src/model.dart b/lib/src/model.dart index 1be1c5e8c3..cb094d873e 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -2047,7 +2047,7 @@ class Library extends ModelElement with Categorization { PackageMeta _packageMeta; PackageMeta get packageMeta { if (_packageMeta == null) { - _packageMeta = getPackageMeta(element); + _packageMeta = new PackageMeta.fromElement(element); } return _packageMeta; } @@ -2202,12 +2202,6 @@ class Library extends ModelElement with Categorization { return name; } - static PackageMeta getPackageMeta(Element element) { - String sourcePath = element.source.fullName; - return new PackageMeta.fromDir( - new File(pathLib.canonicalize(sourcePath)).parent); - } - static String getLibraryName(LibraryElement element) { String name = element.name; if (name == null || name.isEmpty) { @@ -4582,7 +4576,7 @@ class Package extends LibraryContainer implements Comparable, Privacy { // Workaround for mustache4dart issue where templates do not recognize // inherited properties as being in-context. @override - List get publicLibraries => super.publicLibraries; + Iterable get publicLibraries => super.publicLibraries; /// A map of category name to the category itself. Map get nameToCategory { @@ -5267,7 +5261,8 @@ class PackageBuilder { await driver.getLibraryByUri(source.uri.toString()); if (library != null) { if (!isExcluded(Library.getLibraryName(library)) && - !excludePackages.contains(Library.getPackageMeta(library)?.name)) { + !excludePackages + .contains(new PackageMeta.fromElement(library)?.name)) { libraries.add(library); sources.add(source); } diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index d85bf26308..5f2e5273db 100644 --- a/lib/src/package_meta.dart +++ b/lib/src/package_meta.dart @@ -6,6 +6,7 @@ library dartdoc.package_meta; import 'dart:io'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/sdk.dart'; import 'package:path/path.dart' as pathLib; import 'package:yaml/yaml.dart'; @@ -19,6 +20,13 @@ abstract class PackageMeta { PackageMeta(this.dir); + /// Use this instead of fromDir where possible. + factory PackageMeta.fromElement(LibraryElement libraryElement) { + if (libraryElement.isInSdk) return new PackageMeta.fromDir(getSdkDir()); + return new PackageMeta.fromDir( + new File(pathLib.canonicalize(libraryElement.source.fullName)).parent); + } + /// This factory is guaranteed to return the same object for any given /// [dir.absolute.path]. Multiple [dir.absolute.path]s will resolve to the /// same object if they are part of the same package. Returns null diff --git a/pubspec.lock b/pubspec.lock index b272f2af91..e3ad5b8acc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -408,4 +408,4 @@ packages: source: hosted version: "2.1.13" sdks: - dart: ">=2.0.0-dev.23.0 <=2.0.0-dev.40.0" + dart: ">=2.0.0-dev.23.0 <=2.0.0-dev.42.0" diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart index 85dc9f7831..8ed718b3d0 100644 --- a/test/dartdoc_test.dart +++ b/test/dartdoc_test.dart @@ -6,6 +6,7 @@ library dartdoc.dartdoc_test; import 'dart:io'; +import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/dartdoc.dart'; import 'package:dartdoc/src/model.dart'; import 'package:dartdoc/src/package_meta.dart'; @@ -121,6 +122,14 @@ void main() { 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.packages.length, equals(2)); + // Things that do not override the core SDK belong in their own package? + expect(p.packages["Dart"].isSdk, isTrue); + expect(p.packages["test_package_embedder_yaml"].isSdk, isFalse); + expect( + p.publicLibraries, + everyElement((Library l) => + (l.element as LibraryElement).isInSdk == l.packageMeta.isSdk)); // Ensure that we actually parsed some source by checking for // the 'Bear' class. Library dart_bear = @@ -128,6 +137,9 @@ void main() { expect(dart_bear, isNotNull); expect( dart_bear.allClasses.map((cls) => cls.name).contains('Bear'), isTrue); + expect(p.packages["test_package_embedder_yaml"].publicLibraries, + contains(dart_bear)); + expect(p.packages["Dart"].publicLibraries, hasLength(2)); }); }); } diff --git a/testing/test_package/lib/fake.dart b/testing/test_package/lib/fake.dart index c8785fe785..ff77405f39 100644 --- a/testing/test_package/lib/fake.dart +++ b/testing/test_package/lib/fake.dart @@ -224,7 +224,7 @@ class Cool { } /// A map initialization making use of optional const. -const Map myMap = { 1: "hello" }; +const Map myMap = {1: "hello"}; /// A variable initalization making use of optional new. Cool aCoolVariable = Cool(); @@ -289,6 +289,7 @@ void aVoidParameter(Future p1) {} /// This class extends Future abstract class ExtendsFutureVoid extends Future { + // ignore: missing_return factory ExtendsFutureVoid(FutureOr computation()) {} } @@ -297,6 +298,7 @@ abstract class ImplementsFutureVoid implements Future {} /// This class takes a type, and it might be void. class ATypeTakingClass { + // ignore: missing_return T aMethodMaybeReturningVoid() {} }