gatherModelNodes method

void gatherModelNodes(
  1. DartDocResolvedLibrary resolvedLibrary
)

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);
              }
            }
          }
      }
    }
  }
}