@@ -895,11 +895,13 @@ class Constructor extends ModelElement
895
895
896
896
/// Bridges the gap between model elements and packages,
897
897
/// both of which have documentation.
898
- abstract class Documentable {
898
+ abstract class Documentable implements Warnable {
899
899
String get documentation;
900
900
String get documentationAsHtml;
901
901
bool get hasDocumentation;
902
902
String get oneLineDoc;
903
+ Documentable get overriddenDocumentedElement;
904
+ Package get package;
903
905
}
904
906
905
907
class Dynamic extends ModelElement {
@@ -1709,8 +1711,7 @@ class Method extends ModelElement
1709
1711
/// helps prevent subtle bugs as generated output for a non-canonical
1710
1712
/// ModelElement will reference itself as part of the "wrong" [Library]
1711
1713
/// from the public interface perspective.
1712
- abstract class ModelElement
1713
- implements Comparable , Nameable , Documentable , Locatable {
1714
+ abstract class ModelElement implements Comparable , Nameable , Documentable {
1714
1715
final Element _element;
1715
1716
final Library _library;
1716
1717
@@ -2152,6 +2153,7 @@ abstract class ModelElement
2152
2153
bool _overriddenDocumentedElementIsSet = false ;
2153
2154
// TODO(jcollins-g): This method prefers canonical elements, but it isn't
2154
2155
// guaranteed and is probably the source of bugs or confusing warnings.
2156
+ @override
2155
2157
ModelElement get overriddenDocumentedElement {
2156
2158
if (! _overriddenDocumentedElementIsSet) {
2157
2159
ModelElement found = this ;
@@ -2180,6 +2182,7 @@ abstract class ModelElement
2180
2182
return _overriddenDepth;
2181
2183
}
2182
2184
2185
+ @override
2183
2186
Package get package =>
2184
2187
(this is Library ) ? (this as Library ).package : this .library.package;
2185
2188
@@ -2236,14 +2239,15 @@ abstract class ModelElement
2236
2239
return _parameters;
2237
2240
}
2238
2241
2242
+ @override
2239
2243
void warn (PackageWarning kind, [String message]) {
2240
2244
if (kind == PackageWarning .unresolvedDocReference &&
2241
2245
overriddenElement != null ) {
2242
2246
// The documentation we're using for this element came from somewhere else.
2243
2247
// Attach the warning to that element to deduplicate.
2244
2248
overriddenElement.warn (kind, message);
2245
2249
} else {
2246
- library.package.warn (this , kind, message);
2250
+ library.package.warnOnElement (this , kind, message);
2247
2251
}
2248
2252
}
2249
2253
@@ -2763,6 +2767,11 @@ Map<PackageWarning, List<String>> packageWarningText = {
2763
2767
],
2764
2768
};
2765
2769
2770
+ // Something that package warnings can be called on.
2771
+ abstract class Warnable implements Locatable {
2772
+ void warn (PackageWarning warning, [String message]);
2773
+ }
2774
+
2766
2775
// Something that can be located for warning purposes.
2767
2776
abstract class Locatable {
2768
2777
String get fullyQualifiedName;
@@ -2889,7 +2898,7 @@ class PackageWarningCounter {
2889
2898
}
2890
2899
}
2891
2900
2892
- class Package implements Nameable , Documentable , Locatable {
2901
+ class Package implements Nameable , Documentable {
2893
2902
// Library objects serving as entry points for documentation.
2894
2903
final List <Library > _libraries = [];
2895
2904
// All library objects related to this package; a superset of _libraries.
@@ -2911,6 +2920,12 @@ class Package implements Nameable, Documentable, Locatable {
2911
2920
2912
2921
final PackageMeta packageMeta;
2913
2922
2923
+ @override
2924
+ Package get package => this ;
2925
+
2926
+ @override
2927
+ Documentable get overriddenDocumentedElement => this ;
2928
+
2914
2929
final Map <Element , Library > _elementToLibrary = {};
2915
2930
String _docsAsHtml;
2916
2931
final Map <String , String > _macros = {};
@@ -2958,29 +2973,33 @@ class Package implements Nameable, Documentable, Locatable {
2958
2973
2959
2974
PackageWarningCounter get packageWarningCounter => _packageWarningCounter;
2960
2975
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 ) {
2963
2983
// This sort of warning is only applicable to top level elements.
2964
2984
if (kind == PackageWarning .ambiguousReexport) {
2965
- Element topLevelElement = modelElement .element;
2985
+ Element topLevelElement = warnable .element;
2966
2986
while (topLevelElement.enclosingElement is ! CompilationUnitElement ) {
2967
2987
topLevelElement = topLevelElement.enclosingElement;
2968
2988
}
2969
- modelElement = new ModelElement .from (
2989
+ warnable = new ModelElement .from (
2970
2990
topLevelElement, findOrCreateLibraryFor (topLevelElement));
2971
2991
}
2972
- if (modelElement is Accessor ) {
2992
+ if (warnable is Accessor ) {
2973
2993
// This might be part of a Field, if so, assign this warning to the field
2974
2994
// 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;
2977
2997
}
2978
2998
} else {
2979
2999
// If we don't have an element, we need a message to disambiguate.
2980
3000
assert (message != null );
2981
3001
}
2982
- if (_packageWarningCounter.hasWarning (
2983
- modelElement? .element, kind, message)) {
3002
+ if (_packageWarningCounter.hasWarning (warnable? .element, kind, message)) {
2984
3003
return ;
2985
3004
}
2986
3005
// Elements that are part of the Dart SDK can have colons in their FQNs.
@@ -2991,9 +3010,9 @@ class Package implements Nameable, Documentable, Locatable {
2991
3010
// them out doesn't work as well there since it might confuse
2992
3011
// the user, yet we still want IntelliJ to link properly.
2993
3012
String nameSplitFromColonPieces;
2994
- if (modelElement != null ) {
3013
+ if (warnable != null ) {
2995
3014
nameSplitFromColonPieces =
2996
- modelElement .fullyQualifiedName.replaceFirst (':' , '-' );
3015
+ warnable .fullyQualifiedName.replaceFirst (':' , '-' );
2997
3016
}
2998
3017
String warningMessage;
2999
3018
switch (kind) {
@@ -3014,7 +3033,7 @@ class Package implements Nameable, Documentable, Locatable {
3014
3033
break ;
3015
3034
case PackageWarning .noLibraryLevelDocs:
3016
3035
warningMessage =
3017
- "${modelElement .fullyQualifiedName } has no library level documentation comments" ;
3036
+ "${warnable .fullyQualifiedName } has no library level documentation comments" ;
3018
3037
break ;
3019
3038
case PackageWarning .ambiguousDocReference:
3020
3039
warningMessage =
@@ -3047,9 +3066,9 @@ class Package implements Nameable, Documentable, Locatable {
3047
3066
break ;
3048
3067
}
3049
3068
String fullMessage =
3050
- "${warningMessage } ${modelElement != null ? modelElement .elementLocation : '' }" ;
3069
+ "${warningMessage } ${warnable != null ? warnable .elementLocation : '' }" ;
3051
3070
packageWarningCounter.addWarning (
3052
- modelElement ? .element, kind, message, fullMessage);
3071
+ warnable ? .element, kind, message, fullMessage);
3053
3072
}
3054
3073
3055
3074
static Package _withAutoIncludedDependencies (
@@ -3110,7 +3129,7 @@ class Package implements Nameable, Documentable, Locatable {
3110
3129
// Help the user if they pass us a category that doesn't exist.
3111
3130
for (String categoryName in config.categoryOrder) {
3112
3131
if (! result.containsKey (categoryName))
3113
- warn (null , PackageWarning .categoryOrderGivesMissingPackageName,
3132
+ warnOnElement (null , PackageWarning .categoryOrderGivesMissingPackageName,
3114
3133
"${categoryName }, categories: ${result .keys .join (',' )}" );
3115
3134
}
3116
3135
List <PackageCategory > packageCategories = result.values.toList ()..sort ();
@@ -3167,8 +3186,7 @@ class Package implements Nameable, Documentable, Locatable {
3167
3186
@override
3168
3187
String get documentationAsHtml {
3169
3188
if (_docsAsHtml != null ) return _docsAsHtml;
3170
-
3171
- _docsAsHtml = new Documentation (documentation).asHtml;
3189
+ _docsAsHtml = new Documentation .forElement (this ).asHtml;
3172
3190
3173
3191
return _docsAsHtml;
3174
3192
}
0 commit comments