blob: 9c7d1e44143725ae3ebe6471721a8bf1b0bf426b [file] [log] [blame]
// 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;
}