gatherModelNodes method
Populate's _modelNodes with elements in resolvedLibrary.
This is done as Library model objects are created, while we are holding
onto resolvedLibrary objects.
Implementation
// TODO(srawlins): I suspect we populate this mapping with way too many
// objects, too eagerly. They are only needed when writing the source code of
// an element to HTML, and maybe for resolving doc comments. We should find a
// way to get this data only when needed. But it's not immediately obvious to
// me how, because the data is on AST nodes, not the element model.
void gatherModelNodes(DartDocResolvedLibrary resolvedLibrary) {
for (var unit in resolvedLibrary.units) {
for (var directive in unit.directives.whereType<LibraryDirective>()) {
// There should be only one library directive. If there are more, there
// is no harm in grabbing ModelNode for each.
var commentData = directive.documentationComment?.data;
_modelNodes.putIfAbsent(
resolvedLibrary.element,
() => ModelNode(
directive,
resolvedLibrary.element,
_analysisContext,
commentData: commentData,
));
}
for (var declaration in unit.declarations) {
_populateModelNodeFor(declaration);
switch (declaration) {
case ClassDeclaration(body: BlockClassBody(:var members)):
for (var member in members) {
_populateModelNodeFor(member);
}
case EnumDeclaration():
if (declaration.declaredFragment?.element.isPublic ?? false) {
for (var constant in declaration.body.constants) {
_populateModelNodeFor(constant);
}
for (var member in declaration.body.members) {
_populateModelNodeFor(member);
}
}
case MixinDeclaration(body: BlockClassBody(:var members)):
for (var member in members) {
_populateModelNodeFor(member);
}
case ExtensionDeclaration():
if (declaration.declaredFragment?.element.isPublic ?? false) {
for (var member in declaration.body.members) {
_populateModelNodeFor(member);
}
}
case ExtensionTypeDeclaration():
if (declaration.declaredFragment?.element.isPublic ?? false) {
if (declaration.body case BlockClassBody(:var members)) {
for (var member in members) {
_populateModelNodeFor(member);
}
}
}
}
}
}
}