[cfe] Use extension type members hierarchy to lookup members

Change-Id: Ife78479add65488f79c5c949a7472e9d7ea22928
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/332401
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Johnni Winther 2023-10-27 12:23:20 +00:00 committed by Commit Queue
parent d5ad08c027
commit 219711e6ac
41 changed files with 1756 additions and 158 deletions

View file

@ -23,6 +23,9 @@ abstract class MemberBuilder implements ModifierBuilder {
LibraryBuilder get libraryBuilder;
/// The declared name of this member;
Name get memberName;
/// The [Member] built by this builder;
Member get member;
@ -195,20 +198,7 @@ abstract class BuilderClassMember implements ClassMember {
bool get isExtensionTypeMember => memberBuilder.isExtensionTypeMember;
@override
Name get name {
// The name must be derived from the declared name and not the generated
// name. For instance for extension type members the generated name might
// be `ExtensionType|_id` but the return named should be `_id` private to
// library in which it was declared.
//
// Therefore, if the member name is already private, use the library of the
// of the member name, otherwise use the enclosing library.
// TODO(johnniwinther): Find a more robust way to compute this.
return new Name(
memberBuilder.name,
memberBuilder.member.name.library ??
memberBuilder.libraryBuilder.library);
}
Name get name => memberBuilder.memberName;
@override
String get fullName {

View file

@ -43,6 +43,9 @@ abstract class DillExtensionTypeMemberBuilder extends DillMemberBuilder {
}
return null;
}
@override
Name get memberName => new Name(name, member.enclosingLibrary);
}
class DillExtensionTypeFieldBuilder extends DillExtensionTypeMemberBuilder {

View file

@ -11,6 +11,7 @@ import 'package:kernel/ast.dart'
Field,
FunctionNode,
Member,
Name,
Procedure,
ProcedureKind,
ProcedureStubKind;
@ -50,6 +51,9 @@ abstract class DillMemberBuilder extends MemberBuilderImpl {
@override
String get name => member.name.text;
@override
Name get memberName => member.name;
@override
bool get isConstructor => member is Constructor;

View file

@ -227,27 +227,32 @@ class ExtensionTypeMembersNodeBuilder extends MembersNodeBuilder {
return new ExtensionTypeMembersNode(
_hierarchyNode.extensionTypeDeclarationBuilder,
nonExtensionTypeGetableMap,
nonExtensionTypeSetableMap,
extensionTypeGetableMap,
extensionTypeSetableMap);
nonExtensionTypeGetableMap.isNotEmpty
? nonExtensionTypeGetableMap
: null,
nonExtensionTypeSetableMap.isNotEmpty
? nonExtensionTypeSetableMap
: null,
extensionTypeGetableMap.isNotEmpty ? extensionTypeGetableMap : null,
extensionTypeSetableMap.isNotEmpty ? extensionTypeSetableMap : null);
}
}
class ExtensionTypeMembersNode {
final ExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder;
/// All the members of this extension type inherited from non-extension types.
/// All the getables of this extension type inherited from non-extension
/// types.
final Map<Name, ClassMember>? nonExtensionTypeGetableMap;
/// Similar to [nonExtensionTypeGetableMap] but for setters.
/// Similar to [nonExtensionTypeGetableMap] but for setables.
final Map<Name, ClassMember>? nonExtensionTypeSetableMap;
/// All the members of this class including [classMembers] of its
/// superclasses. The members are sorted by [compareDeclarations].
/// All the getables declared in this extension type or inherited from super
/// extension types.
final Map<Name, ClassMember>? extensionTypeGetableMap;
/// Similar to [extensionTypeGetableMap] but for setters.
/// Similar to [extensionTypeGetableMap] but for setables.
final Map<Name, ClassMember>? extensionTypeSetableMap;
ExtensionTypeMembersNode(
@ -256,6 +261,19 @@ class ExtensionTypeMembersNode {
this.nonExtensionTypeSetableMap,
this.extensionTypeGetableMap,
this.extensionTypeSetableMap);
ClassMember? getMember(Name name, bool isSetter) {
ClassMember? result = isSetter
? (extensionTypeSetableMap?[name] ?? nonExtensionTypeSetableMap?[name])
: (extensionTypeGetableMap?[name] ?? nonExtensionTypeGetableMap?[name]);
if (result == null) {
return null;
}
if (result.isStatic) {
return null;
}
return result;
}
}
class _Tuple {

View file

@ -168,6 +168,14 @@ class ClassMembersBuilder implements ClassHierarchyMembers {
return getNodeFromClass(cls).getInterfaceMember(name, setter);
}
Member? getExtensionTypeMember(
ExtensionTypeDeclaration extensionTypeDeclaration, Name name,
{bool setter = false}) {
return getNodeFromExtensionTypeDeclaration(extensionTypeDeclaration)
.getMember(name, setter)
?.getMember(this);
}
@override
Member? getDispatchTarget(Class cls, Name name, {bool setter = false}) {
return getNodeFromClass(cls)

View file

@ -953,6 +953,9 @@ mixin ErroneousMemberBuilderMixin implements SourceMemberBuilder {
@override
Member get member => throw new UnsupportedError('$runtimeType.member');
@override
Name get memberName => throw new UnsupportedError('$runtimeType.memberName');
@override
Member? get readTarget => null;

View file

@ -178,6 +178,15 @@ class NameScheme {
isTearOff: isTearOff);
}
}
/// Returns the [MemberName] corresponding to the declared member, i.e. the
/// name of the member without any applied lowering.
MemberName getDeclaredName(String name) {
// TODO(johnniwinther): Add a helper method for `isPrivate`.
return name.startsWith('_')
? new PrivateMemberName(libraryName, name)
: new PublicMemberName(name);
}
}
/// The part of a member name defined by a library.

View file

@ -338,6 +338,8 @@ class DeclaredSourceConstructorBuilder
@override
List<FormalParameterBuilder>? formals;
final MemberName _memberName;
@override
String get fullNameForErrors {
return "${flattenName(declarationBuilder.name, charOffset, fileUri)}"
@ -364,6 +366,7 @@ class DeclaredSourceConstructorBuilder
bool isSynthetic = false})
: _hasSuperInitializingFormals =
formals?.any((formal) => formal.isSuperInitializingFormal) ?? false,
_memberName = nameScheme.getDeclaredName(name),
super(
metadata,
modifiers,
@ -396,6 +399,9 @@ class DeclaredSourceConstructorBuilder
forAbstractClassOrEnumOrMixin: forAbstractClassOrEnumOrMixin);
}
@override
Name get memberName => _memberName.name;
@override
ClassDeclaration get classDeclaration => classBuilder;
@ -1081,6 +1087,8 @@ class SourceExtensionTypeConstructorBuilder
@override
List<Initializer> initializers = [];
final MemberName _memberName;
SourceExtensionTypeConstructorBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
@ -1098,7 +1106,8 @@ class SourceExtensionTypeConstructorBuilder
NameScheme nameScheme,
{String? nativeMethodName,
required bool forAbstractClassOrEnumOrMixin})
: super(
: _memberName = nameScheme.getDeclaredName(name),
super(
metadata,
modifiers,
returnType,
@ -1129,6 +1138,9 @@ class SourceExtensionTypeConstructorBuilder
?..isExtensionTypeMember = true;
}
@override
Name get memberName => _memberName.name;
@override
ClassDeclaration get classDeclaration => extensionTypeDeclarationBuilder;

View file

@ -61,6 +61,8 @@ class SourceFactoryBuilder extends SourceFunctionBuilderImpl {
List<SourceFactoryBuilder>? _patches;
final MemberName _memberName;
SourceFactoryBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
@ -78,7 +80,8 @@ class SourceFactoryBuilder extends SourceFunctionBuilderImpl {
AsyncMarker asyncModifier,
NameScheme nameScheme,
{String? nativeMethodName})
: super(metadata, modifiers, name, typeVariables, formals, libraryBuilder,
: _memberName = nameScheme.getDeclaredName(name),
super(metadata, modifiers, name, typeVariables, formals, libraryBuilder,
charOffset, nativeMethodName) {
_procedureInternal = new Procedure(
dummyName,
@ -107,6 +110,9 @@ class SourceFactoryBuilder extends SourceFunctionBuilderImpl {
this.asyncModifier = asyncModifier;
}
@override
Name get memberName => _memberName.name;
@override
DeclarationBuilder get declarationBuilder => super.declarationBuilder!;

View file

@ -48,6 +48,8 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
@override
final String name;
final MemberName _memberName;
@override
final int modifiers;
@ -103,6 +105,7 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
this.isSynthesized = false,
this.isEnumElement = false})
: _constInitializerToken = constInitializerToken,
_memberName = fieldNameScheme.getDeclaredName(name),
super(libraryBuilder, charOffset) {
type.registerInferredTypeListener(this);
@ -307,6 +310,9 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
}
}
@override
Name get memberName => _memberName.name;
bool get isLateLowered => _fieldEncoding.isLateLowering;
bool _typeEnsured = false;
@ -1203,16 +1209,16 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
@override
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) {
List<ClassMember> list = <ClassMember>[
new _SynthesizedFieldClassMember(
fieldBuilder, field, _SynthesizedFieldMemberKind.LateField,
new _SynthesizedFieldClassMember(fieldBuilder, field, field.name,
_SynthesizedFieldMemberKind.LateField,
isInternalImplementation: true),
new _SynthesizedFieldClassMember(fieldBuilder, _lateGetter,
_SynthesizedFieldMemberKind.LateGetterSetter,
fieldBuilder.memberName, _SynthesizedFieldMemberKind.LateGetterSetter,
isInternalImplementation: false)
];
if (_lateIsSetField != null) {
list.add(new _SynthesizedFieldClassMember(
fieldBuilder, _lateIsSetField!, _SynthesizedFieldMemberKind.LateIsSet,
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateIsSetField!,
_lateIsSetField!.name, _SynthesizedFieldMemberKind.LateIsSet,
isInternalImplementation: true));
}
return list;
@ -1221,18 +1227,18 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
@override
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder) {
List<ClassMember> list = <ClassMember>[
new _SynthesizedFieldClassMember(
fieldBuilder, field, _SynthesizedFieldMemberKind.LateField,
new _SynthesizedFieldClassMember(fieldBuilder, field, field.name,
_SynthesizedFieldMemberKind.LateField,
forSetter: true, isInternalImplementation: true),
];
if (_lateIsSetField != null) {
list.add(new _SynthesizedFieldClassMember(
fieldBuilder, _lateIsSetField!, _SynthesizedFieldMemberKind.LateIsSet,
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateIsSetField!,
_lateIsSetField!.name, _SynthesizedFieldMemberKind.LateIsSet,
forSetter: true, isInternalImplementation: true));
}
if (_lateSetter != null) {
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateSetter!,
_SynthesizedFieldMemberKind.LateGetterSetter,
fieldBuilder.memberName, _SynthesizedFieldMemberKind.LateGetterSetter,
forSetter: true, isInternalImplementation: false));
}
return list;
@ -1528,6 +1534,8 @@ class _SynthesizedFieldClassMember implements ClassMember {
final Member _member;
final Name _name;
Covariance? _covariance;
@override
@ -1536,7 +1544,8 @@ class _SynthesizedFieldClassMember implements ClassMember {
@override
final bool isInternalImplementation;
_SynthesizedFieldClassMember(this.fieldBuilder, this._member, this._kind,
_SynthesizedFieldClassMember(
this.fieldBuilder, this._member, this._name, this._kind,
{this.forSetter = false, required this.isInternalImplementation});
@override
@ -1615,7 +1624,7 @@ class _SynthesizedFieldClassMember implements ClassMember {
}
@override
Name get name => _member.name;
Name get name => _name;
@override
String get fullName {
@ -1956,18 +1965,26 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
@override
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
<ClassMember>[
new _SynthesizedFieldClassMember(fieldBuilder, _getter,
new _SynthesizedFieldClassMember(
fieldBuilder,
_getter,
fieldBuilder.memberName,
_SynthesizedFieldMemberKind.AbstractExternalGetterSetter,
forSetter: false, isInternalImplementation: false)
forSetter: false,
isInternalImplementation: false)
];
@override
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder) =>
_setter != null
? <ClassMember>[
new _SynthesizedFieldClassMember(fieldBuilder, _setter!,
new _SynthesizedFieldClassMember(
fieldBuilder,
_setter!,
fieldBuilder.memberName,
_SynthesizedFieldMemberKind.AbstractExternalGetterSetter,
forSetter: true, isInternalImplementation: false)
forSetter: true,
isInternalImplementation: false)
]
: const <ClassMember>[];
@ -2095,9 +2112,13 @@ class RepresentationFieldEncoding implements FieldEncoding {
@override
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
<ClassMember>[
new _SynthesizedFieldClassMember(fieldBuilder, _getter,
new _SynthesizedFieldClassMember(
fieldBuilder,
_getter,
fieldBuilder.memberName,
_SynthesizedFieldMemberKind.RepresentationField,
forSetter: false, isInternalImplementation: false)
forSetter: false,
isInternalImplementation: false)
];
@override

View file

@ -74,6 +74,8 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
List<SourceProcedureBuilder>? _patches;
final MemberName _memberName;
SourceProcedureBuilder(
List<MetadataBuilder>? metadata,
int modifiers,
@ -98,6 +100,7 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
nameScheme.isInstanceMember && nameScheme.isExtensionMember,
this.isExtensionTypeInstanceMember =
nameScheme.isInstanceMember && nameScheme.isExtensionTypeMember,
_memberName = nameScheme.getDeclaredName(name),
super(metadata, modifiers, name, typeVariables, formals, libraryBuilder,
charOffset, nativeMethodName) {
_procedure = new Procedure(
@ -131,6 +134,9 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
}
}
@override
Name get memberName => _memberName.name;
List<SourceProcedureBuilder>? get patchesForTesting => _patches;
@override

View file

@ -963,110 +963,70 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
return inferredTypes;
}
/// Returns extension type member declared immediately for [extensionType].
ObjectAccessTarget? _findDirectExtensionTypeMember(DartType receiverType,
ObjectAccessTarget? _findExtensionTypeMember(DartType receiverType,
ExtensionType extensionType, Name name, int fileOffset,
{required bool isSetter,
required bool isReceiverTypePotentiallyNullable}) {
for (Procedure procedure
in extensionType.extensionTypeDeclaration.procedures) {
if (isSetter != procedure.isSetter) {
continue;
}
if (procedure.name == name) {
if (procedure.stubKind == ProcedureStubKind.RepresentationField) {
return new ObjectAccessTarget.extensionTypeRepresentation(
receiverType, extensionType, procedure,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
}
return new ObjectAccessTarget.interfaceMember(receiverType, procedure,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
}
Member? member = _getExtensionTypeMember(
extensionType.extensionTypeDeclaration, name, isSetter);
if (member == null) {
return null;
}
if (member is Procedure &&
member.stubKind == ProcedureStubKind.RepresentationField) {
return new ObjectAccessTarget.extensionTypeRepresentation(
receiverType, extensionType, member,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
}
if (member.isExtensionTypeMember) {
// TODO(johnniwinther): Derive this from the [ClassMember].
ExtensionTypeMemberDescriptor? memberDescriptor;
ExtensionTypeDeclaration? extensionTypeDeclaration;
outer:
for (ExtensionTypeDeclaration declaration
in member.enclosingLibrary.extensionTypeDeclarations) {
for (ExtensionTypeMemberDescriptor descriptor
in declaration.memberDescriptors) {
if (descriptor.memberReference == member.reference) {
extensionTypeDeclaration = declaration;
memberDescriptor = descriptor;
break outer;
}
}
}
assert(extensionTypeDeclaration != null,
"No enclosing extension type declaration found for $member.");
assert(memberDescriptor != null,
"No extension type member descriptor found for $member.");
ProcedureKind kind;
switch (memberDescriptor!.kind) {
case ExtensionTypeMemberKind.Method:
kind = ProcedureKind.Method;
case ExtensionTypeMemberKind.Operator:
kind = ProcedureKind.Operator;
case ExtensionTypeMemberKind.Getter:
kind = ProcedureKind.Getter;
case ExtensionTypeMemberKind.Setter:
kind = ProcedureKind.Setter;
case ExtensionTypeMemberKind.Constructor:
case ExtensionTypeMemberKind.Factory:
case ExtensionTypeMemberKind.Field:
case ExtensionTypeMemberKind.RedirectingFactory:
throw new UnsupportedError("Unexpected extension type member kind: "
"${memberDescriptor.kind}.");
}
// TODO(johnniwinther): Cache this to speed up the lookup.
Member? targetMember;
Member? targetTearoff;
ProcedureKind? targetKind;
for (ExtensionTypeMemberDescriptor descriptor
in extensionType.extensionTypeDeclaration.memberDescriptors) {
if (descriptor.name == name) {
switch (descriptor.kind) {
case ExtensionTypeMemberKind.Method:
if (!isSetter) {
targetMember = descriptor.memberReference.asMember;
targetTearoff = descriptor.tearOffReference?.asMember;
targetKind = ProcedureKind.Method;
}
break;
case ExtensionTypeMemberKind.Getter:
if (!isSetter) {
targetMember = descriptor.memberReference.asMember;
targetTearoff = null;
targetKind = ProcedureKind.Getter;
}
break;
case ExtensionTypeMemberKind.Setter:
if (isSetter) {
targetMember = descriptor.memberReference.asMember;
targetTearoff = null;
targetKind = ProcedureKind.Setter;
}
break;
case ExtensionTypeMemberKind.Operator:
if (!isSetter) {
targetMember = descriptor.memberReference.asMember;
targetTearoff = null;
targetKind = ProcedureKind.Operator;
}
break;
default:
unhandled("${descriptor.kind}", "_findDirectExtensionTypeMember",
fileOffset, libraryBuilder.fileUri);
}
}
}
if (targetMember != null) {
assert(targetKind != null);
return new ObjectAccessTarget.extensionTypeMember(receiverType,
targetMember, targetTearoff, targetKind!, extensionType.typeArguments,
return new ObjectAccessTarget.extensionTypeMember(
receiverType,
memberDescriptor.memberReference.asMember,
memberDescriptor.tearOffReference?.asMember,
kind,
hierarchyBuilder.getTypeArgumentsAsInstanceOf(
extensionType, extensionTypeDeclaration!)!,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
} else {
for (DartType implement
in extensionType.extensionTypeDeclaration.implements) {
if (implement is ExtensionType) {
ExtensionType supertype = hierarchyBuilder
.getExtensionTypeAsInstanceOfExtensionTypeDeclaration(
extensionType, implement.extensionTypeDeclaration,
isNonNullableByDefault: isNonNullableByDefault)!;
ObjectAccessTarget? target = _findDirectExtensionTypeMember(
receiverType, supertype, name, fileOffset,
isSetter: isSetter,
isReceiverTypePotentiallyNullable:
isReceiverTypePotentiallyNullable);
if (target != null) {
return target;
}
} else if (implement is InterfaceType) {
InterfaceType supertype =
hierarchyBuilder.getExtensionTypeAsInstanceOfClass(
extensionType, implement.classNode,
isNonNullableByDefault: isNonNullableByDefault)!;
Member? interfaceMember = _getInterfaceMember(
supertype.classNode, name, isSetter, fileOffset);
if (interfaceMember != null) {
return new ObjectAccessTarget.interfaceMember(
receiverType, interfaceMember,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
}
} else {
assert(
false,
"Unexpected supertype $implement extension type declaration of "
"$extensionType.");
}
}
return null;
return new ObjectAccessTarget.interfaceMember(receiverType, member,
isPotentiallyNullable: isReceiverTypePotentiallyNullable);
}
}
@ -1261,8 +1221,8 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
fileOffset: fileOffset);
if (isReceiverTypePotentiallyNullable) {
Member? member = _getInterfaceMember(
coreTypes.objectClass, name, isSetter, fileOffset);
Member? member =
_getInterfaceMember(coreTypes.objectClass, name, isSetter);
if (member != null) {
// Null implements all Object members so this is not considered a
// potentially nullable access.
@ -1439,6 +1399,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
DartType _getTypeForMemberTarget(
Member interfaceMember, DartType calleeType, DartType receiverType) {
// TODO(johnniwinther): Use [enclosingDeclaration] and `asInstanceOf`.
Class? enclosingClass = interfaceMember.enclosingClass;
ExtensionTypeDeclaration? enclosingExtensionTypeDeclaration =
interfaceMember.enclosingExtensionTypeDeclaration;
@ -3853,13 +3814,21 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
}), coreTypes);
}
Member? _getInterfaceMember(
Class class_, Name name, bool setter, int charOffset) {
Member? _getInterfaceMember(Class class_, Name name, bool setter) {
Member? member =
engine.membersBuilder.getInterfaceMember(class_, name, setter: setter);
return TypeInferenceEngine.resolveInferenceNode(member, hierarchyBuilder);
}
Member? _getExtensionTypeMember(
ExtensionTypeDeclaration extensionTypeDeclaration,
Name name,
bool setter) {
Member? member = engine.membersBuilder
.getExtensionTypeMember(extensionTypeDeclaration, name, setter: setter);
return TypeInferenceEngine.resolveInferenceNode(member, hierarchyBuilder);
}
bool _isLoweredSetLiteral(Expression expression) {
if (libraryBuilder.loader.target.backendTarget.supportsSetLiterals) {
return false;
@ -4812,7 +4781,7 @@ class _ObjectAccessDescriptor {
}
}
} else if (receiverBound is ExtensionType) {
ObjectAccessTarget? target = visitor._findDirectExtensionTypeMember(
ObjectAccessTarget? target = visitor._findExtensionTypeMember(
receiverType, receiverBound, name, fileOffset,
isSetter: isSetter,
isReceiverTypePotentiallyNullable: isReceiverTypePotentiallyNullable);
@ -4823,7 +4792,7 @@ class _ObjectAccessDescriptor {
ObjectAccessTarget? target;
Member? interfaceMember =
visitor._getInterfaceMember(classNode, name, isSetter, fileOffset);
visitor._getInterfaceMember(classNode, name, isSetter);
if (interfaceMember != null) {
target = new ObjectAccessTarget.interfaceMember(
receiverType, interfaceMember,

View file

@ -1357,14 +1357,8 @@ class ExtensionTypeRepresentationAccessTarget extends ObjectAccessTarget {
@override
DartType getGetterType(InferenceVisitorBase base) {
ExtensionTypeDeclaration extensionTypeDeclaration =
extensionType.extensionTypeDeclaration;
DartType representationType = representationField.getterType;
if (extensionTypeDeclaration.typeParameters.isNotEmpty) {
representationType = Substitution.fromExtensionType(extensionType)
.substituteType(representationType);
}
return representationType;
return base.getGetterTypeForMemberTarget(representationField, receiverType,
isSuper: false);
}
@override

View file

@ -213,6 +213,7 @@ abstract class TypeInferenceEngine {
static Member? resolveInferenceNode(
Member? member, ClassHierarchyBase hierarchy) {
// TODO(johnniwinther): Can we remove this now?
if (member is Field) {
DartType type = member.type;
if (type is InferredType) {

View file

@ -38,6 +38,22 @@ void testSetter(E e) {
e.setter = (a, b) => (a as int, b); // Error
}
E e = E(C());
var f = e.method();
(Object?, Object?) f1 = f; // Ok
(Object?, int) f2 = f; // Error
(int, Object?) f3 = f; // Error
testMethod5(E e) => f.$1.unresolved(); // Error
testMethod6(E e) => f.$2.unresolved(); // Error
var g = e.getter;
(Object?, Object?) g1 = g; // Ok
(Object?, int) g2 = g; // Error
(int, Object?) g3 = g; // Error
testGetter5(E e) => g.$1.unresolved(); // Error
testGetter6(E e) => g.$2.unresolved(); // Error
void method(E e) {
var (a, b) = e.method();
expect(42, a);

View file

@ -44,6 +44,50 @@ library;
// e.setter = (a, b) => (a as int, b); // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) f2 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) f3 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod5(E e) => f.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod6(E e) => f.$2.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) g2 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) g3 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter5(E e) => g.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter6(E e) => g.$2.unresolved(); // Error
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@ -81,6 +125,27 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•());
static field (core::Object?, core::Object?) f = self::e.{self::A::method}(){() → (core::Object?, core::Object?)};
static field (core::Object?, core::Object?) f1 = self::f;
static field (core::Object?, core::int) f2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) f2 = f; // Error
^" in self::f as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) f3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) f3 = f; // Error
^" in self::f as{TypeError} (core::int, core::Object?);
static field (core::Object?, core::Object?) g = self::e.{self::A::getter}{(core::Object?, core::Object?)};
static field (core::Object?, core::Object?) g1 = self::g;
static field (core::Object?, core::int) g2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) g2 = g; // Error
^" in self::g as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) g3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) g3 = g; // Error
^" in self::g as{TypeError} (core::int, core::Object?);
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
@ -134,6 +199,30 @@ static method testSetter(self::E /* = self::C */ e) → void {
e.setter = (a, b) => (a as int, b); // Error
^" in (a as core::int, b) as{TypeError} (core::int, core::int);
}
static method testMethod5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod5(E e) => f.\$1.unresolved(); // Error
^^^^^^^^^^" in self::f.$1{core::Object?}{<unresolved>}.unresolved();
static method testMethod6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod6(E e) => f.\$2.unresolved(); // Error
^^^^^^^^^^" in self::f.$2{core::Object?}{<unresolved>}.unresolved();
static method testGetter5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter5(E e) => g.\$1.unresolved(); // Error
^^^^^^^^^^" in self::g.$1{core::Object?}{<unresolved>}.unresolved();
static method testGetter6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter6(E e) => g.\$2.unresolved(); // Error
^^^^^^^^^^" in self::g.$2{core::Object?}{<unresolved>}.unresolved();
static method method(self::E /* = self::C */ e) → void {
hoisted has-declared-initializer core::Object? a;
hoisted has-declared-initializer core::Object? b;

View file

@ -44,6 +44,50 @@ library;
// e.setter = (a, b) => (a as int, b); // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) f2 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) f3 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod5(E e) => f.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod6(E e) => f.$2.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) g2 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) g3 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter5(E e) => g.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter6(E e) => g.$2.unresolved(); // Error
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@ -81,6 +125,27 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•());
static field (core::Object?, core::Object?) f = self::e.{self::A::method}(){() → (core::Object?, core::Object?)};
static field (core::Object?, core::Object?) f1 = self::f;
static field (core::Object?, core::int) f2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) f2 = f; // Error
^" in self::f as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) f3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) f3 = f; // Error
^" in self::f as{TypeError} (core::int, core::Object?);
static field (core::Object?, core::Object?) g = self::e.{self::A::getter}{(core::Object?, core::Object?)};
static field (core::Object?, core::Object?) g1 = self::g;
static field (core::Object?, core::int) g2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) g2 = g; // Error
^" in self::g as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) g3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) g3 = g; // Error
^" in self::g as{TypeError} (core::int, core::Object?);
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
@ -134,6 +199,30 @@ static method testSetter(self::E /* = self::C */ e) → void {
e.setter = (a, b) => (a as int, b); // Error
^" in (a as core::int, b) as{TypeError} (core::int, core::int);
}
static method testMethod5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod5(E e) => f.\$1.unresolved(); // Error
^^^^^^^^^^" in self::f.$1{core::Object?}{<unresolved>}.unresolved();
static method testMethod6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod6(E e) => f.\$2.unresolved(); // Error
^^^^^^^^^^" in self::f.$2{core::Object?}{<unresolved>}.unresolved();
static method testGetter5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter5(E e) => g.\$1.unresolved(); // Error
^^^^^^^^^^" in self::g.$1{core::Object?}{<unresolved>}.unresolved();
static method testGetter6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter6(E e) => g.\$2.unresolved(); // Error
^^^^^^^^^^" in self::g.$2{core::Object?}{<unresolved>}.unresolved();
static method method(self::E /* = self::C */ e) → void {
hoisted has-declared-initializer core::Object? a;
hoisted has-declared-initializer core::Object? b;
@ -167,5 +256,5 @@ static method expect(dynamic expected, dynamic actual) → dynamic {
Extra constant evaluation status:
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:18:26 -> RecordConstant(const (42, 87))
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:19:28 -> RecordConstant(const (42, 87))
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:48:40 -> RecordConstant(const (42, 87))
Extra constant evaluation: evaluated: 63, effectively constant: 3
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:64:40 -> RecordConstant(const (42, 87))
Extra constant evaluation: evaluated: 71, effectively constant: 3

View file

@ -23,6 +23,19 @@ testMethod4(E e) => e.method().$2.unresolved();
(int, Object?) testGetter1(E e) => e.getter;
(Object?, int) testGetter2(E e) => e.getter;
void testSetter(E e) {}
E e = E(C());
var f = e.method();
(Object?, Object?) f1 = f;
(Object?, int) f2 = f;
(int, Object?) f3 = f;
testMethod5(E e) => f.$1.unresolved();
testMethod6(E e) => f.$2.unresolved();
var g = e.getter;
(Object?, Object?) g1 = g;
(Object?, int) g2 = g;
(int, Object?) g3 = g;
testGetter5(E e) => g.$1.unresolved();
testGetter6(E e) => g.$2.unresolved();
void method(E e) {}
main() {}
expect(expected, actual) {}

View file

@ -1,9 +1,16 @@
(Object?, Object?) f1 = f;
(Object?, Object?) g1 = g;
(Object?, Object?) testGetter0(E e) => e.getter;
(Object?, Object?) testMethod0(E e) => e.method();
(Object?, int) f2 = f;
(Object?, int) g2 = g;
(Object?, int) testGetter2(E e) => e.getter;
(Object?, int) testMethod2(E e) => e.method();
(int, Object?) f3 = f;
(int, Object?) g3 = g;
(int, Object?) testGetter1(E e) => e.getter;
(int, Object?) testMethod1(E e) => e.method();
E e = E(C());
abstract class A {
(Object?, dynamic) get getter;
(Object?, dynamic) method();
@ -22,7 +29,13 @@ class C implements A, B {
expect(expected, actual) {}
extension type E(C c) implements A, B {}
main() {}
testGetter5(E e) => g.$1.unresolved();
testGetter6(E e) => g.$2.unresolved();
testMethod3(E e) => e.method().$1.unresolved();
testMethod4(E e) => e.method().$2.unresolved();
testMethod5(E e) => f.$1.unresolved();
testMethod6(E e) => f.$2.unresolved();
var f = e.method();
var g = e.getter;
void method(E e) {}
void testSetter(E e) {}

View file

@ -44,6 +44,50 @@ library;
// e.setter = (a, b) => (a as int, b); // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) f2 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) f3 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod5(E e) => f.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod6(E e) => f.$2.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) g2 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) g3 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter5(E e) => g.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter6(E e) => g.$2.unresolved(); // Error
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@ -81,6 +125,27 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•());
static field (core::Object?, core::Object?) f = self::e.{self::A::method}(){() → (core::Object?, core::Object?)};
static field (core::Object?, core::Object?) f1 = self::f;
static field (core::Object?, core::int) f2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) f2 = f; // Error
^" in self::f as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) f3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) f3 = f; // Error
^" in self::f as{TypeError} (core::int, core::Object?);
static field (core::Object?, core::Object?) g = self::e.{self::A::getter}{(core::Object?, core::Object?)};
static field (core::Object?, core::Object?) g1 = self::g;
static field (core::Object?, core::int) g2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) g2 = g; // Error
^" in self::g as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) g3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) g3 = g; // Error
^" in self::g as{TypeError} (core::int, core::Object?);
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
@ -134,6 +199,30 @@ static method testSetter(self::E /* = self::C */ e) → void {
e.setter = (a, b) => (a as int, b); // Error
^" in (a as core::int, b) as{TypeError} (core::int, core::int);
}
static method testMethod5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod5(E e) => f.\$1.unresolved(); // Error
^^^^^^^^^^" in self::f.$1{core::Object?}{<unresolved>}.unresolved();
static method testMethod6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod6(E e) => f.\$2.unresolved(); // Error
^^^^^^^^^^" in self::f.$2{core::Object?}{<unresolved>}.unresolved();
static method testGetter5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter5(E e) => g.\$1.unresolved(); // Error
^^^^^^^^^^" in self::g.$1{core::Object?}{<unresolved>}.unresolved();
static method testGetter6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter6(E e) => g.\$2.unresolved(); // Error
^^^^^^^^^^" in self::g.$2{core::Object?}{<unresolved>}.unresolved();
static method method(self::E /* = self::C */ e) → void {
hoisted has-declared-initializer core::Object? a;
hoisted has-declared-initializer core::Object? b;

View file

@ -44,6 +44,50 @@ library;
// e.setter = (a, b) => (a as int, b); // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) f2 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) f3 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod5(E e) => f.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod6(E e) => f.$2.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) g2 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) g3 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter5(E e) => g.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter6(E e) => g.$2.unresolved(); // Error
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@ -81,6 +125,27 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•());
static field (core::Object?, core::Object?) f = self::e.{self::A::method}(){() → (core::Object?, core::Object?)};
static field (core::Object?, core::Object?) f1 = self::f;
static field (core::Object?, core::int) f2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) f2 = f; // Error
^" in self::f as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) f3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) f3 = f; // Error
^" in self::f as{TypeError} (core::int, core::Object?);
static field (core::Object?, core::Object?) g = self::e.{self::A::getter}{(core::Object?, core::Object?)};
static field (core::Object?, core::Object?) g1 = self::g;
static field (core::Object?, core::int) g2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) g2 = g; // Error
^" in self::g as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) g3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) g3 = g; // Error
^" in self::g as{TypeError} (core::int, core::Object?);
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
@ -134,6 +199,30 @@ static method testSetter(self::E /* = self::C */ e) → void {
e.setter = (a, b) => (a as int, b); // Error
^" in (a as core::int, b) as{TypeError} (core::int, core::int);
}
static method testMethod5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod5(E e) => f.\$1.unresolved(); // Error
^^^^^^^^^^" in self::f.$1{core::Object?}{<unresolved>}.unresolved();
static method testMethod6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod6(E e) => f.\$2.unresolved(); // Error
^^^^^^^^^^" in self::f.$2{core::Object?}{<unresolved>}.unresolved();
static method testGetter5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter5(E e) => g.\$1.unresolved(); // Error
^^^^^^^^^^" in self::g.$1{core::Object?}{<unresolved>}.unresolved();
static method testGetter6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter6(E e) => g.\$2.unresolved(); // Error
^^^^^^^^^^" in self::g.$2{core::Object?}{<unresolved>}.unresolved();
static method method(self::E /* = self::C */ e) → void {
hoisted has-declared-initializer core::Object? a;
hoisted has-declared-initializer core::Object? b;

View file

@ -34,6 +34,15 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e;
static field (core::Object?, core::Object?) f;
static field (core::Object?, core::Object?) f1;
static field (core::Object?, core::int) f2;
static field (core::int, core::Object?) f3;
static field (core::Object?, core::Object?) g;
static field (core::Object?, core::Object?) g1;
static field (core::Object?, core::int) g2;
static field (core::int, core::Object?) g3;
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */
;
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
@ -56,6 +65,14 @@ static method testGetter2(self::E /* = self::C */ e) → (core::Object?, core::i
;
static method testSetter(self::E /* = self::C */ e) → void
;
static method testMethod5(self::E /* = self::C */ e) → dynamic
;
static method testMethod6(self::E /* = self::C */ e) → dynamic
;
static method testGetter5(self::E /* = self::C */ e) → dynamic
;
static method testGetter6(self::E /* = self::C */ e) → dynamic
;
static method method(self::E /* = self::C */ e) → void
;
static method main() → dynamic

View file

@ -44,6 +44,50 @@ library;
// e.setter = (a, b) => (a as int, b); // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) f2 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) f3 = f; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod5(E e) => f.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testMethod6(E e) => f.$2.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
// - 'Object' is from 'dart:core'.
// (Object?, int) g2 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
// - 'Object' is from 'dart:core'.
// (int, Object?) g3 = g; // Error
// ^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter5(E e) => g.$1.unresolved(); // Error
// ^^^^^^^^^^
//
// pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
// - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
// testGetter6(E e) => g.$2.unresolved(); // Error
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@ -81,6 +125,27 @@ extension type E(self::C c) implements self::A, self::B {
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•());
static field (core::Object?, core::Object?) f = self::e.{self::A::method}(){() → (core::Object?, core::Object?)};
static field (core::Object?, core::Object?) f1 = self::f;
static field (core::Object?, core::int) f2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:45:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) f2 = f; // Error
^" in self::f as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) f3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:46:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) f3 = f; // Error
^" in self::f as{TypeError} (core::int, core::Object?);
static field (core::Object?, core::Object?) g = self::e.{self::A::getter}{(core::Object?, core::Object?)};
static field (core::Object?, core::Object?) g1 = self::g;
static field (core::Object?, core::int) g2 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:52:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(Object?, int)'.
- 'Object' is from 'dart:core'.
(Object?, int) g2 = g; // Error
^" in self::g as{TypeError} (core::Object?, core::int);
static field (core::int, core::Object?) g3 = invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:53:21: Error: A value of type '(Object?, Object?)' can't be assigned to a variable of type '(int, Object?)'.
- 'Object' is from 'dart:core'.
(int, Object?) g3 = g; // Error
^" in self::g as{TypeError} (core::int, core::Object?);
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
@ -134,6 +199,30 @@ static method testSetter(self::E /* = self::C */ e) → void {
e.setter = (a, b) => (a as int, b); // Error
^" in (a as core::int, b) as{TypeError} (core::int, core::int);
}
static method testMethod5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:47:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod5(E e) => f.\$1.unresolved(); // Error
^^^^^^^^^^" in self::f.$1{core::Object?}{<unresolved>}.unresolved();
static method testMethod6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:48:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testMethod6(E e) => f.\$2.unresolved(); // Error
^^^^^^^^^^" in self::f.$2{core::Object?}{<unresolved>}.unresolved();
static method testGetter5(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:54:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter5(E e) => g.\$1.unresolved(); // Error
^^^^^^^^^^" in self::g.$1{core::Object?}{<unresolved>}.unresolved();
static method testGetter6(self::E /* = self::C */ e) → dynamic
return invalid-expression "pkg/front_end/testcases/extension_types/combined_member_signature.dart:55:26: Error: The method 'unresolved' isn't defined for the class 'Object?'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
testGetter6(E e) => g.\$2.unresolved(); // Error
^^^^^^^^^^" in self::g.$2{core::Object?}{<unresolved>}.unresolved();
static method method(self::E /* = self::C */ e) → void {
hoisted has-declared-initializer core::Object? a;
hoisted has-declared-initializer core::Object? b;
@ -167,5 +256,5 @@ static method expect(dynamic expected, dynamic actual) → dynamic {
Extra constant evaluation status:
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:18:26 -> RecordConstant(const (42, 87))
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:19:28 -> RecordConstant(const (42, 87))
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:48:40 -> RecordConstant(const (42, 87))
Extra constant evaluation: evaluated: 63, effectively constant: 3
Evaluated: RecordLiteral @ org-dartlang-testcase:///combined_member_signature.dart:64:40 -> RecordConstant(const (42, 87))
Extra constant evaluation: evaluated: 71, effectively constant: 3

View file

@ -0,0 +1,29 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// 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.
var g = e.field;
var f = d.field;
E e = E(C(42));
D d = D(C(42));
extension type E(C c) implements C {}
extension type D(C c) implements B {}
class C implements B {
final field;
C(this.field);
}
abstract class B implements A {
get field;
}
abstract class A {
int get field;
}

View file

@ -0,0 +1,48 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
: self::C::field = field, super core::Object::•()
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
: super core::Object::•()
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g = self::e.{self::C::field}{core::int};
static field core::int f = self::d.{self::B::field}{core::int};
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•(42));
static field self::D /* = self::C */ d = self::D|constructor#(new self::C::•(42));
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
}
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */ {
lowered final self::D /* = self::C */ #this = c;
return #this;
}
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,48 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
: self::C::field = field, super core::Object::•()
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
: super core::Object::•()
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g = self::e.{self::C::field}{core::int};
static field core::int f = self::d.{self::B::field}{core::int};
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•(42));
static field self::D /* = self::C */ d = self::D|constructor#(new self::C::•(42));
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
}
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */ {
lowered final self::D /* = self::C */ #this = c;
return #this;
}
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,16 @@
var g = e.field;
var f = d.field;
E e = E(C(42));
D d = D(C(42));
extension type E(C c) implements C {}
extension type D(C c) implements B {}
class C implements B {
final field;
C(this.field);
}
abstract class B implements A {
get field;
}
abstract class A {
int get field;
}

View file

@ -0,0 +1,16 @@
D d = D(C(42));
E e = E(C(42));
abstract class A {
int get field;
}
abstract class B implements A {
get field;
}
class C implements B {
C(this.field);
final field;
}
extension type D(C c) implements B {}
extension type E(C c) implements C {}
var f = d.field;
var g = e.field;

View file

@ -0,0 +1,48 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
: self::C::field = field, super core::Object::•()
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
: super core::Object::•()
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g = self::e.{self::C::field}{core::int};
static field core::int f = self::d.{self::B::field}{core::int};
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•(42));
static field self::D /* = self::C */ d = self::D|constructor#(new self::C::•(42));
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
}
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */ {
lowered final self::D /* = self::C */ #this = c;
return #this;
}
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,48 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
: self::C::field = field, super core::Object::•()
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
: super core::Object::•()
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g = self::e.{self::C::field}{core::int};
static field core::int f = self::d.{self::B::field}{core::int};
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•(42));
static field self::D /* = self::C */ d = self::D|constructor#(new self::C::•(42));
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
}
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */ {
lowered final self::D /* = self::C */ #this = c;
return #this;
}
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,41 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g;
static field core::int f;
static field self::E /* = self::C */ e;
static field self::D /* = self::C */ d;
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */
;
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */
;
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,48 @@
library;
import self as self;
import "dart:core" as core;
class C extends core::Object implements self::B {
final field core::int field;
constructor •(core::int field) → self::C
: self::C::field = field, super core::Object::•()
;
}
abstract class B extends core::Object implements self::A {
synthetic constructor •() → self::B
: super core::Object::•()
;
abstract get field() → core::int;
}
abstract class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
abstract get field() → core::int;
}
extension type E(self::C c) implements self::C {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::E|constructor#;
constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type D(self::C c) implements self::B {
abstract inline-class-member representation-field get c() → self::C;
constructor • = self::D|constructor#;
constructor tearoff • = self::D|constructor#_#new#tearOff;
}
static field core::int g = self::e.{self::C::field}{core::int};
static field core::int f = self::d.{self::B::field}{core::int};
static field self::E /* = self::C */ e = self::E|constructor#(new self::C::•(42));
static field self::D /* = self::C */ d = self::D|constructor#(new self::C::•(42));
static inline-class-member method E|constructor#(self::C c) → self::E /* = self::C */ {
lowered final self::E /* = self::C */ #this = c;
return #this;
}
static inline-class-member method E|constructor#_#new#tearOff(self::C c) → self::E /* = self::C */
return self::E|constructor#(c);
static inline-class-member method D|constructor#(self::C c) → self::D /* = self::C */ {
lowered final self::D /* = self::C */ #this = c;
return #this;
}
static inline-class-member method D|constructor#_#new#tearOff(self::C c) → self::D /* = self::C */
return self::D|constructor#(c);

View file

@ -0,0 +1,57 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// 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.
extension type A<T>(Object it) {
T method() => throw '';
T get getter => throw '';
void set setter(T value) {}
T operator[] (T index) => throw '';
}
extension type B<S>(Object it) implements A<S> {
S method2() => method();
S get getter2 => getter;
void set setter2(S value) {
setter = value;
}
void operator[]= (S index, S value) {
value = this[index];
}
}
extension type C(Object i) implements A<int> {
int method3() => method();
int get getter3 => getter;
void set setter3(int value) {
setter = value;
}
void operator[]= (int index, int value) {
value = this[index];
}
}
test(A<bool> a, B<String> b, C c) {
bool a1 = a.method();
bool a2 = a.getter;
a.setter = a1;
bool a3 = a[a2];
String b1 = b.method();
String b2 = b.getter;
b.setter = b1;
String b3 = b[b2];
String b4 = b.method2();
String b5 = b.getter2;
b.setter2 = b4;
b[b5] = b1;
int c1 = c.method();
int c2 = c.getter;
c.setter = c1;
int c3 = c[c2];
int c4 = c.method3();
int c5 = c.getter3;
c.setter3 = c4;
c[c5] = c1;
}

View file

@ -0,0 +1,107 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */ {
lowered final self::A<self::A|constructor#::T%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
return throw "";
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
return throw "";
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void {}
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
return throw "";
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */ {
lowered final self::B<self::B|constructor#::S%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
return self::A|method<self::B|method2::S%>(#this);
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
return self::A|get#getter<self::B|get#getter2::S%>(#this);
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void {
self::A|set#setter<self::B|set#setter2::S%>(#this, value);
}
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void {
value = self::A|[]<self::B|[]=::S%>(#this, index);
}
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */ {
lowered final self::C /* = core::Object */ #this = i;
return #this;
}
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|method<core::int>(#this);
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|get#getter<core::int>(#this);
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void {
self::A|set#setter<core::int>(#this, value);
}
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void {
value = self::A|[]<core::int>(#this, index);
}
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic {
core::bool a1 = self::A|method<core::bool>(a);
core::bool a2 = self::A|get#getter<core::bool>(a);
self::A|set#setter<core::bool>(a, a1);
core::bool a3 = self::A|[]<core::bool>(a, a2);
core::String b1 = self::A|method<core::String>(b);
core::String b2 = self::A|get#getter<core::String>(b);
self::A|set#setter<core::String>(b, b1);
core::String b3 = self::A|[]<core::String>(b, b2);
core::String b4 = self::B|method2<core::String>(b);
core::String b5 = self::B|get#getter2<core::String>(b);
self::B|set#setter2<core::String>(b, b4);
self::B|[]=<core::String>(b, b5, b1);
core::int c1 = self::A|method<core::int>(c);
core::int c2 = self::A|get#getter<core::int>(c);
self::A|set#setter<core::int>(c, c1);
core::int c3 = self::A|[]<core::int>(c, c2);
core::int c4 = self::C|method3(c);
core::int c5 = self::C|get#getter3(c);
self::C|set#setter3(c, c4);
self::C|[]=(c, c5, c1);
}

View file

@ -0,0 +1,107 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */ {
lowered final self::A<self::A|constructor#::T%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
return throw "";
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
return throw "";
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void {}
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
return throw "";
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */ {
lowered final self::B<self::B|constructor#::S%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
return self::A|method<self::B|method2::S%>(#this);
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
return self::A|get#getter<self::B|get#getter2::S%>(#this);
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void {
self::A|set#setter<self::B|set#setter2::S%>(#this, value);
}
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void {
value = self::A|[]<self::B|[]=::S%>(#this, index);
}
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */ {
lowered final self::C /* = core::Object */ #this = i;
return #this;
}
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|method<core::int>(#this);
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|get#getter<core::int>(#this);
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void {
self::A|set#setter<core::int>(#this, value);
}
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void {
value = self::A|[]<core::int>(#this, index);
}
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic {
core::bool a1 = self::A|method<core::bool>(a);
core::bool a2 = self::A|get#getter<core::bool>(a);
self::A|set#setter<core::bool>(a, a1);
core::bool a3 = self::A|[]<core::bool>(a, a2);
core::String b1 = self::A|method<core::String>(b);
core::String b2 = self::A|get#getter<core::String>(b);
self::A|set#setter<core::String>(b, b1);
core::String b3 = self::A|[]<core::String>(b, b2);
core::String b4 = self::B|method2<core::String>(b);
core::String b5 = self::B|get#getter2<core::String>(b);
self::B|set#setter2<core::String>(b, b4);
self::B|[]=<core::String>(b, b5, b1);
core::int c1 = self::A|method<core::int>(c);
core::int c2 = self::A|get#getter<core::int>(c);
self::A|set#setter<core::int>(c, c1);
core::int c3 = self::A|[]<core::int>(c, c2);
core::int c4 = self::C|method3(c);
core::int c5 = self::C|get#getter3(c);
self::C|set#setter3(c, c4);
self::C|[]=(c, c5, c1);
}

View file

@ -0,0 +1,19 @@
extension type A<T>(Object it) {
T method() => throw '';
T get getter => throw '';
void set setter(T value) {}
T operator[] (T index) => throw '';
}
extension type B<S>(Object it) implements A<S> {
S method2() => method();
S get getter2 => getter;
void set setter2(S value) {}
void operator[]= (S index, S value) {}
}
extension type C(Object i) implements A<int> {
int method3() => method();
int get getter3 => getter;
void set setter3(int value) {}
void operator[]= (int index, int value) {}
}
test(A<bool> a, B<String> b, C c) {}

View file

@ -0,0 +1,19 @@
extension type A<T>(Object it) {
T get getter => throw '';
T method() => throw '';
T operator[] (T index) => throw '';
void set setter(T value) {}
}
extension type B<S>(Object it) implements A<S> {
S get getter2 => getter;
S method2() => method();
void operator[]= (S index, S value) {}
void set setter2(S value) {}
}
extension type C(Object i) implements A<int> {
int get getter3 => getter;
int method3() => method();
void operator[]= (int index, int value) {}
void set setter3(int value) {}
}
test(A<bool> a, B<String> b, C c) {}

View file

@ -0,0 +1,107 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */ {
lowered final self::A<self::A|constructor#::T%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
return throw "";
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
return throw "";
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void {}
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
return throw "";
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */ {
lowered final self::B<self::B|constructor#::S%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
return self::A|method<self::B|method2::S%>(#this);
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
return self::A|get#getter<self::B|get#getter2::S%>(#this);
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void {
self::A|set#setter<self::B|set#setter2::S%>(#this, value);
}
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void {
value = self::A|[]<self::B|[]=::S%>(#this, index);
}
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */ {
lowered final self::C /* = core::Object */ #this = i;
return #this;
}
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|method<core::int>(#this);
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|get#getter<core::int>(#this);
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void {
self::A|set#setter<core::int>(#this, value);
}
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void {
value = self::A|[]<core::int>(#this, index);
}
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic {
core::bool a1 = self::A|method<core::bool>(a);
core::bool a2 = self::A|get#getter<core::bool>(a);
self::A|set#setter<core::bool>(a, a1);
core::bool a3 = self::A|[]<core::bool>(a, a2);
core::String b1 = self::A|method<core::String>(b);
core::String b2 = self::A|get#getter<core::String>(b);
self::A|set#setter<core::String>(b, b1);
core::String b3 = self::A|[]<core::String>(b, b2);
core::String b4 = self::B|method2<core::String>(b);
core::String b5 = self::B|get#getter2<core::String>(b);
self::B|set#setter2<core::String>(b, b4);
self::B|[]=<core::String>(b, b5, b1);
core::int c1 = self::A|method<core::int>(c);
core::int c2 = self::A|get#getter<core::int>(c);
self::A|set#setter<core::int>(c, c1);
core::int c3 = self::A|[]<core::int>(c, c2);
core::int c4 = self::C|method3(c);
core::int c5 = self::C|get#getter3(c);
self::C|set#setter3(c, c4);
self::C|[]=(c, c5, c1);
}

View file

@ -0,0 +1,107 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */ {
lowered final self::A<self::A|constructor#::T%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
return throw "";
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
return throw "";
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void {}
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
return throw "";
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */ {
lowered final self::B<self::B|constructor#::S%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
return self::A|method<self::B|method2::S%>(#this);
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
return self::A|get#getter<self::B|get#getter2::S%>(#this);
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void {
self::A|set#setter<self::B|set#setter2::S%>(#this, value);
}
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void {
value = self::A|[]<self::B|[]=::S%>(#this, index);
}
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */ {
lowered final self::C /* = core::Object */ #this = i;
return #this;
}
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|method<core::int>(#this);
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|get#getter<core::int>(#this);
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void {
self::A|set#setter<core::int>(#this, value);
}
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void {
value = self::A|[]<core::int>(#this, index);
}
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic {
core::bool a1 = self::A|method<core::bool>(a);
core::bool a2 = self::A|get#getter<core::bool>(a);
self::A|set#setter<core::bool>(a, a1);
core::bool a3 = self::A|[]<core::bool>(a, a2);
core::String b1 = self::A|method<core::String>(b);
core::String b2 = self::A|get#getter<core::String>(b);
self::A|set#setter<core::String>(b, b1);
core::String b3 = self::A|[]<core::String>(b, b2);
core::String b4 = self::B|method2<core::String>(b);
core::String b5 = self::B|get#getter2<core::String>(b);
self::B|set#setter2<core::String>(b, b4);
self::B|[]=<core::String>(b, b5, b1);
core::int c1 = self::A|method<core::int>(c);
core::int c2 = self::A|get#getter<core::int>(c);
self::A|set#setter<core::int>(c, c1);
core::int c3 = self::A|[]<core::int>(c, c2);
core::int c4 = self::C|method3(c);
core::int c5 = self::C|get#getter3(c);
self::C|set#setter3(c, c4);
self::C|[]=(c, c5, c1);
}

View file

@ -0,0 +1,78 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */
;
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
;
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
;
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void
;
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
;
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */
;
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
;
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
;
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void
;
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void
;
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */
;
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
;
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
;
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void
;
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void
;
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic
;

View file

@ -0,0 +1,107 @@
library;
import self as self;
import "dart:core" as core;
extension type A<T extends core::Object? = dynamic>(core::Object it) {
abstract inline-class-member representation-field get it() → core::Object;
method method = self::A|method;
method tearoff method = self::A|get#method;
get getter = self::A|get#getter;
operator [] = self::A|[];
set setter = self::A|set#setter;
constructor • = self::A|constructor#;
constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B<S extends core::Object? = dynamic>(core::Object it) implements self::A<S%> /* = core::Object */ {
abstract inline-class-member representation-field get it() → core::Object;
method method2 = self::B|method2;
method tearoff method2 = self::B|get#method2;
get getter2 = self::B|get#getter2;
operator []= = self::B|[]=;
set setter2 = self::B|set#setter2;
constructor • = self::B|constructor#;
constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::Object i) implements self::A<core::int> /* = core::Object */ {
abstract inline-class-member representation-field get i() → core::Object;
method method3 = self::C|method3;
method tearoff method3 = self::C|get#method3;
get getter3 = self::C|get#getter3;
operator []= = self::C|[]=;
set setter3 = self::C|set#setter3;
constructor • = self::C|constructor#;
constructor tearoff • = self::C|constructor#_#new#tearOff;
}
static inline-class-member method A|constructor#<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#::T%> /* = core::Object */ {
lowered final self::A<self::A|constructor#::T%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method A|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Object it) → self::A<self::A|constructor#_#new#tearOff::T%> /* = core::Object */
return self::A|constructor#<self::A|constructor#_#new#tearOff::T%>(it);
static inline-class-member method A|method<T extends core::Object? = dynamic>(lowered final self::A<self::A|method::T%> /* = core::Object */ #this) → self::A|method::T%
return throw "";
static inline-class-member method A|get#method<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#method::T%> /* = core::Object */ #this) → () → self::A|get#method::T%
return () → self::A|get#method::T% => self::A|method<self::A|get#method::T%>(#this);
static inline-class-member method A|get#getter<T extends core::Object? = dynamic>(lowered final self::A<self::A|get#getter::T%> /* = core::Object */ #this) → self::A|get#getter::T%
return throw "";
static inline-class-member method A|set#setter<T extends core::Object? = dynamic>(lowered final self::A<self::A|set#setter::T%> /* = core::Object */ #this, self::A|set#setter::T% value) → void {}
static inline-class-member method A|[]<T extends core::Object? = dynamic>(lowered final self::A<self::A|[]::T%> /* = core::Object */ #this, self::A|[]::T% index) → self::A|[]::T%
return throw "";
static inline-class-member method B|constructor#<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#::S%> /* = core::Object */ {
lowered final self::B<self::B|constructor#::S%> /* = core::Object */ #this = it;
return #this;
}
static inline-class-member method B|constructor#_#new#tearOff<S extends core::Object? = dynamic>(core::Object it) → self::B<self::B|constructor#_#new#tearOff::S%> /* = core::Object */
return self::B|constructor#<self::B|constructor#_#new#tearOff::S%>(it);
static inline-class-member method B|method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|method2::S%> /* = core::Object */ #this) → self::B|method2::S%
return self::A|method<self::B|method2::S%>(#this);
static inline-class-member method B|get#method2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#method2::S%> /* = core::Object */ #this) → () → self::B|get#method2::S%
return () → self::B|get#method2::S% => self::B|method2<self::B|get#method2::S%>(#this);
static inline-class-member method B|get#getter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|get#getter2::S%> /* = core::Object */ #this) → self::B|get#getter2::S%
return self::A|get#getter<self::B|get#getter2::S%>(#this);
static inline-class-member method B|set#setter2<S extends core::Object? = dynamic>(lowered final self::B<self::B|set#setter2::S%> /* = core::Object */ #this, self::B|set#setter2::S% value) → void {
self::A|set#setter<self::B|set#setter2::S%>(#this, value);
}
static inline-class-member method B|[]=<S extends core::Object? = dynamic>(lowered final self::B<self::B|[]=::S%> /* = core::Object */ #this, self::B|[]=::S% index, self::B|[]=::S% value) → void {
value = self::A|[]<self::B|[]=::S%>(#this, index);
}
static inline-class-member method C|constructor#(core::Object i) → self::C /* = core::Object */ {
lowered final self::C /* = core::Object */ #this = i;
return #this;
}
static inline-class-member method C|constructor#_#new#tearOff(core::Object i) → self::C /* = core::Object */
return self::C|constructor#(i);
static inline-class-member method C|method3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|method<core::int>(#this);
static inline-class-member method C|get#method3(lowered final self::C /* = core::Object */ #this) → () → core::int
return () → core::int => self::C|method3(#this);
static inline-class-member method C|get#getter3(lowered final self::C /* = core::Object */ #this) → core::int
return self::A|get#getter<core::int>(#this);
static inline-class-member method C|set#setter3(lowered final self::C /* = core::Object */ #this, core::int value) → void {
self::A|set#setter<core::int>(#this, value);
}
static inline-class-member method C|[]=(lowered final self::C /* = core::Object */ #this, core::int index, core::int value) → void {
value = self::A|[]<core::int>(#this, index);
}
static method test(self::A<core::bool> /* = core::Object */ a, self::B<core::String> /* = core::Object */ b, self::C /* = core::Object */ c) → dynamic {
core::bool a1 = self::A|method<core::bool>(a);
core::bool a2 = self::A|get#getter<core::bool>(a);
self::A|set#setter<core::bool>(a, a1);
core::bool a3 = self::A|[]<core::bool>(a, a2);
core::String b1 = self::A|method<core::String>(b);
core::String b2 = self::A|get#getter<core::String>(b);
self::A|set#setter<core::String>(b, b1);
core::String b3 = self::A|[]<core::String>(b, b2);
core::String b4 = self::B|method2<core::String>(b);
core::String b5 = self::B|get#getter2<core::String>(b);
self::B|set#setter2<core::String>(b, b4);
self::B|[]=<core::String>(b, b5, b1);
core::int c1 = self::A|method<core::int>(c);
core::int c2 = self::A|get#getter<core::int>(c);
self::A|set#setter<core::int>(c, c1);
core::int c3 = self::A|[]<core::int>(c, c2);
core::int c4 = self::C|method3(c);
core::int c5 = self::C|get#getter3(c);
self::C|set#setter3(c, c4);
self::C|[]=(c, c5, c1);
}