@@ -895,11 +895,13 @@ class Constructor extends ModelElement
895895
896896/// Bridges the gap between model elements and packages,
897897/// both of which have documentation.
898- abstract class Documentable {
898+ abstract class Documentable implements Warnable {
899899 String get documentation;
900900 String get documentationAsHtml;
901901 bool get hasDocumentation;
902902 String get oneLineDoc;
903+ Documentable get overriddenDocumentedElement;
904+ Package get package;
903905}
904906
905907class Dynamic extends ModelElement {
@@ -1709,8 +1711,7 @@ class Method extends ModelElement
17091711/// helps prevent subtle bugs as generated output for a non-canonical
17101712/// ModelElement will reference itself as part of the "wrong" [Library]
17111713/// from the public interface perspective.
1712- abstract class ModelElement
1713- implements Comparable , Nameable , Documentable , Locatable {
1714+ abstract class ModelElement implements Comparable , Nameable , Documentable {
17141715 final Element _element;
17151716 final Library _library;
17161717
@@ -2152,6 +2153,7 @@ abstract class ModelElement
21522153 bool _overriddenDocumentedElementIsSet = false ;
21532154 // TODO(jcollins-g): This method prefers canonical elements, but it isn't
21542155 // guaranteed and is probably the source of bugs or confusing warnings.
2156+ @override
21552157 ModelElement get overriddenDocumentedElement {
21562158 if (! _overriddenDocumentedElementIsSet) {
21572159 ModelElement found = this ;
@@ -2180,6 +2182,7 @@ abstract class ModelElement
21802182 return _overriddenDepth;
21812183 }
21822184
2185+ @override
21832186 Package get package =>
21842187 (this is Library ) ? (this as Library ).package : this .library.package;
21852188
@@ -2236,14 +2239,15 @@ abstract class ModelElement
22362239 return _parameters;
22372240 }
22382241
2242+ @override
22392243 void warn (PackageWarning kind, [String message]) {
22402244 if (kind == PackageWarning .unresolvedDocReference &&
22412245 overriddenElement != null ) {
22422246 // The documentation we're using for this element came from somewhere else.
22432247 // Attach the warning to that element to deduplicate.
22442248 overriddenElement.warn (kind, message);
22452249 } else {
2246- library.package.warn (this , kind, message);
2250+ library.package.warnOnElement (this , kind, message);
22472251 }
22482252 }
22492253
@@ -2763,6 +2767,11 @@ Map<PackageWarning, List<String>> packageWarningText = {
27632767 ],
27642768};
27652769
2770+ // Something that package warnings can be called on.
2771+ abstract class Warnable implements Locatable {
2772+ void warn (PackageWarning warning, [String message]);
2773+ }
2774+
27662775// Something that can be located for warning purposes.
27672776abstract class Locatable {
27682777 String get fullyQualifiedName;
@@ -2889,7 +2898,7 @@ class PackageWarningCounter {
28892898 }
28902899}
28912900
2892- class Package implements Nameable , Documentable , Locatable {
2901+ class Package implements Nameable , Documentable {
28932902 // Library objects serving as entry points for documentation.
28942903 final List <Library > _libraries = [];
28952904 // All library objects related to this package; a superset of _libraries.
@@ -2911,6 +2920,12 @@ class Package implements Nameable, Documentable, Locatable {
29112920
29122921 final PackageMeta packageMeta;
29132922
2923+ @override
2924+ Package get package => this ;
2925+
2926+ @override
2927+ Documentable get overriddenDocumentedElement => this ;
2928+
29142929 final Map <Element , Library > _elementToLibrary = {};
29152930 String _docsAsHtml;
29162931 final Map <String , String > _macros = {};
@@ -2958,29 +2973,33 @@ class Package implements Nameable, Documentable, Locatable {
29582973
29592974 PackageWarningCounter get packageWarningCounter => _packageWarningCounter;
29602975
2961- void warn (Locatable modelElement, PackageWarning kind, [String message]) {
2962- if (modelElement != null ) {
2976+ @override
2977+ void warn (PackageWarning kind, [String message]) {
2978+ warnOnElement (this , kind, message);
2979+ }
2980+
2981+ void warnOnElement (Warnable warnable, PackageWarning kind, [String message]) {
2982+ if (warnable != null ) {
29632983 // This sort of warning is only applicable to top level elements.
29642984 if (kind == PackageWarning .ambiguousReexport) {
2965- Element topLevelElement = modelElement .element;
2985+ Element topLevelElement = warnable .element;
29662986 while (topLevelElement.enclosingElement is ! CompilationUnitElement ) {
29672987 topLevelElement = topLevelElement.enclosingElement;
29682988 }
2969- modelElement = new ModelElement .from (
2989+ warnable = new ModelElement .from (
29702990 topLevelElement, findOrCreateLibraryFor (topLevelElement));
29712991 }
2972- if (modelElement is Accessor ) {
2992+ if (warnable is Accessor ) {
29732993 // This might be part of a Field, if so, assign this warning to the field
29742994 // rather than the Accessor.
2975- if ((modelElement as Accessor ).enclosingCombo != null )
2976- modelElement = (modelElement as Accessor ).enclosingCombo;
2995+ if ((warnable as Accessor ).enclosingCombo != null )
2996+ warnable = (warnable as Accessor ).enclosingCombo;
29772997 }
29782998 } else {
29792999 // If we don't have an element, we need a message to disambiguate.
29803000 assert (message != null );
29813001 }
2982- if (_packageWarningCounter.hasWarning (
2983- modelElement? .element, kind, message)) {
3002+ if (_packageWarningCounter.hasWarning (warnable? .element, kind, message)) {
29843003 return ;
29853004 }
29863005 // Elements that are part of the Dart SDK can have colons in their FQNs.
@@ -2991,9 +3010,9 @@ class Package implements Nameable, Documentable, Locatable {
29913010 // them out doesn't work as well there since it might confuse
29923011 // the user, yet we still want IntelliJ to link properly.
29933012 String nameSplitFromColonPieces;
2994- if (modelElement != null ) {
3013+ if (warnable != null ) {
29953014 nameSplitFromColonPieces =
2996- modelElement .fullyQualifiedName.replaceFirst (':' , '-' );
3015+ warnable .fullyQualifiedName.replaceFirst (':' , '-' );
29973016 }
29983017 String warningMessage;
29993018 switch (kind) {
@@ -3014,7 +3033,7 @@ class Package implements Nameable, Documentable, Locatable {
30143033 break ;
30153034 case PackageWarning .noLibraryLevelDocs:
30163035 warningMessage =
3017- "${modelElement .fullyQualifiedName } has no library level documentation comments" ;
3036+ "${warnable .fullyQualifiedName } has no library level documentation comments" ;
30183037 break ;
30193038 case PackageWarning .ambiguousDocReference:
30203039 warningMessage =
@@ -3047,9 +3066,9 @@ class Package implements Nameable, Documentable, Locatable {
30473066 break ;
30483067 }
30493068 String fullMessage =
3050- "${warningMessage } ${modelElement != null ? modelElement .elementLocation : '' }" ;
3069+ "${warningMessage } ${warnable != null ? warnable .elementLocation : '' }" ;
30513070 packageWarningCounter.addWarning (
3052- modelElement ? .element, kind, message, fullMessage);
3071+ warnable ? .element, kind, message, fullMessage);
30533072 }
30543073
30553074 static Package _withAutoIncludedDependencies (
@@ -3110,7 +3129,7 @@ class Package implements Nameable, Documentable, Locatable {
31103129 // Help the user if they pass us a category that doesn't exist.
31113130 for (String categoryName in config.categoryOrder) {
31123131 if (! result.containsKey (categoryName))
3113- warn (null , PackageWarning .categoryOrderGivesMissingPackageName,
3132+ warnOnElement (null , PackageWarning .categoryOrderGivesMissingPackageName,
31143133 "${categoryName }, categories: ${result .keys .join (',' )}" );
31153134 }
31163135 List <PackageCategory > packageCategories = result.values.toList ()..sort ();
@@ -3167,8 +3186,7 @@ class Package implements Nameable, Documentable, Locatable {
31673186 @override
31683187 String get documentationAsHtml {
31693188 if (_docsAsHtml != null ) return _docsAsHtml;
3170-
3171- _docsAsHtml = new Documentation (documentation).asHtml;
3189+ _docsAsHtml = new Documentation .forElement (this ).asHtml;
31723190
31733191 return _docsAsHtml;
31743192 }
0 commit comments