Source
void warnOnElement(Warnable warnable, PackageWarning kind,
{String message, Locatable referredFrom}) {
if (warnable != null) {
// This sort of warning is only applicable to top level elements.
if (kind == PackageWarning.ambiguousReexport) {
Element topLevelElement = warnable.element;
while (topLevelElement.enclosingElement is! CompilationUnitElement) {
topLevelElement = topLevelElement.enclosingElement;
}
warnable = new ModelElement.from(
topLevelElement, findOrCreateLibraryFor(topLevelElement));
}
if (warnable is Accessor) {
// This might be part of a Field, if so, assign this warning to the field
// rather than the Accessor.
if ((warnable as Accessor).enclosingCombo != null)
warnable = (warnable as Accessor).enclosingCombo;
}
} else {
// If we don't have an element, we need a message to disambiguate.
assert(message != null);
}
if (_packageWarningCounter.hasWarning(warnable?.element, kind, message)) {
return;
}
// Elements that are part of the Dart SDK can have colons in their FQNs.
// This confuses IntelliJ and makes it so it can't link to the location
// of the error in the console window, so separate out the library from
// the path.
// TODO(jcollins-g): What about messages that may include colons? Substituting
// them out doesn't work as well there since it might confuse
// the user, yet we still want IntelliJ to link properly.
Tuple2<String, String> warnableStrings = nameAndLocation(warnable);
String warnablePrefix = 'from';
Tuple2<String, String> referredFromStrings = nameAndLocation(referredFrom);
String referredFromPrefix = 'referred to by';
String name = warnableStrings.item1;
String warningMessage;
switch (kind) {
case PackageWarning.noCanonicalFound:
// Fix these warnings by adding libraries with --include, or by using
// --auto-include-dependencies.
// TODO(jcollins-g): add a dartdoc flag to enable external website linking for non-canonical elements, using .packages for versioning
// TODO(jcollins-g): support documenting multiple packages at once and linking between them
warningMessage = "no canonical library found for ${name}, not linking";
break;
case PackageWarning.ambiguousReexport:
// Fix these warnings by adding the original library exporting the
// symbol with --include, or by using --auto-include-dependencies.
// TODO(jcollins-g): add a dartdoc flag to force a particular resolution order for (or drop) ambiguous reexports
warningMessage =
"ambiguous reexport of ${name}, canonicalization candidates: ${message}";
break;
case PackageWarning.noLibraryLevelDocs:
warningMessage =
"${warnable.fullyQualifiedName} has no library level documentation comments";
break;
case PackageWarning.ambiguousDocReference:
warningMessage = "ambiguous doc reference ${message}";
break;
case PackageWarning.categoryOrderGivesMissingPackageName:
warningMessage =
"--category-order gives invalid package name: '${message}'";
break;
case PackageWarning.unresolvedDocReference:
warningMessage = "unresolved doc reference [${message}]";
if (referredFrom == null) {
referredFrom = warnable.documentationFrom;
}
referredFromPrefix = 'in documentation inherited from';
break;
case PackageWarning.brokenLink:
warningMessage = 'dartdoc generated a broken link to: ${message}';
warnablePrefix = 'to element';
referredFromPrefix = 'linked to from';
break;
case PackageWarning.orphanedFile:
warningMessage = 'dartdoc generated a file orphan: ${message}';
break;
case PackageWarning.unknownFile:
warningMessage =
'dartdoc detected an unknown file in the doc tree: ${message}';
break;
case PackageWarning.missingFromSearchIndex:
warningMessage =
'dartdoc generated a file not in the search index: ${message}';
break;
case PackageWarning.typeAsHtml:
// The message for this warning can contain many punctuation and other symbols,
// so bracket with a triple quote for defense.
warningMessage = 'generic type handled as HTML: """${message}"""';
break;
}
List<String> messageParts = [warningMessage];
if (warnable != null)
messageParts.add(
"${warnablePrefix} ${warnableStrings.item1}: ${warnableStrings.item2}");
if (referredFrom != null && referredFrom != warnable) {
messageParts.add(
"${referredFromPrefix} ${referredFromStrings.item1}: ${referredFromStrings.item2}");
}
String fullMessage;
if (messageParts.length <= 2) {
fullMessage = messageParts.join(', ');
} else {
fullMessage = messageParts.join('\n ');
}
packageWarningCounter.addWarning(
warnable?.element, kind, message, fullMessage);
}