[dart2js] Remove unnecessary abstraction from env libraries.

Change-Id: Id9c4cc319a848ed7deebc6065d731886f737e280
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/307722
Commit-Queue: Nate Biggs <natebiggs@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
This commit is contained in:
Nate Biggs 2023-06-14 00:02:39 +00:00 committed by Commit Queue
parent 8f48ac3723
commit f60c7b2ad3
4 changed files with 60 additions and 216 deletions

View file

@ -1651,8 +1651,7 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap {
}
JConstructorBody _getConstructorBody(IndexedConstructor constructor) {
JConstructorDataImpl data =
members.getData(constructor) as JConstructorDataImpl;
JConstructorData data = members.getData(constructor) as JConstructorData;
JConstructorBody? constructorBody = data.constructorBody;
if (constructorBody == null) {
/// The constructor calls the constructor body with all parameters.

View file

@ -604,7 +604,7 @@ abstract class JMemberData {
case JMemberDataKind.field:
return JFieldDataImpl.readFromDataSource(source);
case JMemberDataKind.constructor:
return JConstructorDataImpl.readFromDataSource(source);
return JConstructorData.readFromDataSource(source);
case JMemberDataKind.constructorBody:
return ConstructorBodyDataImpl.readFromDataSource(source);
case JMemberDataKind.signature:
@ -948,24 +948,21 @@ class GeneratorBodyFunctionData extends DelegatedFunctionData {
StaticTypeCache get staticTypes => const StaticTypeCache();
}
abstract class JConstructorData extends FunctionData {}
class JConstructorDataImpl extends FunctionDataImpl
implements JConstructorData {
class JConstructorData extends FunctionDataImpl {
/// Tag used for identifying serialized [JConstructorDataImpl] objects in a
/// debugging data stream.
static const String tag = 'constructor-data';
JConstructorBody? constructorBody;
JConstructorDataImpl(
JConstructorData(
super.node, super.functionNode, super.definition, super.staticTypes);
JConstructorDataImpl._deserialized(
JConstructorData._deserialized(
super.node, super.functionNode, super.definition, super.staticTypes)
: super._deserialized();
factory JConstructorDataImpl.readFromDataSource(DataSourceReader source) {
factory JConstructorData.readFromDataSource(DataSourceReader source) {
source.begin(tag);
ir.Member node = source.readMemberNode();
ir.FunctionNode functionNode;
@ -981,7 +978,7 @@ class JConstructorDataImpl extends FunctionDataImpl
Deferrable<StaticTypeCache> staticTypes = source
.readDeferrable(() => StaticTypeCache.readFromDataSource(source, node));
source.end(tag);
return JConstructorDataImpl._deserialized(
return JConstructorData._deserialized(
node, functionNode, definition, staticTypes);
}

View file

@ -279,7 +279,7 @@ class KernelToElementMap implements IrToElementMap {
void _ensureCallType(ClassEntity cls, KClassData data) {
assert(checkFamily(cls));
if (data is KClassDataImpl && !data.isCallTypeComputed) {
if (!data.isCallTypeComputed) {
MemberEntity? callMember =
_elementEnvironment.lookupClassMember(cls, Names.call);
if (callMember is FunctionEntity &&
@ -293,7 +293,7 @@ class KernelToElementMap implements IrToElementMap {
void _ensureThisAndRawType(ClassEntity cls, KClassData data) {
assert(checkFamily(cls));
if (data is KClassDataImpl && data.thisType == null) {
if (data.thisType == null) {
ir.Class node = data.node;
if (node.typeParameters.isEmpty) {
data.thisType =
@ -315,7 +315,7 @@ class KernelToElementMap implements IrToElementMap {
void _ensureJsInteropType(ClassEntity cls, KClassData data) {
assert(checkFamily(cls));
if (data is KClassDataImpl && data.jsInteropType == null) {
if (data.jsInteropType == null) {
ir.Class node = data.node;
if (node.typeParameters.isEmpty) {
_ensureThisAndRawType(cls, data);
@ -329,7 +329,7 @@ class KernelToElementMap implements IrToElementMap {
void _ensureClassInstantiationToBounds(ClassEntity cls, KClassData data) {
assert(checkFamily(cls));
if (data is KClassDataImpl && data.instantiationToBounds == null) {
if (data.instantiationToBounds == null) {
ir.Class node = data.node;
if (node.typeParameters.isEmpty) {
_ensureThisAndRawType(cls, data);
@ -349,7 +349,7 @@ class KernelToElementMap implements IrToElementMap {
void _ensureSupertypes(ClassEntity cls, KClassData data) {
assert(checkFamily(cls));
if (data is KClassDataImpl && data.orderedTypeSet == null) {
if (data.orderedTypeSet == null) {
_ensureThisAndRawType(cls, data);
ir.Class node = data.node;
@ -1260,7 +1260,7 @@ class KernelToElementMap implements IrToElementMap {
}
IndexedClass cls =
createClass(library, node.name, isAbstract: node.isAbstract);
return classes.register(cls, KClassDataImpl(node), classEnv);
return classes.register(cls, KClassData(node), classEnv);
}
TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node) {
@ -1351,7 +1351,7 @@ class KernelToElementMap implements IrToElementMap {
NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
}
return members.register<IndexedConstructor, KConstructorData>(
constructor, KConstructorDataImpl(node, functionNode));
constructor, KConstructorData(node, functionNode));
}
IndexedFunction getMethodInternal(ir.Procedure node) {
@ -1401,7 +1401,7 @@ class KernelToElementMap implements IrToElementMap {
break;
}
members.register<IndexedFunction, KFunctionData>(
function, KFunctionDataImpl(node, node.function));
function, KFunctionData(node, node.function));
// We need to register the function before creating the type variables.
methodMap[node] = function;
for (ir.TypeParameter typeParameter in node.function.typeParameters) {
@ -1444,7 +1444,7 @@ class KernelToElementMap implements IrToElementMap {
isConst: node.isConst);
return members.register<IndexedField, KFieldData>(
field,
KFieldDataImpl(node,
KFieldData(node,
isLateBackingField: isLateBackingField,
isLateFinalBackingField: isLateFinalBackingField));
}

View file

@ -66,7 +66,7 @@ class KLibraryEnv {
final ir.Library library;
late final Map<String, KClassEnv> _classMap = {
for (ir.Class cls in library.classes) cls.name: KClassEnvImpl(cls),
for (ir.Class cls in library.classes) cls.name: KClassEnv(cls),
};
Map<String, ir.Member>? _memberMap;
@ -198,58 +198,6 @@ class KLibraryData {
}
}
/// Member data for a class.
abstract class KClassEnv {
/// The [ir.Class] that defined the class, if any.
ir.Class get cls;
/// Whether the class is an unnamed mixin application.
bool get isUnnamedMixinApplication;
/// Whether the class is a mixin application with its own members.
///
/// This occurs when a mixin contains methods with super calls or when
/// the mixin application contains concrete forwarding stubs.
bool get isMixinApplicationWithMembers;
/// Ensures that all members have been computed for [cls].
void ensureMembers(KernelToElementMap elementMap);
/// Return the [MemberEntity] for the member [name] in the class.
MemberEntity? lookupMember(IrToElementMap elementMap, Name name);
/// Calls [f] for each member of [cls].
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
/// Return the [ConstructorEntity] for the constructor [name] in [cls].
ConstructorEntity? lookupConstructor(IrToElementMap elementMap, String? name);
/// Calls [f] for each constructor of [cls].
void forEachConstructor(
IrToElementMap elementMap, void f(ConstructorEntity constructor));
/// Calls [f] for each constructor body for the live constructors in the
/// class.
void forEachConstructorBody(void f(ConstructorBodyEntity constructor));
/// Convert this [KClassEnv] to the corresponding [JClassEnv] containing only
/// the members in [liveMembers].
///
/// [getJLibrary] returns the [LibraryEntity] in the J-model corresponding to
/// a [ir.Library] node.
JClassEnv convert(
IrToElementMap kElementMap,
Map<MemberEntity, MemberUsage> liveMemberUsage,
Iterable<MemberEntity> liveAbstractMembers,
LibraryEntity Function(ir.Library library) getJLibrary);
/// Returns `true` if [node] is a known member of this class.
///
/// This method is used for checking the integrity of the K-model and does
/// not alter the state of this class environment.
bool checkHasMember(ir.Member node);
}
int orderByFileOffset(ir.TreeNode a, ir.TreeNode b) {
var aLoc = a.location!;
var bLoc = b.location!;
@ -261,8 +209,7 @@ int orderByFileOffset(ir.TreeNode a, ir.TreeNode b) {
}
/// Environment for fast lookup of class members.
class KClassEnvImpl implements KClassEnv {
@override
class KClassEnv {
final ir.Class cls;
Map<String, ir.Member>? _constructorMap;
@ -273,22 +220,18 @@ class KClassEnvImpl implements KClassEnv {
/// Constructor bodies created for this class.
List<ConstructorBodyEntity>? _constructorBodyList;
KClassEnvImpl(this.cls);
KClassEnv(this.cls);
@override
bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
@override
bool get isMixinApplicationWithMembers => _isMixinApplicationWithMembers!;
@override
bool checkHasMember(ir.Member node) {
if (_memberMap == null) return false;
return _memberMap!.values.contains(node) ||
_constructorMap!.values.contains(node);
}
@override
void ensureMembers(KernelToElementMap elementMap) {
_ensureMaps(elementMap);
}
@ -382,7 +325,6 @@ class KClassEnvImpl implements KClassEnv {
_members = members;
}
@override
MemberEntity? lookupMember(
covariant KernelToElementMap elementMap, Name name) {
_ensureMaps(elementMap);
@ -390,7 +332,6 @@ class KClassEnvImpl implements KClassEnv {
return member != null ? elementMap.getMember(member) : null;
}
@override
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member)) {
_ensureMaps(elementMap as KernelToElementMap);
_members!.forEach((ir.Member member) {
@ -398,7 +339,6 @@ class KClassEnvImpl implements KClassEnv {
});
}
@override
ConstructorEntity? lookupConstructor(
IrToElementMap elementMap, String? name) {
_ensureMaps(elementMap as KernelToElementMap);
@ -406,7 +346,6 @@ class KClassEnvImpl implements KClassEnv {
return constructor != null ? elementMap.getConstructor(constructor) : null;
}
@override
void forEachConstructor(
IrToElementMap elementMap, void f(ConstructorEntity constructor)) {
_ensureMaps(elementMap as KernelToElementMap);
@ -420,12 +359,10 @@ class KClassEnvImpl implements KClassEnv {
_constructorBodyList!.add(constructorBody);
}
@override
void forEachConstructorBody(void f(ConstructorBodyEntity constructor)) {
_constructorBodyList?.forEach(f);
}
@override
JClassEnv convert(
IrToElementMap kElementMap,
Map<MemberEntity, MemberUsage> liveMemberUsage,
@ -475,65 +412,29 @@ class KClassEnvImpl implements KClassEnv {
}
}
abstract class KClassData {
ir.Class get node;
InterfaceType? get thisType;
InterfaceType? get jsInteropType;
InterfaceType? get rawType;
InterfaceType? get instantiationToBounds;
InterfaceType? get supertype;
InterfaceType? get mixedInType;
List<InterfaceType>? get interfaces;
OrderedTypeSet? get orderedTypeSet;
DartType? get callType;
bool get isEnumClass;
bool get isMixinApplication;
Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
List<Variance> getVariances();
/// Convert this [KClassData] to the corresponding [JClassData].
JClassData convert();
}
class KClassDataImpl implements KClassData {
@override
class KClassData {
final ir.Class node;
@override
late bool isMixinApplication;
@override
InterfaceType? thisType;
@override
InterfaceType? jsInteropType;
@override
InterfaceType? rawType;
@override
InterfaceType? instantiationToBounds;
@override
InterfaceType? supertype;
@override
InterfaceType? mixedInType;
@override
List<InterfaceType>? interfaces;
@override
OrderedTypeSet? orderedTypeSet;
Iterable<ConstantValue>? _metadata;
List<Variance>? _variances;
KClassDataImpl(this.node);
KClassData(this.node);
@override
bool get isEnumClass => node.isEnum;
@override
FunctionType? callType;
bool isCallTypeComputed = false;
@override
Iterable<ConstantValue> getMetadata(covariant KernelToElementMap elementMap) {
return _metadata ??= elementMap.getMetadata(
ir.StaticTypeContext.forAnnotations(
@ -541,50 +442,31 @@ class KClassDataImpl implements KClassData {
node.annotations);
}
@override
List<Variance> getVariances() =>
_variances ??= node.typeParameters.map(convertVariance).toList();
@override
JClassData convert() {
return JClassDataImpl(node, RegularClassDefinition(node));
}
}
abstract class KMemberData {
ir.Member get node;
StaticTypeCache? staticTypes;
Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
InterfaceType? getMemberThisType(JsToElementMap elementMap);
ClassTypeVariableAccess get classTypeVariableAccess;
/// Convert this [KMemberData] to the corresponding [JMemberData].
JMemberData convert();
}
abstract class KMemberDataImpl implements KMemberData {
@override
final ir.Member node;
Iterable<ConstantValue>? _metadata;
@override
StaticTypeCache? staticTypes;
KMemberDataImpl(this.node);
ClassTypeVariableAccess get classTypeVariableAccess;
KMemberData(this.node);
@override
Iterable<ConstantValue> getMetadata(covariant KernelToElementMap elementMap) {
return _metadata ??= elementMap.getMetadata(
ir.StaticTypeContext(node, elementMap.typeEnvironment),
node.annotations);
}
@override
InterfaceType? getMemberThisType(JsToElementMap elementMap) {
MemberEntity member = elementMap.getMember(node);
ClassEntity? cls = member.enclosingClass;
@ -593,63 +475,22 @@ abstract class KMemberDataImpl implements KMemberData {
}
return null;
}
/// Convert this [KMemberData] to the corresponding [JMemberData].
JMemberData convert();
}
abstract class KFunctionData implements KMemberData {
FunctionType getFunctionType(IrToElementMap elementMap);
List<TypeVariableType> getFunctionTypeVariables(IrToElementMap elementMap);
void forEachParameter(JsToElementMap elementMap,
void f(DartType type, String? name, ConstantValue? defaultValue));
}
abstract class KFunctionDataMixin implements KFunctionData {
ir.FunctionNode get functionNode;
List<TypeVariableType>? _typeVariables;
@override
List<TypeVariableType> getFunctionTypeVariables(
covariant KernelToElementMap elementMap) {
if (_typeVariables == null) {
if (functionNode.typeParameters.isEmpty) {
_typeVariables = const <TypeVariableType>[];
} else {
ir.TreeNode? parent = functionNode.parent;
if (parent is ir.Constructor ||
(parent is ir.Procedure &&
parent.kind == ir.ProcedureKind.Factory)) {
_typeVariables = const <TypeVariableType>[];
} else {
_typeVariables = functionNode.typeParameters
.map<TypeVariableType>((ir.TypeParameter typeParameter) {
return elementMap
.getDartType(ir.TypeParameterType(
typeParameter, ir.Nullability.nonNullable))
.withoutNullability as TypeVariableType;
}).toList();
}
}
}
return _typeVariables!;
}
}
class KFunctionDataImpl extends KMemberDataImpl
with KFunctionDataMixin
implements KFunctionData {
@override
class KFunctionData extends KMemberData {
final ir.FunctionNode functionNode;
FunctionType? _type;
List<TypeVariableType>? _typeVariables;
KFunctionDataImpl(super.node, this.functionNode);
KFunctionData(super.node, this.functionNode);
@override
FunctionType getFunctionType(covariant KernelToElementMap elementMap) {
return _type ??= elementMap.getFunctionType(functionNode);
}
@override
void forEachParameter(JsToElementMap elementMap,
void f(DartType type, String? name, ConstantValue? defaultValue)) {
void handleParameter(ir.VariableDeclaration parameter,
@ -677,6 +518,31 @@ class KFunctionDataImpl extends KMemberDataImpl
..forEach(handleParameter);
}
List<TypeVariableType> getFunctionTypeVariables(
covariant KernelToElementMap elementMap) {
if (_typeVariables == null) {
if (functionNode.typeParameters.isEmpty) {
_typeVariables = const <TypeVariableType>[];
} else {
ir.TreeNode? parent = functionNode.parent;
if (parent is ir.Constructor ||
(parent is ir.Procedure &&
parent.kind == ir.ProcedureKind.Factory)) {
_typeVariables = const <TypeVariableType>[];
} else {
_typeVariables = functionNode.typeParameters
.map<TypeVariableType>((ir.TypeParameter typeParameter) {
return elementMap
.getDartType(ir.TypeParameterType(
typeParameter, ir.Nullability.nonNullable))
.withoutNullability as TypeVariableType;
}).toList();
}
}
}
return _typeVariables!;
}
@override
FunctionData convert() {
return FunctionDataImpl(
@ -695,13 +561,10 @@ class KFunctionDataImpl extends KMemberDataImpl
}
}
abstract class KConstructorData extends KFunctionData {}
class KConstructorDataImpl extends KFunctionDataImpl
implements KConstructorData {
class KConstructorData extends KFunctionData {
ConstructorBodyEntity? constructorBody;
KConstructorDataImpl(super.node, super.functionNode);
KConstructorData(super.node, super.functionNode);
@override
JConstructorData convert() {
@ -711,7 +574,7 @@ class KConstructorDataImpl extends KFunctionDataImpl
} else {
definition = RegularMemberDefinition(node);
}
return JConstructorDataImpl(node, functionNode, definition, staticTypes!);
return JConstructorData(node, functionNode, definition, staticTypes!);
}
@override
@ -719,35 +582,20 @@ class KConstructorDataImpl extends KFunctionDataImpl
ClassTypeVariableAccess.parameter;
}
abstract class KFieldData extends KMemberData {
DartType getFieldType(IrToElementMap elementMap);
/// `true` if this field is the backing field for a `late` or `late final`
/// instance field.
bool get isLateBackingField;
/// `true` if this field is the backing field for a `late final` instance
/// field.
bool get isLateFinalBackingField;
}
class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
class KFieldData extends KMemberData {
DartType? _type;
@override
final bool isLateBackingField;
@override
final bool isLateFinalBackingField;
KFieldDataImpl(super.node,
KFieldData(super.node,
{required this.isLateBackingField,
required this.isLateFinalBackingField});
@override
ir.Field get node => super.node as ir.Field;
@override
DartType getFieldType(covariant KernelToElementMap elementMap) {
return _type ??= elementMap.getDartType(node.type);
}