[cfe] Remove LibraryBuilder.nullableBuilder et al.

Change-Id: I36b2a8c25568d4df90a6a1b039d15519d244be96
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/371123
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2024-06-14 10:10:20 +00:00 committed by Commit Queue
parent b807dbd0cd
commit 289bba506e
18 changed files with 103 additions and 138 deletions

View file

@ -49,7 +49,7 @@ mixin DeclarationBuilderMixin implements IDeclarationBuilder {
{required bool hasExplicitTypeArguments}) { {required bool hasExplicitTypeArguments}) {
return buildAliasedTypeWithBuiltArguments( return buildAliasedTypeWithBuiltArguments(
library, library,
nullabilityBuilder.build(library), nullabilityBuilder.build(),
buildAliasedTypeArguments(library, arguments, hierarchy), buildAliasedTypeArguments(library, arguments, hierarchy),
typeUse, typeUse,
fileUri, fileUri,

View file

@ -26,7 +26,7 @@ abstract class BuiltinTypeDeclarationBuilder extends TypeDeclarationBuilderImpl
int charOffset, int charOffset,
ClassHierarchyBase? hierarchy, ClassHierarchyBase? hierarchy,
{required bool hasExplicitTypeArguments}) { {required bool hasExplicitTypeArguments}) {
return type.withDeclaredNullability(nullabilityBuilder.build(library)); return type.withDeclaredNullability(nullabilityBuilder.build());
} }
@override @override

View file

@ -379,7 +379,7 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
} }
return buildAliasedTypeWithBuiltArguments( return buildAliasedTypeWithBuiltArguments(
library, library,
nullabilityBuilder.build(library), nullabilityBuilder.build(),
buildAliasedTypeArguments(library, arguments, hierarchy), buildAliasedTypeArguments(library, arguments, hierarchy),
typeUse, typeUse,
fileUri, fileUri,

View file

@ -175,8 +175,8 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
t.bound?.build(library, TypeUse.typeParameterBound); t.bound?.build(library, TypeUse.typeParameterBound);
} }
} }
return new FunctionType(positionalParameters, builtReturnType, return new FunctionType(
nullabilityBuilder.build(library), positionalParameters, builtReturnType, nullabilityBuilder.build(),
namedParameters: namedParameters ?? const <NamedType>[], namedParameters: namedParameters ?? const <NamedType>[],
typeParameters: typeParameters ?? const <StructuralParameter>[], typeParameters: typeParameters ?? const <StructuralParameter>[],
requiredParameterCount: requiredParameterCount); requiredParameterCount: requiredParameterCount);

View file

@ -33,7 +33,7 @@ class FutureOrTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
return new FutureOrType( return new FutureOrType(
arguments!.single arguments!.single
.buildAliased(library, TypeUse.typeArgument, hierarchy), .buildAliased(library, TypeUse.typeArgument, hierarchy),
nullabilityBuilder.build(library)); nullabilityBuilder.build());
} }
@override @override

View file

