[dart2js] migrate kernel/env.dart to null safety

Change-Id: I0913b133a39f72d29b5332ae38ad7a7a5dba48af
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/260078
Reviewed-by: Mayank Patke <fishythefish@google.com>
Reviewed-by: Nate Biggs <natebiggs@google.com>
This commit is contained in:
Sigmund Cherem 2022-09-23 00:28:58 +00:00 committed by Commit Bot
parent 8da75ede06
commit 0ee953d7c2

View file

@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a // 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. // BSD-style license that can be found in the LICENSE file.
// @dart = 2.10
library dart2js.kernel.env; library dart2js.kernel.env;
import 'package:front_end/src/api_unstable/dart2js.dart' import 'package:front_end/src/api_unstable/dart2js.dart'
@ -33,55 +31,37 @@ import 'env_interfaces.dart' as interfaces;
/// Environment for fast lookup of component libraries. /// Environment for fast lookup of component libraries.
class KProgramEnv implements interfaces.KProgramEnv { class KProgramEnv implements interfaces.KProgramEnv {
final Set<ir.Component> _components = Set<ir.Component>(); final Set<ir.Component> _components = {};
Map<Uri, KLibraryEnv> _libraryMap; late final Map<Uri, KLibraryEnv> _libraryMap = {
for (final component in _components)
for (final library in component.libraries)
library.importUri: KLibraryEnv(library),
};
/// TODO(johnniwinther): Handle arbitrary load order if needed. /// TODO(johnniwinther): Handle arbitrary load order if needed.
ir.Member get mainMethod => _components.first?.mainMethod; ir.Member? get mainMethod => mainComponent.mainMethod;
ir.Component get mainComponent => _components.first; ir.Component get mainComponent => _components.first;
void addComponent(ir.Component component) { void addComponent(ir.Component component) {
if (_components.add(component)) { if (_components.add(component)) {
if (_libraryMap != null) { for (ir.Library library in component.libraries) {
_addLibraries(component); _libraryMap[library.importUri] ??= KLibraryEnv(library);
}
}
}
void _addLibraries(ir.Component component) {
for (ir.Library library in component.libraries) {
_libraryMap[library.importUri] = KLibraryEnv(library);
}
}
void _ensureLibraryMap() {
if (_libraryMap == null) {
_libraryMap = <Uri, KLibraryEnv>{};
for (ir.Component component in _components) {
_addLibraries(component);
} }
} }
} }
/// Return the [KLibraryEnv] for the library with the canonical [uri]. /// Return the [KLibraryEnv] for the library with the canonical [uri].
KLibraryEnv lookupLibrary(Uri uri) { KLibraryEnv? lookupLibrary(Uri uri) => _libraryMap[uri];
_ensureLibraryMap();
return _libraryMap[uri];
}
/// Calls [f] for each library in this environment. /// Calls [f] for each library in this environment.
void forEachLibrary(void f(KLibraryEnv library)) { void forEachLibrary(void f(KLibraryEnv library)) {
_ensureLibraryMap();
_libraryMap.values.forEach(f); _libraryMap.values.forEach(f);
} }
/// Returns the number of libraries in this environment. /// Returns the number of libraries in this environment.
int get length { int get length => _libraryMap.length;
_ensureLibraryMap();
return _libraryMap.length;
}
/// Convert this [KProgramEnv] to the corresponding [JProgramEnv]. /// Convert this [KProgramEnv] to the corresponding [JProgramEnv].
@override @override
@ -93,30 +73,20 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
@override @override
final ir.Library library; final ir.Library library;
Map<String, KClassEnv> _classMap; late final Map<String, KClassEnv> _classMap = {
Map<String, ir.Member> _memberMap; for (ir.Class cls in library.classes) cls.name: KClassEnvImpl(cls),
Map<String, ir.Member> _setterMap; };
Map<String, ir.Member>? _memberMap;
Map<String, ir.Member>? _setterMap;
KLibraryEnv(this.library); KLibraryEnv(this.library);
void _ensureClassMap() {
if (_classMap == null) {
_classMap = <String, KClassEnv>{};
for (ir.Class cls in library.classes) {
_classMap[cls.name] = KClassEnvImpl(cls);
}
}
}
/// Return the [KClassEnv] for the class [name] in [library]. /// Return the [KClassEnv] for the class [name] in [library].
KClassEnv lookupClass(String name) { KClassEnv? lookupClass(String name) => _classMap[name];
_ensureClassMap();
return _classMap[name];
}
/// Calls [f] for each class in this library. /// Calls [f] for each class in this library.
void forEachClass(void f(KClassEnv cls)) { void forEachClass(void f(KClassEnv cls)) {
_ensureClassMap();
_classMap.values.forEach(f); _classMap.values.forEach(f);
} }
@ -130,14 +100,14 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
} }
if (member is ir.Procedure) { if (member is ir.Procedure) {
if (member.kind == ir.ProcedureKind.Setter) { if (member.kind == ir.ProcedureKind.Setter) {
_setterMap[member.name.text] = member; _setterMap![member.name.text] = member;
} else { } else {
_memberMap[member.name.text] = member; _memberMap![member.name.text] = member;
} }
} else if (member is ir.Field) { } else if (member is ir.Field) {
_memberMap[member.name.text] = member; _memberMap![member.name.text] = member;
if (member.hasSetter) { if (member.hasSetter) {
_setterMap[member.name.text] = member; _setterMap![member.name.text] = member;
} }
} else { } else {
failedAt( failedAt(
@ -148,15 +118,15 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
} }
/// Return the [ir.Member] for the member [name] in [library]. /// Return the [ir.Member] for the member [name] in [library].
ir.Member lookupMember(String name, {bool setter = false}) { ir.Member? lookupMember(String name, {bool setter = false}) {
_ensureMemberMaps(); _ensureMemberMaps();
return setter ? _setterMap[name] : _memberMap[name]; return setter ? _setterMap![name] : _memberMap![name];
} }
void forEachMember(void f(ir.Member member)) { void forEachMember(void f(ir.Member member)) {
_ensureMemberMaps(); _ensureMemberMaps();
_memberMap.values.forEach(f); _memberMap!.values.forEach(f);
for (ir.Member member in _setterMap.values) { for (ir.Member member in _setterMap!.values) {
if (member is ir.Procedure) { if (member is ir.Procedure) {
f(member); f(member);
} else { } else {
@ -176,7 +146,7 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
memberMap = const <String, ir.Member>{}; memberMap = const <String, ir.Member>{};
} else { } else {
memberMap = <String, ir.Member>{}; memberMap = <String, ir.Member>{};
_memberMap.forEach((String name, ir.Member node) { _memberMap!.forEach((String name, ir.Member node) {
MemberEntity member = kElementMap.getMember(node); MemberEntity member = kElementMap.getMember(node);
if (liveMemberUsage.containsKey(member)) { if (liveMemberUsage.containsKey(member)) {
memberMap[name] = node; memberMap[name] = node;
@ -187,7 +157,7 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
setterMap = const <String, ir.Member>{}; setterMap = const <String, ir.Member>{};
} else { } else {
setterMap = <String, ir.Member>{}; setterMap = <String, ir.Member>{};
_setterMap.forEach((String name, ir.Member node) { _setterMap!.forEach((String name, ir.Member node) {
MemberEntity member = kElementMap.getMember(node); MemberEntity member = kElementMap.getMember(node);
if (liveMemberUsage.containsKey(member)) { if (liveMemberUsage.containsKey(member)) {
setterMap[name] = node; setterMap[name] = node;
@ -200,9 +170,9 @@ class KLibraryEnv implements interfaces.KLibraryEnv {
class KLibraryData implements interfaces.KLibraryData { class KLibraryData implements interfaces.KLibraryData {
final ir.Library library; final ir.Library library;
Iterable<ConstantValue> _metadata; Iterable<ConstantValue>? _metadata;
// TODO(johnniwinther): Avoid direct access to [imports]. // TODO(johnniwinther): Avoid direct access to [imports].
Map<ir.LibraryDependency, ImportEntity> imports; Map<ir.LibraryDependency, ImportEntity>? imports;
KLibraryData(this.library); KLibraryData(this.library);
@ -222,7 +192,7 @@ class KLibraryData implements interfaces.KLibraryData {
imports = <ir.LibraryDependency, ImportEntity>{}; imports = <ir.LibraryDependency, ImportEntity>{};
dependencies.forEach((ir.LibraryDependency node) { dependencies.forEach((ir.LibraryDependency node) {
if (node.isExport) return; if (node.isExport) return;
imports[node] = ImportEntity( imports![node] = ImportEntity(
node.isDeferred, node.isDeferred,
node.name, node.name,
node.targetLibrary.importUri, node.targetLibrary.importUri,
@ -230,7 +200,7 @@ class KLibraryData implements interfaces.KLibraryData {
}); });
} }
} }
return imports.values; return imports!.values;
} }
/// Convert this [KLibraryData] to the corresponding [JLibraryData]. /// Convert this [KLibraryData] to the corresponding [JLibraryData].
@ -260,13 +230,13 @@ abstract class KClassEnv implements interfaces.KClassEnv {
void ensureMembers(KernelToElementMapForEnv elementMap); void ensureMembers(KernelToElementMapForEnv elementMap);
/// Return the [MemberEntity] for the member [name] in the class. /// Return the [MemberEntity] for the member [name] in the class.
MemberEntity lookupMember(IrToElementMap elementMap, Name name); MemberEntity? lookupMember(IrToElementMap elementMap, Name name);
/// Calls [f] for each member of [cls]. /// Calls [f] for each member of [cls].
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)); void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
/// Return the [ConstructorEntity] for the constructor [name] in [cls]. /// Return the [ConstructorEntity] for the constructor [name] in [cls].
ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name); ConstructorEntity? lookupConstructor(IrToElementMap elementMap, String? name);
/// Calls [f] for each constructor of [cls]. /// Calls [f] for each constructor of [cls].
void forEachConstructor( void forEachConstructor(
@ -295,8 +265,8 @@ abstract class KClassEnv implements interfaces.KClassEnv {
} }
int orderByFileOffset(ir.TreeNode a, ir.TreeNode b) { int orderByFileOffset(ir.TreeNode a, ir.TreeNode b) {
var aLoc = a.location; var aLoc = a.location!;
var bLoc = b.location; var bLoc = b.location!;
var aUri = '${aLoc.file}'; var aUri = '${aLoc.file}';
var bUri = '${bLoc.file}'; var bUri = '${bLoc.file}';
var uriCompare = aUri.compareTo(bUri); var uriCompare = aUri.compareTo(bUri);
@ -309,33 +279,27 @@ class KClassEnvImpl implements KClassEnv {
@override @override
final ir.Class cls; final ir.Class cls;
Map<String, ir.Member> _constructorMap; Map<String, ir.Member>? _constructorMap;
Map<Name, ir.Member> _memberMap; Map<Name, ir.Member>? _memberMap;
List<ir.Member> _members; // in declaration order. List<ir.Member>? _members; // in declaration order.
bool _isMixinApplicationWithMembers; bool? _isMixinApplicationWithMembers;
/// Constructor bodies created for this class. /// Constructor bodies created for this class.
List<ConstructorBodyEntity> _constructorBodyList; List<ConstructorBodyEntity>? _constructorBodyList;
KClassEnvImpl(this.cls); KClassEnvImpl(this.cls);
KClassEnvImpl.internal(this.cls, this._constructorMap, this._memberMap,
this._members, this._isMixinApplicationWithMembers);
@override @override
bool get isUnnamedMixinApplication => cls.isAnonymousMixin; bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
@override @override
bool get isMixinApplicationWithMembers { bool get isMixinApplicationWithMembers => _isMixinApplicationWithMembers!;
assert(_isMixinApplicationWithMembers != null);
return _isMixinApplicationWithMembers;
}
@override @override
bool checkHasMember(ir.Member node) { bool checkHasMember(ir.Member node) {
if (_memberMap == null) return false; if (_memberMap == null) return false;
return _memberMap.values.contains(node) || return _memberMap!.values.contains(node) ||
_constructorMap.values.contains(node); _constructorMap!.values.contains(node);
} }
@override @override
@ -351,20 +315,20 @@ class KClassEnvImpl implements KClassEnv {
var members = <ir.Member>[]; var members = <ir.Member>[];
_isMixinApplicationWithMembers = false; _isMixinApplicationWithMembers = false;
void addField(ir.Field member, {bool includeStatic}) { void addField(ir.Field member, {required bool includeStatic}) {
if (!includeStatic && member.isStatic) return; if (!includeStatic && member.isStatic) return;
if (isRedirectingFactoryField(member)) return; if (isRedirectingFactoryField(member)) return;
var name = elementMap.getName(member.name); var name = elementMap.getName(member.name);
_memberMap[name] = member; _memberMap![name] = member;
if (member.hasSetter) { if (member.hasSetter) {
_memberMap[name.setter] = member; _memberMap![name.setter] = member;
} }
members.add(member); members.add(member);
} }
void addProcedure(ir.Procedure member, void addProcedure(ir.Procedure member,
{bool includeStatic, {required bool includeStatic,
bool includeNoSuchMethodForwarders, required bool includeNoSuchMethodForwarders,
bool isFromMixinApplication = false}) { bool isFromMixinApplication = false}) {
if (memberIsIgnorable(member, cls: cls)) return; if (memberIsIgnorable(member, cls: cls)) return;
if (!includeStatic && member.isStatic) return; if (!includeStatic && member.isStatic) return;
@ -378,10 +342,10 @@ class KClassEnvImpl implements KClassEnv {
// Don't include redirecting factories. // Don't include redirecting factories.
return; return;
} }
_constructorMap[member.name.text] = member; _constructorMap![member.name.text] = member;
} else { } else {
var name = elementMap.getName(member.name, setter: member.isSetter); var name = elementMap.getName(member.name, setter: member.isSetter);
_memberMap[name] = member; _memberMap![name] = member;
members.add(member); members.add(member);
if (isFromMixinApplication) { if (isFromMixinApplication) {
_isMixinApplicationWithMembers = true; _isMixinApplicationWithMembers = true;
@ -392,21 +356,21 @@ class KClassEnvImpl implements KClassEnv {
void addConstructors(ir.Class c) { void addConstructors(ir.Class c) {
for (ir.Constructor member in c.constructors) { for (ir.Constructor member in c.constructors) {
var name = member.name.text; var name = member.name.text;
_constructorMap[name] = member; _constructorMap![name] = member;
} }
} }
int mixinMemberCount = 0; int mixinMemberCount = 0;
if (cls.mixedInClass != null) { if (cls.mixedInClass != null) {
for (ir.Field field in cls.mixedInClass.mixin.fields) { for (ir.Field field in cls.mixedInClass!.mixin.fields) {
if (field.containsSuperCalls) { if (field.containsSuperCalls) {
_isMixinApplicationWithMembers = true; _isMixinApplicationWithMembers = true;
continue; continue;
} }
addField(field, includeStatic: false); addField(field, includeStatic: false);
} }
for (ir.Procedure procedure in cls.mixedInClass.mixin.procedures) { for (ir.Procedure procedure in cls.mixedInClass!.mixin.procedures) {
if (procedure.containsSuperCalls) { if (procedure.containsSuperCalls) {
_isMixinApplicationWithMembers = true; _isMixinApplicationWithMembers = true;
continue; continue;
@ -434,39 +398,41 @@ class KClassEnvImpl implements KClassEnv {
} }
@override @override
MemberEntity lookupMember(IrToElementMap elementMap, Name name) { MemberEntity? lookupMember(
covariant KernelToElementMapForEnv elementMap, Name name) {
_ensureMaps(elementMap); _ensureMaps(elementMap);
ir.Member member = _memberMap[name]; ir.Member? member = _memberMap![name];
return member != null ? elementMap.getMember(member) : null; return member != null ? elementMap.getMember(member) : null;
} }
@override @override
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) { void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) {
_ensureMaps(elementMap); _ensureMaps(elementMap as KernelToElementMapForEnv);
_members.forEach((ir.Member member) { _members!.forEach((ir.Member member) {
f(elementMap.getMember(member)); f(elementMap.getMember(member));
}); });
} }
@override @override
ConstructorEntity lookupConstructor(IrToElementMap elementMap, String name) { ConstructorEntity? lookupConstructor(
_ensureMaps(elementMap); IrToElementMap elementMap, String? name) {
ir.Member constructor = _constructorMap[name]; _ensureMaps(elementMap as KernelToElementMapForEnv);
ir.Member? constructor = _constructorMap![name!];
return constructor != null ? elementMap.getConstructor(constructor) : null; return constructor != null ? elementMap.getConstructor(constructor) : null;
} }
@override @override
void forEachConstructor( void forEachConstructor(
IrToElementMap elementMap, void f(ConstructorEntity constructor)) { IrToElementMap elementMap, void f(ConstructorEntity constructor)) {
_ensureMaps(elementMap); _ensureMaps(elementMap as KernelToElementMapForEnv);
_constructorMap.values.forEach((ir.Member constructor) { _constructorMap!.values.forEach((ir.Member constructor) {
f(elementMap.getConstructor(constructor)); f(elementMap.getConstructor(constructor));
}); });
} }
void addConstructorBody(ConstructorBodyEntity constructorBody) { void addConstructorBody(ConstructorBodyEntity constructorBody) {
_constructorBodyList ??= <ConstructorBodyEntity>[]; _constructorBodyList ??= <ConstructorBodyEntity>[];
_constructorBodyList.add(constructorBody); _constructorBodyList!.add(constructorBody);
} }
@override @override
@ -486,7 +452,7 @@ class KClassEnvImpl implements KClassEnv {
constructorMap = const <String, ir.Member>{}; constructorMap = const <String, ir.Member>{};
} else { } else {
constructorMap = <String, ir.Member>{}; constructorMap = <String, ir.Member>{};
_constructorMap.forEach((String name, ir.Member node) { _constructorMap!.forEach((String name, ir.Member node) {
MemberEntity member = kElementMap.getMember(node); MemberEntity member = kElementMap.getMember(node);
if (liveMemberUsage.containsKey(member)) { if (liveMemberUsage.containsKey(member)) {
constructorMap[name] = node; constructorMap[name] = node;
@ -497,7 +463,7 @@ class KClassEnvImpl implements KClassEnv {
memberMap = const <Name, ir.Member>{}; memberMap = const <Name, ir.Member>{};
} else { } else {
memberMap = <Name, ir.Member>{}; memberMap = <Name, ir.Member>{};
_memberMap.forEach((Name name, ir.Member node) { _memberMap!.forEach((Name name, ir.Member node) {
MemberEntity member = kElementMap.getMember(node); MemberEntity member = kElementMap.getMember(node);
if (liveMemberUsage.containsKey(member)) { if (liveMemberUsage.containsKey(member)) {
memberMap[name] = node; memberMap[name] = node;
@ -508,7 +474,7 @@ class KClassEnvImpl implements KClassEnv {
members = const <ir.Member>[]; members = const <ir.Member>[];
} else { } else {
members = <ir.Member>[]; members = <ir.Member>[];
_members.forEach((ir.Member node) { _members!.forEach((ir.Member node) {
MemberEntity member = kElementMap.getMember(node); MemberEntity member = kElementMap.getMember(node);
if (liveMemberUsage.containsKey(member)) { if (liveMemberUsage.containsKey(member)) {
members.add(node); members.add(node);
@ -523,15 +489,15 @@ class KClassEnvImpl implements KClassEnv {
abstract class KClassData implements interfaces.KClassData { abstract class KClassData implements interfaces.KClassData {
ir.Class get node; ir.Class get node;
InterfaceType get thisType; InterfaceType? get thisType;
InterfaceType get jsInteropType; InterfaceType? get jsInteropType;
InterfaceType /*?*/ get rawType; InterfaceType? get rawType;
InterfaceType /*?*/ get instantiationToBounds; InterfaceType? get instantiationToBounds;
InterfaceType get supertype; InterfaceType? get supertype;
InterfaceType get mixedInType; InterfaceType? get mixedInType;
List<InterfaceType> get interfaces; List<InterfaceType>? get interfaces;
OrderedTypeSet get orderedTypeSet; OrderedTypeSet? get orderedTypeSet;
DartType get callType; DartType? get callType;
bool get isEnumClass; bool get isEnumClass;
bool get isMixinApplication; bool get isMixinApplication;
@ -548,27 +514,27 @@ class KClassDataImpl implements KClassData {
@override @override
final ir.Class node; final ir.Class node;
@override @override
bool isMixinApplication; late bool isMixinApplication;
@override @override
InterfaceType thisType; InterfaceType? thisType;
@override @override
InterfaceType jsInteropType; InterfaceType? jsInteropType;
@override @override
InterfaceType rawType; InterfaceType? rawType;
@override @override
InterfaceType instantiationToBounds; InterfaceType? instantiationToBounds;
@override @override
InterfaceType supertype; InterfaceType? supertype;
@override @override
InterfaceType mixedInType; InterfaceType? mixedInType;
@override @override
List<InterfaceType> interfaces; List<InterfaceType>? interfaces;
@override @override
OrderedTypeSet orderedTypeSet; OrderedTypeSet? orderedTypeSet;
Iterable<ConstantValue> _metadata; Iterable<ConstantValue>? _metadata;
List<Variance> _variances; List<Variance>? _variances;
KClassDataImpl(this.node); KClassDataImpl(this.node);
@ -576,7 +542,7 @@ class KClassDataImpl implements KClassData {
bool get isEnumClass => node.isEnum; bool get isEnumClass => node.isEnum;
@override @override
FunctionType callType; FunctionType? callType;
bool isCallTypeComputed = false; bool isCallTypeComputed = false;
@override @override
@ -602,11 +568,11 @@ abstract class KMemberData implements interfaces.KMemberData {
@override @override
ir.Member get node; ir.Member get node;
StaticTypeCache staticTypes; StaticTypeCache? staticTypes;
Iterable<ConstantValue> getMetadata(IrToElementMap elementMap); Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
InterfaceType getMemberThisType(JsToElementMap elementMap); InterfaceType? getMemberThisType(JsToElementMap elementMap);
ClassTypeVariableAccess get classTypeVariableAccess; ClassTypeVariableAccess get classTypeVariableAccess;
@ -619,10 +585,10 @@ abstract class KMemberDataImpl implements KMemberData {
@override @override
final ir.Member node; final ir.Member node;
Iterable<ConstantValue> _metadata; Iterable<ConstantValue>? _metadata;
@override @override
StaticTypeCache staticTypes; StaticTypeCache? staticTypes;
KMemberDataImpl(this.node); KMemberDataImpl(this.node);
@ -635,9 +601,9 @@ abstract class KMemberDataImpl implements KMemberData {
} }
@override @override
InterfaceType getMemberThisType(JsToElementMap elementMap) { InterfaceType? getMemberThisType(JsToElementMap elementMap) {
MemberEntity member = elementMap.getMember(node); MemberEntity member = elementMap.getMember(node);
ClassEntity cls = member.enclosingClass; ClassEntity? cls = member.enclosingClass;
if (cls != null) { if (cls != null) {
return elementMap.elementEnvironment.getThisType(cls); return elementMap.elementEnvironment.getThisType(cls);
} }
@ -651,21 +617,21 @@ abstract class KFunctionData implements KMemberData {
List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap); List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap);
void forEachParameter(JsToElementMap elementMap, void forEachParameter(JsToElementMap elementMap,
void f(DartType type, String name, ConstantValue defaultValue)); void f(DartType type, String? name, ConstantValue? defaultValue));
} }
abstract class KFunctionDataMixin implements KFunctionData { abstract class KFunctionDataMixin implements KFunctionData {
ir.FunctionNode get functionNode; ir.FunctionNode get functionNode;
List<TypeVariableType> _typeVariables; List<TypeVariableType>? _typeVariables;
@override @override
List<TypeVariableType> /*!*/ getFunctionTypeVariables( List<TypeVariableType> getFunctionTypeVariables(
covariant KernelToElementMapForEnv elementMap) { covariant KernelToElementMapForEnv elementMap) {
if (_typeVariables == null) { if (_typeVariables == null) {
if (functionNode.typeParameters.isEmpty) { if (functionNode.typeParameters.isEmpty) {
_typeVariables = const <TypeVariableType>[]; _typeVariables = const <TypeVariableType>[];
} else { } else {
ir.TreeNode parent = functionNode.parent; ir.TreeNode? parent = functionNode.parent;
if (parent is ir.Constructor || if (parent is ir.Constructor ||
(parent is ir.Procedure && (parent is ir.Procedure &&
parent.kind == ir.ProcedureKind.Factory)) { parent.kind == ir.ProcedureKind.Factory)) {
@ -676,12 +642,12 @@ abstract class KFunctionDataMixin implements KFunctionData {
return elementMap return elementMap
.getDartType(ir.TypeParameterType( .getDartType(ir.TypeParameterType(
typeParameter, ir.Nullability.nonNullable)) typeParameter, ir.Nullability.nonNullable))
.withoutNullability; .withoutNullability as TypeVariableType;
}).toList(); }).toList();
} }
} }
} }
return _typeVariables; return _typeVariables!;
} }
} }
@ -690,9 +656,9 @@ class KFunctionDataImpl extends KMemberDataImpl
implements KFunctionData { implements KFunctionData {
@override @override
final ir.FunctionNode functionNode; final ir.FunctionNode functionNode;
FunctionType _type; FunctionType? _type;
KFunctionDataImpl(ir.Member node, this.functionNode) : super(node); KFunctionDataImpl(super.node, this.functionNode);
@override @override
FunctionType getFunctionType(covariant KernelToElementMapForEnv elementMap) { FunctionType getFunctionType(covariant KernelToElementMapForEnv elementMap) {
@ -701,12 +667,12 @@ class KFunctionDataImpl extends KMemberDataImpl
@override @override
void forEachParameter(JsToElementMap elementMap, void forEachParameter(JsToElementMap elementMap,
void f(DartType type, String name, ConstantValue defaultValue)) { void f(DartType type, String? name, ConstantValue? defaultValue)) {
void handleParameter(ir.VariableDeclaration parameter, void handleParameter(ir.VariableDeclaration parameter,
{bool isOptional = true}) { {bool isOptional = true}) {
DartType type = elementMap.getDartType(parameter.type); DartType type = elementMap.getDartType(parameter.type);
String name = parameter.name; String? name = parameter.name;
ConstantValue defaultValue; ConstantValue? defaultValue;
if (isOptional) { if (isOptional) {
if (parameter.initializer != null) { if (parameter.initializer != null) {
defaultValue = defaultValue =
@ -730,7 +696,7 @@ class KFunctionDataImpl extends KMemberDataImpl
@override @override
FunctionData convert() { FunctionData convert() {
return FunctionDataImpl( return FunctionDataImpl(
node, functionNode, RegularMemberDefinition(node), staticTypes); node, functionNode, RegularMemberDefinition(node), staticTypes!);
} }
@override @override
@ -744,10 +710,9 @@ abstract class KConstructorData extends KFunctionData {}
class KConstructorDataImpl extends KFunctionDataImpl class KConstructorDataImpl extends KFunctionDataImpl
implements KConstructorData { implements KConstructorData {
ConstructorBodyEntity constructorBody; ConstructorBodyEntity? constructorBody;
KConstructorDataImpl(ir.Member node, ir.FunctionNode functionNode) KConstructorDataImpl(super.node, super.functionNode);
: super(node, functionNode);
@override @override
JConstructorData convert() { JConstructorData convert() {
@ -757,7 +722,7 @@ class KConstructorDataImpl extends KFunctionDataImpl
} else { } else {
definition = RegularMemberDefinition(node); definition = RegularMemberDefinition(node);
} }
return JConstructorDataImpl(node, functionNode, definition, staticTypes); return JConstructorDataImpl(node, functionNode, definition, staticTypes!);
} }
@override @override
@ -778,7 +743,7 @@ abstract class KFieldData extends KMemberData {
} }
class KFieldDataImpl extends KMemberDataImpl implements KFieldData { class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
DartType _type; DartType? _type;
@override @override
final bool isLateBackingField; final bool isLateBackingField;
@ -786,13 +751,12 @@ class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
@override @override
final bool isLateFinalBackingField; final bool isLateFinalBackingField;
KFieldDataImpl(ir.Field node, KFieldDataImpl(super.node,
{/*required*/ this.isLateBackingField, {required this.isLateBackingField,
/*required*/ this.isLateFinalBackingField}) required this.isLateFinalBackingField});
: super(node);
@override @override
ir.Field get node => super.node; ir.Field get node => super.node as ir.Field;
@override @override
DartType getFieldType(covariant KernelToElementMapForEnv elementMap) { DartType getFieldType(covariant KernelToElementMapForEnv elementMap) {
@ -807,15 +771,15 @@ class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
@override @override
JFieldData convert() { JFieldData convert() {
return JFieldDataImpl(node, RegularMemberDefinition(node), staticTypes); return JFieldDataImpl(node, RegularMemberDefinition(node), staticTypes!);
} }
} }
class KTypeVariableData implements interfaces.KTypeVariableData { class KTypeVariableData implements interfaces.KTypeVariableData {
@override @override
final ir.TypeParameter node; final ir.TypeParameter node;
DartType _bound; DartType? _bound;
DartType _defaultType; DartType? _defaultType;
KTypeVariableData(this.node); KTypeVariableData(this.node);
@ -824,10 +788,7 @@ class KTypeVariableData implements interfaces.KTypeVariableData {
} }
DartType getDefaultType(IrToElementMap elementMap) { DartType getDefaultType(IrToElementMap elementMap) {
// TODO(34522): Remove `?? const ir.DynamicType()` when issue 34522 is return _defaultType ??= elementMap.getDartType(node.defaultType);
// fixed.
return _defaultType ??=
elementMap.getDartType(node.defaultType ?? const ir.DynamicType());
} }
@override @override