mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:21:07 +00:00
[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:
parent
8da75ede06
commit
0ee953d7c2
|
@ -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) {
|
|
||||||
_addLibraries(component);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _addLibraries(ir.Component component) {
|
|
||||||
for (ir.Library library in component.libraries) {
|
for (ir.Library library in component.libraries) {
|
||||||
_libraryMap[library.importUri] = KLibraryEnv(library);
|
_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
|
||||||
|
|
Loading…
Reference in a new issue