blob: c1f2d9c81c5b99d96d8cb5d96980653a47eadb18 [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/element/element.dart';
extension LibraryElementExtension on LibraryElement {
/// Locates an [Element] in this library by its [ElementLocation].
///
/// It is assumed that the first component of [location] matches this library.
///
/// Local elements such as variables inside functions cannot be found using
/// this method.
Element? locateElement(ElementLocation location) =>
_locateElement(location, 0);
}
extension _ElementExtension on Element {
/// Locates an [Element] by its [ElementLocation] assuming this element
/// is a match up to [thisIndex].
Element? _locateElement(ElementLocation location, int thisIndex) {
var components = location.components;
IndexError.check(thisIndex, components.length, indexable: components);
var nextIndex = thisIndex + 1;
if (nextIndex == components.length) {
// This element matches the last component so return it.
return this;
}
// Search for a matching child.
var identifier = components[nextIndex];
for (var child in children) {
if ((child as ElementImpl).identifier == identifier) {
return child._locateElement(location, nextIndex);
}
}
return null;
}
}