| // Copyright (c) 2016, 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. |
| |
| part of 'declaration_builders.dart'; |
| |
| /// [InvalidBuilder] encapsulates an erroneous state as [Builder]. |
| /// |
| /// If [errorHasBeenReported] is `true`, the message has already been reported. |
| /// Otherwise the [message] must be reported upon use. |
| /// |
| /// This builder implements both [TypeDeclarationBuilder] and [MemberBuilder] |
| /// so that it can be used both in types and in member lookups. |
| class InvalidBuilder extends TypeDeclarationBuilderImpl |
| with ErroneousMemberBuilderMixin |
| implements TypeDeclarationBuilder { |
| @override |
| final String name; |
| |
| final LocatedMessage message; |
| |
| final List<LocatedMessage>? context; |
| |
| final bool errorHasBeenReported; |
| |
| InvalidBuilder(this.name, this.message, |
| {this.context, this.errorHasBeenReported = true}); |
| |
| @override |
| int get typeParametersCount => 0; |
| |
| @override |
| Builder? get parent => null; |
| |
| @override |
| // Coverage-ignore(suite): Not run. |
| int get fileOffset => message.charOffset; |
| |
| @override |
| // Coverage-ignore(suite): Not run. |
| Uri get fileUri => message.uri!; |
| |
| @override |
| DartType buildAliasedType( |
| LibraryBuilder library, |
| NullabilityBuilder nullabilityBuilder, |
| List<TypeBuilder>? arguments, |
| TypeUse typeUse, |
| Uri fileUri, |
| int charOffset, |
| ClassHierarchyBase? hierarchy, |
| {required bool hasExplicitTypeArguments}) { |
| return buildAliasedTypeWithBuiltArguments( |
| library, null, null, typeUse, fileUri, charOffset, |
| hasExplicitTypeArguments: hasExplicitTypeArguments); |
| } |
| |
| /// [Arguments] have already been built. |
| @override |
| DartType buildAliasedTypeWithBuiltArguments( |
| LibraryBuilder library, |
| Nullability? nullability, |
| List<DartType>? arguments, |
| TypeUse typeUse, |
| Uri fileUri, |
| int charOffset, |
| {required bool hasExplicitTypeArguments}) { |
| if (!errorHasBeenReported) { |
| library.addProblem(message.messageObject, message.charOffset, |
| message.length, message.uri, |
| context: context); |
| } |
| return const InvalidType(); |
| } |
| |
| @override |
| Nullability computeNullabilityWithArguments(List<TypeBuilder>? typeArguments, |
| {required Map<TypeParameterBuilder, TraversalState> |
| typeParametersTraversalState}) { |
| // TODO(johnniwinther,cstefantsova): Consider implementing |
| // invalidNullability. |
| return Nullability.nullable; |
| } |
| |
| @override |
| // TODO(johnniwinther): This should probably return `null`. |
| MemberBuilder get getable => this; |
| |
| @override |
| MemberBuilder? get setable => null; |
| } |