mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 23:39:48 +00:00
[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:
parent
8f48ac3723
commit
f60c7b2ad3
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue