referenceBy method

  1. @nonVirtual
CommentReferable? referenceBy(
  1. List<String> reference, {
  2. required bool filter(
    1. CommentReferable?
    ),
  3. bool tryParents = true,
  4. Iterable<CommentReferable>? parentOverrides,
})
inherited

Looks up a comment reference by its component parts.

If tryParents is true, try looking up the same reference in any parents of this. Will skip over results that do not pass a given filter and keep searching.

Implementation

@nonVirtual
CommentReferable? referenceBy(
  List<String> reference, {
  required bool Function(CommentReferable?) filter,
  bool tryParents = true,
  Iterable<CommentReferable>? parentOverrides,
}) {
  parentOverrides ??= referenceParents;
  if (reference.isEmpty) {
    return tryParents ? null : this;
  }
  for (var referenceLookup in _childLookups(reference)) {
    // First attempt: Ask analyzer's `Scope.lookup` API.
    var result = _lookupViaScope(referenceLookup, filter: filter);
    if (result != null) {
      if (result is Prefix &&
          result.name == '_' &&
          library!.element.featureSet.isEnabled(Feature.wildcard_variables)) {
        // A wildcard import prefix is non-binding.
        continue;
      }
      return result;
    }

    // Second attempt: Look through `referenceChildren`.
    final referenceChildren = this.referenceChildren;
    final childrenResult = referenceChildren[referenceLookup.lookup];
    if (childrenResult != null) {
      var result = _recurseChildrenAndFilter(
        referenceLookup,
        childrenResult,
        filter: filter,
      );
      if (result != null) {
        return result;
      }
    }
  }
  // If we can't find it in children, try searching parents if allowed.
  if (tryParents) {
    for (var parent in parentOverrides) {
      var result = parent.referenceBy(
        reference,
        tryParents: true,
        parentOverrides: referenceGrandparentOverrides,
        filter: filter,
      );
      if (result != null) return result;
    }
  }
  return null;
}