in lib/src/builder.dart [259:303]
void _addType(analyzer.DartType? type) {
if (type == null) return;
if (type is analyzer.InterfaceType) {
final alreadyVisitedElement = _elements.contains(type.element);
_elements.add(type.element);
type.typeArguments.forEach(_addType);
if (!alreadyVisitedElement) {
type.element.typeParameters.forEach(visitTypeParameterElement);
final toStringMethod =
type.element.lookUpMethod('toString', type.element.library);
if (toStringMethod != null && toStringMethod.parameters.isNotEmpty) {
// In a Fake class which implements a class which overrides `toString`
// with additional (optional) parameters, we must also override
// `toString` and reference the same types referenced in those
// parameters.
for (final parameter in toStringMethod.parameters) {
final parameterType = parameter.type;
if (parameterType is analyzer.InterfaceType) {
parameterType.element.accept(this);
}
}
}
}
} else if (type is analyzer.FunctionType) {
_addType(type.returnType);
// [RecursiveElementVisitor] does not "step out of" the element model,
// into types, while traversing, so we must explicitly traverse [type]
// here, in order to visit contained elements.
if (type.typeFormals != null) {
for (var typeParameter in type.typeFormals) {
typeParameter.accept(this);
}
}
for (var parameter in type.parameters) {
parameter.accept(this);
}
var aliasElement = type.alias?.element;
if (aliasElement != null) {
_elements.add(aliasElement);
}
}
}