@ -5,17 +5,11 @@
library fasta.library_builder; library fasta.library_builder;
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity; import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
import 'package:kernel/ast.dart' show Class, Library;
import 'package:kernel/ast.dart' show Class, Library, Nullability;
import '../combinator.dart' show CombinatorBuilder; import '../combinator.dart' show CombinatorBuilder;
import '../problems.dart' show internalProblem;
import '../export.dart' show Export; import '../export.dart' show Export;
import '../loader.dart' show Loader; import '../loader.dart' show Loader;
import '../messages.dart' import '../messages.dart'
show show
FormattedMessage, FormattedMessage,
@ -24,9 +18,8 @@ import '../messages.dart'
templateInternalProblemConstructorNotFound, templateInternalProblemConstructorNotFound,
templateInternalProblemNotFoundIn, templateInternalProblemNotFoundIn,
templateInternalProblemPrivateConstructorAccess; templateInternalProblemPrivateConstructorAccess;
import '../problems.dart' show internalProblem;
import '../scope.dart'; import '../scope.dart';
import '../source/name_scheme.dart'; import '../source/name_scheme.dart';
import '../source/offset_map.dart'; import '../source/offset_map.dart';
import '../source/source_class_builder.dart'; import '../source/source_class_builder.dart';
@ -39,7 +32,6 @@ import 'inferable_type_builder.dart';
import 'member_builder.dart'; import 'member_builder.dart';
import 'modifier_builder.dart'; import 'modifier_builder.dart';
import 'name_iterator.dart'; import 'name_iterator.dart';
import 'nullability_builder.dart';
import 'prefix_builder.dart'; import 'prefix_builder.dart';
import 'type_builder.dart'; import 'type_builder.dart';
@ -268,17 +260,6 @@ abstract class LibraryBuilder implements Builder {
void recordAccess( void recordAccess(
CompilationUnit accessor, int charOffset, int length, Uri fileUri); CompilationUnit accessor, int charOffset, int length, Uri fileUri);
Nullability get nullable;
Nullability nullableIfTrue(bool isNullable);
NullabilityBuilder get nullableBuilder;
NullabilityBuilder get nonNullableBuilder;
/// Unused in interface; left in on purpose.
NullabilityBuilder nullableBuilderIfTrue(bool isNullable);
/// Returns `true` if [cls] is the 'Function' class defined in [coreLibrary]. /// Returns `true` if [cls] is the 'Function' class defined in [coreLibrary].
static bool isFunction(Class cls, LibraryBuilder coreLibrary) { static bool isFunction(Class cls, LibraryBuilder coreLibrary) {
return cls.name == 'Function' && _isCoreClass(cls, coreLibrary); return cls.name == 'Function' && _isCoreClass(cls, coreLibrary);
@ -474,33 +455,6 @@ abstract class LibraryBuilderImpl extends ModifierBuilderImpl
void recordAccess( void recordAccess(
CompilationUnit accessor, int charOffset, int length, Uri fileUri) {} CompilationUnit accessor, int charOffset, int length, Uri fileUri) {}
@override
Nullability get nullable {
return Nullability.nullable;
}
@override
Nullability nullableIfTrue(bool isNullable) {
return isNullable ? Nullability.nullable : Nullability.nonNullable;
}
@override
NullabilityBuilder get nullableBuilder {
return const NullabilityBuilder.nullable();
}
@override
NullabilityBuilder get nonNullableBuilder {
return const NullabilityBuilder.omitted();
}
@override
NullabilityBuilder nullableBuilderIfTrue(bool isNullable) {
return isNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted();
}
@override @override
StringBuffer printOn(StringBuffer buffer) { StringBuffer printOn(StringBuffer buffer) {
return buffer..write(isPart || isAugmenting ? fileUri : importUri); return buffer..write(isPart || isAugmenting ? fileUri : importUri);

View file

@ -34,7 +34,7 @@ class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
int charOffset, int charOffset,
ClassHierarchyBase? hierarchy, ClassHierarchyBase? hierarchy,
{required bool hasExplicitTypeArguments}) { {required bool hasExplicitTypeArguments}) {
return type.withDeclaredNullability(nullabilityBuilder.build(library)); return type.withDeclaredNullability(nullabilityBuilder.build());
} }
@override @override

View file

@ -4,8 +4,6 @@
import 'package:kernel/ast.dart'; import 'package:kernel/ast.dart';
import 'library_builder.dart';
/// Represents the nullability modifiers encountered while parsing the types. /// Represents the nullability modifiers encountered while parsing the types.
/// ///
/// The syntactic nullability needs to be interpreted, that is, built, into the /// The syntactic nullability needs to be interpreted, that is, built, into the
@ -48,7 +46,7 @@ class NullabilityBuilder {
} }
} }
Nullability build(LibraryBuilder libraryBuilder) { Nullability build() {
switch (_syntacticNullability) { switch (_syntacticNullability) {
case SyntacticNullability.nullable: case SyntacticNullability.nullable:
return Nullability.nullable; return Nullability.nullable;

View file

@ -256,8 +256,8 @@ abstract class RecordTypeBuilderImpl extends RecordTypeBuilder {
// TODO(johnniwinther): Should we create an [InvalidType] if there is <= 1 // TODO(johnniwinther): Should we create an [InvalidType] if there is <= 1
// entries? // entries?
return new RecordType(positionalEntries, namedEntries ?? [], return new RecordType(
nullabilityBuilder.build(library)); positionalEntries, namedEntries ?? [], nullabilityBuilder.build());
} }
@override @override

View file

@ -182,7 +182,7 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
DartType thisType = buildThisType(); DartType thisType = buildThisType();
if (thisType is InvalidType) return thisType; if (thisType is InvalidType) return thisType;
Nullability nullability = nullabilityBuilder.build(library); Nullability nullability = nullabilityBuilder.build();
return buildAliasedTypeWithBuiltArguments( return buildAliasedTypeWithBuiltArguments(
library, library,
nullability, nullability,
@ -373,7 +373,7 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
if (typeVariables != null) if (typeVariables != null)
for (NominalVariableBuilder typeVariable in typeVariables!) for (NominalVariableBuilder typeVariable in typeVariables!)
new NamedTypeBuilderImpl.fromTypeDeclarationBuilder( new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
typeVariable, libraryBuilder.nonNullableBuilder, typeVariable, const NullabilityBuilder.omitted(),
arguments: const [], arguments: const [],
fileUri: fileUri, fileUri: fileUri,
charOffset: charOffset, charOffset: charOffset,

View file

@ -366,7 +366,7 @@ class NominalVariableBuilder extends TypeVariableBuilderBase {
nullability = nullabilityFromParameterBound; nullability = nullabilityFromParameterBound;
} }
} else { } else {
nullability = nullabilityBuilder.build(library); nullability = nullabilityBuilder.build();
} }
TypeParameterType type = buildAliasedTypeWithBuiltArguments( TypeParameterType type = buildAliasedTypeWithBuiltArguments(
library, nullability, null, typeUse, fileUri, charOffset, library, nullability, null, typeUse, fileUri, charOffset,
@ -403,7 +403,7 @@ class NominalVariableBuilder extends TypeVariableBuilderBase {
if (isAugmenting) return; if (isAugmenting) return;
DartType objectType = object.buildAliasedType( DartType objectType = object.buildAliasedType(
library, library,
library.nullableBuilder, const NullabilityBuilder.nullable(),
/* arguments = */ null, /* arguments = */ null,
TypeUse.typeParameterBound, TypeUse.typeParameterBound,
fileUri ?? missingUri, fileUri ?? missingUri,
@ -705,7 +705,7 @@ class StructuralVariableBuilder extends TypeVariableBuilderBase {
StructuralParameterType.computeNullabilityFromBound(parameter); StructuralParameterType.computeNullabilityFromBound(parameter);
} }
} else { } else {
nullability = nullabilityBuilder.build(library); nullability = nullabilityBuilder.build();
} }
StructuralParameterType type = buildAliasedTypeWithBuiltArguments( StructuralParameterType type = buildAliasedTypeWithBuiltArguments(
library, nullability, null, typeUse, fileUri, charOffset, library, nullability, null, typeUse, fileUri, charOffset,
@ -753,7 +753,7 @@ class StructuralVariableBuilder extends TypeVariableBuilderBase {
if (isAugmenting) return; if (isAugmenting) return;
DartType objectType = object.buildAliasedType( DartType objectType = object.buildAliasedType(
library, library,
library.nullableBuilder, const NullabilityBuilder.nullable(),
/* arguments = */ null, /* arguments = */ null,
TypeUse.typeParameterBound, TypeUse.typeParameterBound,
fileUri ?? missingUri, fileUri ?? missingUri,

View file

@ -5052,7 +5052,9 @@ class BodyBuilder extends StackListenerImpl
if (prefix is ParserErrorGenerator) { if (prefix is ParserErrorGenerator) {
// An error have already been issued. // An error have already been issued.
push(prefix.buildTypeWithResolvedArgumentsDoNotAddProblem( push(prefix.buildTypeWithResolvedArgumentsDoNotAddProblem(
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable))); isMarkedAsNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted()));
return; return;
} else if (prefix is Generator) { } else if (prefix is Generator) {
name = prefix.qualifiedLookup(suffix); name = prefix.qualifiedLookup(suffix);
@ -5065,7 +5067,9 @@ class BodyBuilder extends StackListenerImpl
message, offset, lengthOfSpan(beginToken, suffix), uri); message, offset, lengthOfSpan(beginToken, suffix), uri);
push(new NamedTypeBuilderImpl.forInvalidType( push(new NamedTypeBuilderImpl.forInvalidType(
name, name,
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), isMarkedAsNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
message.withLocation( message.withLocation(
uri, offset, lengthOfSpan(beginToken, suffix)))); uri, offset, lengthOfSpan(beginToken, suffix))));
return; return;
@ -5080,7 +5084,10 @@ class BodyBuilder extends StackListenerImpl
allowPotentiallyConstantType = inIsOrAsOperatorType; allowPotentiallyConstantType = inIsOrAsOperatorType;
} }
result = name.buildTypeWithResolvedArguments( result = name.buildTypeWithResolvedArguments(
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), arguments, isMarkedAsNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
arguments,
allowPotentiallyConstantType: allowPotentiallyConstantType, allowPotentiallyConstantType: allowPotentiallyConstantType,
performTypeCanonicalization: constantContext != ConstantContext.none); performTypeCanonicalization: constantContext != ConstantContext.none);
} else if (name is ProblemBuilder) { } else if (name is ProblemBuilder) {
@ -5089,7 +5096,9 @@ class BodyBuilder extends StackListenerImpl
name.message, name.charOffset, name.name.length, name.fileUri); name.message, name.charOffset, name.name.length, name.fileUri);
result = new NamedTypeBuilderImpl.forInvalidType( result = new NamedTypeBuilderImpl.forInvalidType(
name.name, name.name,
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), isMarkedAsNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
name.message name.message
.withLocation(name.fileUri, name.charOffset, name.name.length)); .withLocation(name.fileUri, name.charOffset, name.name.length));
} else { } else {
@ -5178,8 +5187,8 @@ class BodyBuilder extends StackListenerImpl
positionalFields, positionalFields,
namedFields, namedFields,
questionMark != null questionMark != null
? libraryBuilder.nullableBuilder ? const NullabilityBuilder.nullable()
: libraryBuilder.nonNullableBuilder, : const NullabilityBuilder.omitted(),
uri, uri,
leftBracket.charOffset, leftBracket.charOffset,
)); ));
@ -5235,7 +5244,9 @@ class BodyBuilder extends StackListenerImpl
pop() as List<StructuralVariableBuilder>?; pop() as List<StructuralVariableBuilder>?;
TypeBuilder type = formals.toFunctionType( TypeBuilder type = formals.toFunctionType(
returnType ?? const ImplicitTypeBuilder(), returnType ?? const ImplicitTypeBuilder(),
libraryBuilder.nullableBuilderIfTrue(questionMark != null), questionMark != null
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
structuralVariableBuilders: typeVariables, structuralVariableBuilders: typeVariables,
hasFunctionFormalParameterSyntax: false); hasFunctionFormalParameterSyntax: false);
exitLocalScope(); exitLocalScope();
@ -5547,7 +5558,9 @@ class BodyBuilder extends StackListenerImpl
pop() as List<StructuralVariableBuilder>?; pop() as List<StructuralVariableBuilder>?;
TypeBuilder type = formals.toFunctionType( TypeBuilder type = formals.toFunctionType(
returnType ?? const ImplicitTypeBuilder(), returnType ?? const ImplicitTypeBuilder(),
libraryBuilder.nullableBuilderIfTrue(question != null), question != null
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
structuralVariableBuilders: typeVariables, structuralVariableBuilders: typeVariables,
hasFunctionFormalParameterSyntax: true); hasFunctionFormalParameterSyntax: true);
exitLocalScope(); exitLocalScope();
@ -9297,7 +9310,7 @@ class BodyBuilder extends StackListenerImpl
expression = new Let( expression = new Let(
new VariableDeclaration.forValue(argument, new VariableDeclaration.forValue(argument,
isFinal: true, isFinal: true,
type: coreTypes.objectRawType(libraryBuilder.nullable)), type: coreTypes.objectRawType(Nullability.nullable)),
expression); expression);
} }
return expression; return expression;

