blob: b3b11de25afb608f4be63a8b32502184545a5543 [file] [log] [blame]
// Copyright (c) 2023, 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 '../ast.dart';
class FindTypeVisitor implements DartTypeVisitor<bool> {
const FindTypeVisitor();
@override
bool visitAuxiliaryType(AuxiliaryType node) {
throw new UnsupportedError(
'Unsupported auxiliary type $node (${node.runtimeType}).');
}
@override
bool visitFunctionType(FunctionType node) {
if (node.returnType.accept(this)) return true;
for (DartType parameterType in node.positionalParameters) {
if (parameterType.accept(this)) return true;
}
for (NamedType namedParameterType in node.namedParameters) {
if (namedParameterType.type.accept(this)) return true;
}
for (StructuralParameter parameter in node.typeParameters) {
if (parameter.bound.accept(this)) return true;
if (parameter.defaultType.accept(this)) return true;
}
return false;
}
@override
bool visitInterfaceType(InterfaceType node) {
for (DartType typeArgument in node.typeArguments) {
if (typeArgument.accept(this)) return true;
}
return false;
}
@override
bool visitTypedefType(TypedefType node) {
for (DartType typeArgument in node.typeArguments) {
if (typeArgument.accept(this)) return true;
}
return false;
}
@override
bool visitTypeParameterType(TypeParameterType node) => false;
@override
bool visitStructuralParameterType(StructuralParameterType) {
return false;
}
@override
bool visitIntersectionType(IntersectionType node) {
return node.left.accept(this) || node.right.accept(this);
}
@override
bool visitDynamicType(DynamicType node) => false;
@override
bool visitExtensionType(ExtensionType node) {
for (DartType typeArgument in node.typeArguments) {
if (typeArgument.accept(this)) return true;
}
return false;
}
@override
bool visitFutureOrType(FutureOrType node) {
return node.typeArgument.accept(this);
}
@override
bool visitInvalidType(InvalidType node) => false;
@override
bool visitNeverType(NeverType node) => false;
@override
bool visitNullType(NullType node) => false;
@override
bool visitRecordType(RecordType node) {
for (DartType parameterType in node.positional) {
if (parameterType.accept(this)) return true;
}
for (NamedType namedParameterType in node.named) {
if (namedParameterType.type.accept(this)) return true;
}
return false;
}
@override
bool visitVoidType(VoidType node) => false;
}