From 6a9b5a6ccbe7a2b18dbeb61ad36bbf4ccc511826 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Thu, 27 Aug 2020 17:29:18 -0700 Subject: [PATCH] Warn when the defining library cannot be found --- lib/src/model/model_element.dart | 14 +++++++++++--- lib/src/model/package_graph.dart | 5 +++++ lib/src/warnings.dart | 18 +++++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart index 9e4706f9a6..f571fa03c5 100644 --- a/lib/src/model/model_element.dart +++ b/lib/src/model/model_element.dart @@ -658,8 +658,13 @@ abstract class ModelElement extends Canonicalization documentationFrom.map((e) => e.documentationLocal).join('

')); } - Library get definingLibrary => - packageGraph.findButDoNotCreateLibraryFor(element); + Library get definingLibrary { + var library = packageGraph.findButDoNotCreateLibraryFor(element); + if (library == null) { + warn(PackageWarning.noDefiningLibraryFound); + } + return library; + } Library _canonicalLibrary; @@ -700,6 +705,9 @@ abstract class ModelElement extends Canonicalization } Library _searchForCanonicalLibrary() { + if (definingLibrary == null) { + return null; + } var thisAndExported = definingLibrary.exportedInLibraries; if (thisAndExported == null) { @@ -1023,7 +1031,7 @@ abstract class ModelElement extends Canonicalization PackageGraph get packageGraph => _packageGraph; @override - Package get package => library.package; + Package get package => library?.package; bool get isPublicAndPackageDocumented => isPublic && library.packageGraph.packageDocumentedFor(this); diff --git a/lib/src/model/package_graph.dart b/lib/src/model/package_graph.dart index fbd35ca22e..2870590b7c 100644 --- a/lib/src/model/package_graph.dart +++ b/lib/src/model/package_graph.dart @@ -347,6 +347,11 @@ class PackageGraph { warningMessage = 'ambiguous reexport of ${warnableName}, canonicalization candidates: ${message}'; break; + case PackageWarning.noDefiningLibraryFound: + warningMessage = + 'could not find the defining library for ${warnableName}; the ' + 'library may be imported or exported with a non-standard URI'; + break; case PackageWarning.noLibraryLevelDocs: warningMessage = '${warnable.fullyQualifiedName} has no library level documentation comments'; diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart index 6f60b5677f..ade343e762 100644 --- a/lib/src/warnings.dart +++ b/lib/src/warnings.dart @@ -135,11 +135,20 @@ final Map packageWarningDefinitions = PackageWarning.ignoredCanonicalFor: PackageWarningDefinition( PackageWarning.ignoredCanonicalFor, 'ignored-canonical-for', - 'A @canonicalFor tag refers to a library which this symbol can not be canonical for'), + 'A @canonicalFor tag refers to a library which this symbol can not be ' + 'canonical for'), PackageWarning.noCanonicalFound: PackageWarningDefinition( PackageWarning.noCanonicalFound, 'no-canonical-found', - 'A symbol is part of the public interface for this package, but no library documented with this package documents it so dartdoc can not link to it'), + 'A symbol is part of the public interface for this package, but no ' + 'library documented with this package documents it so dartdoc can ' + 'not link to it'), + PackageWarning.noDefiningLibraryFound: PackageWarningDefinition( + PackageWarning.noDefiningLibraryFound, + 'no-defining-library-found', + 'The defining library for an element could not be found; the library may ' + 'be imported or exported with a non-standard URI', + defaultWarningMode: PackageWarningMode.error), PackageWarning.notImplemented: PackageWarningDefinition( PackageWarning.notImplemented, 'not-implemented', @@ -245,6 +254,7 @@ enum PackageWarning { ambiguousReexport, ignoredCanonicalFor, noCanonicalFound, + noDefiningLibraryFound, notImplemented, noLibraryLevelDocs, packageOrderGivesMissingPackageName, @@ -441,9 +451,7 @@ class PackageWarningCounter { PackageWarningOptionContext config = element?.config ?? packageGraph.defaultPackage.config; var warningMode = config.packageWarningOptions.getMode(kind); - if (!config.allowNonLocalWarnings && - element != null && - !element.package.isLocal) { + if (!config.allowNonLocalWarnings && !(element?.package?.isLocal ?? true)) { warningMode = PackageWarningMode.ignore; } if (warningMode == PackageWarningMode.warn) {