View file

@ -3064,7 +3064,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
offsetForToken(token), offsetForToken(token),
_helper.buildDartType( _helper.buildDartType(
buildTypeWithResolvedArguments( buildTypeWithResolvedArguments(
_helper.libraryBuilder.nonNullableBuilder, typeArguments, const NullabilityBuilder.omitted(), typeArguments,
allowPotentiallyConstantType: true, allowPotentiallyConstantType: true,
performTypeCanonicalization: true), performTypeCanonicalization: true),
TypeUse.typeLiteral, TypeUse.typeLiteral,

View file

@ -118,7 +118,7 @@ class TypeBuilderIdentifier extends IdentifierImpl {
NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) { NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
return typeBuilder.declaration!.buildAliasedTypeWithBuiltArguments( return typeBuilder.declaration!.buildAliasedTypeWithBuiltArguments(
libraryBuilder, libraryBuilder,
nullabilityBuilder.build(libraryBuilder), nullabilityBuilder.build(),
typeArguments, typeArguments,
TypeUse.macroTypeArgument, TypeUse.macroTypeArgument,
// TODO(johnniwinther): How should handle malbounded types here? Should // TODO(johnniwinther): How should handle malbounded types here? Should
@ -180,7 +180,7 @@ class TypeDeclarationBuilderIdentifier extends IdentifierImpl {
NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) { NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
return typeDeclarationBuilder.buildAliasedTypeWithBuiltArguments( return typeDeclarationBuilder.buildAliasedTypeWithBuiltArguments(
libraryBuilder, libraryBuilder,
nullabilityBuilder.build(libraryBuilder), nullabilityBuilder.build(),
// TODO(johnniwinther): How should handle malbounded types here? Should // TODO(johnniwinther): How should handle malbounded types here? Should
// we report an error on the annotation? // we report an error on the annotation?
typeArguments, typeArguments,

View file

@ -1327,8 +1327,7 @@ class OutlineBuilder extends StackListenerImpl {
String classNameForErrors = identifier.name; String classNameForErrors = identifier.name;
if (supertype != null) { if (supertype != null) {
if (supertype.nullabilityBuilder.build(libraryBuilder) == if (supertype.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableSuperclassError templateNullableSuperclassError
.withArguments(supertype.fullNameForErrors), .withArguments(supertype.fullNameForErrors),
@ -1340,8 +1339,7 @@ class OutlineBuilder extends StackListenerImpl {
if (mixinApplication != null) { if (mixinApplication != null) {
List<TypeBuilder>? mixins = mixinApplication.mixins; List<TypeBuilder>? mixins = mixinApplication.mixins;
for (TypeBuilder mixin in mixins) { for (TypeBuilder mixin in mixins) {
if (mixin.nullabilityBuilder.build(libraryBuilder) == if (mixin.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableMixinError templateNullableMixinError
.withArguments(mixin.fullNameForErrors), .withArguments(mixin.fullNameForErrors),
@ -1353,8 +1351,7 @@ class OutlineBuilder extends StackListenerImpl {
} }
if (interfaces != null) { if (interfaces != null) {
for (TypeBuilder interface in interfaces) { for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) == if (interface.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableInterfaceError templateNullableInterfaceError
.withArguments(interface.fullNameForErrors), .withArguments(interface.fullNameForErrors),
@ -1437,8 +1434,7 @@ class OutlineBuilder extends StackListenerImpl {
String classNameForErrors = identifier.name; String classNameForErrors = identifier.name;
if (supertypeConstraints != null) { if (supertypeConstraints != null) {
for (TypeBuilder supertype in supertypeConstraints) { for (TypeBuilder supertype in supertypeConstraints) {
if (supertype.nullabilityBuilder.build(libraryBuilder) == if (supertype.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableSuperclassError templateNullableSuperclassError
.withArguments(supertype.fullNameForErrors), .withArguments(supertype.fullNameForErrors),
@ -1450,8 +1446,7 @@ class OutlineBuilder extends StackListenerImpl {
} }
if (interfaces != null) { if (interfaces != null) {
for (TypeBuilder interface in interfaces) { for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) == if (interface.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableInterfaceError templateNullableInterfaceError
.withArguments(interface.fullNameForErrors), .withArguments(interface.fullNameForErrors),
@ -2515,8 +2510,7 @@ class OutlineBuilder extends StackListenerImpl {
mixinApplication as MixinApplicationBuilder; mixinApplication as MixinApplicationBuilder;
List<TypeBuilder> mixins = mixinApplicationBuilder.mixins; List<TypeBuilder> mixins = mixinApplicationBuilder.mixins;
if (supertype is TypeBuilder && supertype is! MixinApplicationBuilder) { if (supertype is TypeBuilder && supertype is! MixinApplicationBuilder) {
if (supertype.nullabilityBuilder.build(libraryBuilder) == if (supertype.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableSuperclassError templateNullableSuperclassError
.withArguments(supertype.fullNameForErrors), .withArguments(supertype.fullNameForErrors),
@ -2526,8 +2520,7 @@ class OutlineBuilder extends StackListenerImpl {
} }
} }
for (TypeBuilder mixin in mixins) { for (TypeBuilder mixin in mixins) {
if (mixin.nullabilityBuilder.build(libraryBuilder) == if (mixin.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableMixinError.withArguments(mixin.fullNameForErrors), templateNullableMixinError.withArguments(mixin.fullNameForErrors),
identifier.nameOffset, identifier.nameOffset,
@ -2537,8 +2530,7 @@ class OutlineBuilder extends StackListenerImpl {
} }
if (interfaces != null) { if (interfaces != null) {
for (TypeBuilder interface in interfaces) { for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) == if (interface.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableInterfaceError templateNullableInterfaceError
.withArguments(interface.fullNameForErrors), .withArguments(interface.fullNameForErrors),
@ -2622,7 +2614,9 @@ class OutlineBuilder extends StackListenerImpl {
Identifier identifier = name as Identifier; Identifier identifier = name as Identifier;
push(libraryBuilder.addNamedType( push(libraryBuilder.addNamedType(
identifier.typeName, identifier.typeName,
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), isMarkedAsNullable
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
arguments, arguments,
identifier.qualifierOffset, identifier.qualifierOffset,
instanceTypeVariableAccess: instanceTypeVariableAccess:
@ -3059,8 +3053,7 @@ class OutlineBuilder extends StackListenerImpl {
} }
if (interfaces != null) { if (interfaces != null) {
for (TypeBuilder interface in interfaces) { for (TypeBuilder interface in interfaces) {
if (interface.nullabilityBuilder.build(libraryBuilder) == if (interface.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
libraryBuilder.addProblem( libraryBuilder.addProblem(
templateNullableInterfaceError templateNullableInterfaceError
.withArguments(interface.fullNameForErrors), .withArguments(interface.fullNameForErrors),
@ -3150,8 +3143,8 @@ class OutlineBuilder extends StackListenerImpl {
positionalFields, positionalFields,
namedFields, namedFields,
questionMark != null questionMark != null
? libraryBuilder.nullableBuilder ? const NullabilityBuilder.nullable()
: libraryBuilder.nonNullableBuilder, : const NullabilityBuilder.omitted(),
uri, uri,
leftBracket.charOffset, leftBracket.charOffset,
)); ));
@ -3208,7 +3201,9 @@ class OutlineBuilder extends StackListenerImpl {
returnType ?? const ImplicitTypeBuilder(), returnType ?? const ImplicitTypeBuilder(),
typeVariables, typeVariables,
formals, formals,
libraryBuilder.nullableBuilderIfTrue(questionMark != null), questionMark != null
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
uri, uri,
functionToken.charOffset, functionToken.charOffset,
hasFunctionFormalParameterSyntax: false)); hasFunctionFormalParameterSyntax: false));
@ -3227,7 +3222,9 @@ class OutlineBuilder extends StackListenerImpl {
returnType ?? const ImplicitTypeBuilder(), returnType ?? const ImplicitTypeBuilder(),
typeVariables, typeVariables,
formals, formals,
libraryBuilder.nullableBuilderIfTrue(question != null), question != null
? const NullabilityBuilder.nullable()
: const NullabilityBuilder.omitted(),
uri, uri,
formalsOffset, formalsOffset,
hasFunctionFormalParameterSyntax: true)); hasFunctionFormalParameterSyntax: true));
@ -3311,8 +3308,7 @@ class OutlineBuilder extends StackListenerImpl {
identifier = name as Identifier; identifier = name as Identifier;
if (type is FunctionTypeBuilder && if (type is FunctionTypeBuilder &&
!libraryFeatures.nonfunctionTypeAliases.isEnabled) { !libraryFeatures.nonfunctionTypeAliases.isEnabled) {
if (type.nullabilityBuilder.build(libraryBuilder) == if (type.nullabilityBuilder.build() == Nullability.nullable) {
Nullability.nullable) {
// The error is reported when the non-nullable experiment is enabled. // The error is reported when the non-nullable experiment is enabled.
// Otherwise, the attempt to use a nullable type will be reported // Otherwise, the attempt to use a nullable type will be reported
// elsewhere. // elsewhere.

View file

@ -2194,7 +2194,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
element.expression, element.expression,
new InterfaceType( new InterfaceType(
coreTypes.iterableClass, coreTypes.iterableClass,
libraryBuilder.nullableIfTrue(element.isNullAware), element.isNullAware
? Nullability.nullable
: Nullability.nonNullable,
<DartType>[inferredTypeArgument]), <DartType>[inferredTypeArgument]),
isVoidAllowed: true); isVoidAllowed: true);
element.expression = spreadResult.expression..parent = element; element.expression = spreadResult.expression..parent = element;
@ -2601,8 +2603,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
DartType? spreadType = inferredSpreadTypes[item.expression]; DartType? spreadType = inferredSpreadTypes[item.expression];
if (spreadType is DynamicType) { if (spreadType is DynamicType) {
Expression expression = ensureAssignable( Expression expression = ensureAssignable(
coreTypes.iterableRawType( coreTypes.iterableRawType(item.isNullAware
libraryBuilder.nullableIfTrue(item.isNullAware)), ? Nullability.nullable
: Nullability.nonNullable),
spreadType, spreadType,
item.expression); item.expression);
item.expression = expression..parent = item; item.expression = expression..parent = item;
@ -3032,7 +3035,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
temp = _createVariable( temp = _createVariable(
value, value,
typeSchemaEnvironment.iterableType( typeSchemaEnvironment.iterableType(
elementType, libraryBuilder.nullable)); elementType, Nullability.nullable));
body.add(temp); body.add(temp);
value = _createNullCheckedVariableGet(temp); value = _createNullCheckedVariableGet(temp);
} }
@ -3059,7 +3062,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
temp = _createVariable( temp = _createVariable(
value, value,
typeSchemaEnvironment.iterableType( typeSchemaEnvironment.iterableType(
const DynamicType(), libraryBuilder.nullable)); const DynamicType(), Nullability.nullable));
body.add(temp); body.add(temp);
value = _createNullCheckedVariableGet(temp); value = _createNullCheckedVariableGet(temp);
} }
@ -3382,7 +3385,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
temp = _createVariable( temp = _createVariable(
value, value,
typeSchemaEnvironment.mapType( typeSchemaEnvironment.mapType(
keyType, valueType, libraryBuilder.nullable)); keyType, valueType, Nullability.nullable));
body.add(temp); body.add(temp);
value = _createNullCheckedVariableGet(temp); value = _createNullCheckedVariableGet(temp);
} }
@ -3408,7 +3411,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
temp = _createVariable( temp = _createVariable(
value, value,
typeSchemaEnvironment.mapType(const DynamicType(), typeSchemaEnvironment.mapType(const DynamicType(),
const DynamicType(), libraryBuilder.nullable)); const DynamicType(), Nullability.nullable));
body.add(temp); body.add(temp);
value = _createNullCheckedVariableGet(temp); value = _createNullCheckedVariableGet(temp);
} }
@ -3510,7 +3513,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
VariableDeclaration temp = _createVariable( VariableDeclaration temp = _createVariable(
spreadExpression, spreadExpression,
typeSchemaEnvironment.iterableType( typeSchemaEnvironment.iterableType(
elementType, libraryBuilder.nullable)); elementType, Nullability.nullable));
parts.add(_createNullAwareGuard(element.fileOffset, temp, parts.add(_createNullAwareGuard(element.fileOffset, temp,
makeLiteral(element.fileOffset, []), iterableType)); makeLiteral(element.fileOffset, []), iterableType));
} else { } else {
@ -3584,7 +3587,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
Expression spreadExpression = entry.expression; Expression spreadExpression = entry.expression;
if (entry.isNullAware) { if (entry.isNullAware) {
VariableDeclaration temp = _createVariable(spreadExpression, VariableDeclaration temp = _createVariable(spreadExpression,
collectionType.withDeclaredNullability(libraryBuilder.nullable)); collectionType.withDeclaredNullability(Nullability.nullable));
parts.add(_createNullAwareGuard(entry.fileOffset, temp, parts.add(_createNullAwareGuard(entry.fileOffset, temp,
makeLiteral(entry.fileOffset, []), collectionType)); makeLiteral(entry.fileOffset, []), collectionType));
} else { } else {
@ -4045,11 +4048,11 @@ class InferenceVisitorImpl extends InferenceVisitorBase
bool isMap = typeSchemaEnvironment.isSubtypeOf( bool isMap = typeSchemaEnvironment.isSubtypeOf(
spreadType, spreadType,
coreTypes.mapRawType(libraryBuilder.nullable), coreTypes.mapRawType(Nullability.nullable),
SubtypeCheckMode.withNullabilities); SubtypeCheckMode.withNullabilities);
bool isIterable = typeSchemaEnvironment.isSubtypeOf( bool isIterable = typeSchemaEnvironment.isSubtypeOf(
spreadType, spreadType,
coreTypes.iterableRawType(libraryBuilder.nullable), coreTypes.iterableRawType(Nullability.nullable),
SubtypeCheckMode.withNullabilities); SubtypeCheckMode.withNullabilities);
if (isMap && !isIterable) { if (isMap && !isIterable) {
offsets.mapSpreadOffset = entry.fileOffset; offsets.mapSpreadOffset = entry.fileOffset;
@ -4530,8 +4533,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
DartType? spreadType = inferredSpreadTypes[entry.expression]; DartType? spreadType = inferredSpreadTypes[entry.expression];
if (spreadType is DynamicType) { if (spreadType is DynamicType) {
Expression expression = ensureAssignable( Expression expression = ensureAssignable(
coreTypes coreTypes.mapRawType(entry.isNullAware
.mapRawType(libraryBuilder.nullableIfTrue(entry.isNullAware)), ? Nullability.nullable
: Nullability.nonNullable),
spreadType, spreadType,
entry.expression); entry.expression);
entry.expression = expression..parent = entry; entry.expression = expression..parent = entry;
@ -6072,7 +6076,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
DartType rightType = DartType rightType =
operations.getNullableType(equalsTarget.getBinaryOperandType(this)); operations.getNullableType(equalsTarget.getBinaryOperandType(this));
DartType contextType = DartType contextType =
rightType.withDeclaredNullability(libraryBuilder.nullable); rightType.withDeclaredNullability(Nullability.nullable);
rightResult = ensureAssignableResult(contextType, rightResult, rightResult = ensureAssignableResult(contextType, rightResult,
errorTemplate: templateArgumentTypeNotAssignable, errorTemplate: templateArgumentTypeNotAssignable,
nullabilityErrorTemplate: templateArgumentTypeNotAssignableNullability, nullabilityErrorTemplate: templateArgumentTypeNotAssignableNullability,
@ -8986,7 +8990,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
CheckLibraryIsLoaded node, DartType typeContext) { CheckLibraryIsLoaded node, DartType typeContext) {
// TODO(cstefantsova): Figure out the suitable nullability for that. // TODO(cstefantsova): Figure out the suitable nullability for that.
return new ExpressionInferenceResult( return new ExpressionInferenceResult(
coreTypes.objectRawType(libraryBuilder.nullable), node); coreTypes.objectRawType(Nullability.nullable), node);
} }
ExpressionInferenceResult visitEquals( ExpressionInferenceResult visitEquals(

View file

@ -2097,7 +2097,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
formalTypesFromContext[i]!); formalTypesFromContext[i]!);
if (typeSchemaEnvironment.isSubtypeOf(inferredType, const NullType(), if (typeSchemaEnvironment.isSubtypeOf(inferredType, const NullType(),
SubtypeCheckMode.withNullabilities)) { SubtypeCheckMode.withNullabilities)) {
inferredType = coreTypes.objectRawType(libraryBuilder.nullable); inferredType = coreTypes.objectRawType(Nullability.nullable);
} }
} else { } else {
inferredType = const DynamicType(); inferredType = const DynamicType();
@ -3381,7 +3381,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
// operator == always allows nullable arguments. // operator == always allows nullable arguments.
functionType = new FunctionType([ functionType = new FunctionType([
functionType.positionalParameters.single functionType.positionalParameters.single
.withDeclaredNullability(libraryBuilder.nullable) .withDeclaredNullability(Nullability.nullable)
], functionType.returnType, functionType.declaredNullability); ], functionType.returnType, functionType.declaredNullability);
} }
InvocationInferenceResult result = inferInvocation( InvocationInferenceResult result = inferInvocation(

View file

@ -185,9 +185,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 17, hitCount: 17,
missCount: 3, missCount: 3,
), ),
// 80.85106382978722%. // 79.7752808988764%.
"package:front_end/src/fasta/builder/library_builder.dart": ( "package:front_end/src/fasta/builder/library_builder.dart": (
hitCount: 76, hitCount: 71,
missCount: 18, missCount: 18,
), ),
// 97.38562091503267%. // 97.38562091503267%.
@ -250,9 +250,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 151, hitCount: 151,
missCount: 44, missCount: 44,
), ),
// 78.99159663865547%. // 78.8135593220339%.
"package:front_end/src/fasta/builder/type_alias_builder.dart": ( "package:front_end/src/fasta/builder/type_alias_builder.dart": (
hitCount: 188, hitCount: 186,
missCount: 50, missCount: 50,
), ),
// 77.77777777777779%. // 77.77777777777779%.
@ -265,9 +265,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 9, hitCount: 9,
missCount: 1, missCount: 1,
), ),
// 78.42227378190255%. // 78.32167832167832%.
"package:front_end/src/fasta/builder/type_variable_builder.dart": ( "package:front_end/src/fasta/builder/type_variable_builder.dart": (
hitCount: 338, hitCount: 336,
missCount: 93, missCount: 93,
), ),
// 100.0%. // 100.0%.
@ -421,9 +421,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 0, hitCount: 0,
missCount: 128, missCount: 128,
), ),
// 91.26941617568292%. // 91.24832214765101%.
"package:front_end/src/fasta/kernel/body_builder.dart": ( "package:front_end/src/fasta/kernel/body_builder.dart": (
hitCount: 6816, hitCount: 6798,
missCount: 652, missCount: 652,
), ),
// 70.40816326530613%. // 70.40816326530613%.
@ -471,9 +471,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 478, hitCount: 478,
missCount: 163, missCount: 163,
), ),
// 79.56411876184461%. // 79.54473601011698%.
"package:front_end/src/fasta/kernel/expression_generator.dart": ( "package:front_end/src/fasta/kernel/expression_generator.dart": (
hitCount: 2519, hitCount: 2516,
missCount: 647, missCount: 647,
), ),
// 100.0%. // 100.0%.
@ -589,7 +589,7 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
// 0.0%. // 0.0%.
"package:front_end/src/fasta/kernel/macro/identifiers.dart": ( "package:front_end/src/fasta/kernel/macro/identifiers.dart": (
hitCount: 0, hitCount: 0,
missCount: 134, missCount: 132,
), ),
// 0.0%. // 0.0%.
"package:front_end/src/fasta/kernel/macro/introspectors.dart": ( "package:front_end/src/fasta/kernel/macro/introspectors.dart": (
@ -706,9 +706,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 118, hitCount: 118,
missCount: 6, missCount: 6,
), ),
// 91.45299145299145%. // 91.38284776364382%.
"package:front_end/src/fasta/source/outline_builder.dart": ( "package:front_end/src/fasta/source/outline_builder.dart": (
hitCount: 2247, hitCount: 2227,
missCount: 210, missCount: 210,
), ),
// 94.44444444444444%. // 94.44444444444444%.
@ -827,14 +827,14 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 166, hitCount: 166,
missCount: 29, missCount: 29,
), ),
// 90.25658807212206%. // 90.25040575005796%.
"package:front_end/src/fasta/type_inference/inference_visitor.dart": ( "package:front_end/src/fasta/type_inference/inference_visitor.dart": (
hitCount: 7809, hitCount: 7785,
missCount: 843, missCount: 841,
), ),
// 84.56303724928367%. // 84.54088952654233%.
"package:front_end/src/fasta/type_inference/inference_visitor_base.dart": ( "package:front_end/src/fasta/type_inference/inference_visitor_base.dart": (
hitCount: 2361, hitCount: 2357,
missCount: 431, missCount: 431,
), ),
// 80.26509572901325%. // 80.26509572901325%.