referenceBy method
- @nonVirtual
- List<
String> reference, { - required bool filter(
- CommentReferable?
- bool tryParents = true,
- 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;
}