[cfe] Handle external extension instance fields

Change-Id: Ia6d397e2be3cc46f252b679007f6f7b45096420f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212569
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2021-09-06 15:52:39 +00:00 committed by commit-bot@chromium.org
parent 2b41685519
commit 8f270ea432
32 changed files with 804 additions and 338 deletions

View file

@ -36,6 +36,8 @@ abstract class Builder {
bool get isGetter;
bool get isExternal;
/// Returns `true` if this builder is an extension declaration.
///
/// For instance `B` in:
@ -276,6 +278,9 @@ abstract class BuilderImpl implements Builder {
@override
bool get isStatic => false;
@override
bool get isExternal => false;
@override
bool get isSynthetic => false;

View file

@ -55,8 +55,8 @@ import '../modifier.dart'
import '../scope.dart';
import '../source/name_scheme.dart';
import '../source/source_class_builder.dart' show SourceClassBuilder;
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
import 'builder.dart';
@ -189,7 +189,7 @@ class EnumBuilder extends SourceClassBuilder {
/// String toString() => _name;
/// }
FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
NameScheme instanceFieldNameScheme = new NameScheme(
isInstanceMember: true,
className: name,
isExtensionMember: false,
@ -198,7 +198,7 @@ class EnumBuilder extends SourceClassBuilder {
? referencesFromIndexed.library.reference
: parent.library.reference);
FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
NameScheme staticFieldNameScheme = new NameScheme(
isInstanceMember: false,
className: name,
isExtensionMember: false,
@ -207,8 +207,9 @@ class EnumBuilder extends SourceClassBuilder {
? referencesFromIndexed.library.reference
: parent.library.reference);
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
isStatic: false,
NameScheme procedureNameScheme = new NameScheme(
isInstanceMember: true,
className: name,
isExtensionMember: false,
extensionName: null,
libraryReference: referencesFromIndexed != null
@ -254,7 +255,6 @@ class EnumBuilder extends SourceClassBuilder {
charOffset,
charOffset,
instanceFieldNameScheme,
isInstanceMember: true,
fieldGetterReference: indexGetterReference,
fieldSetterReference: indexSetterReference);
members["index"] = indexBuilder;
@ -268,7 +268,6 @@ class EnumBuilder extends SourceClassBuilder {
charOffset,
charOffset,
instanceFieldNameScheme,
isInstanceMember: true,
fieldGetterReference: _nameGetterReference,
fieldSetterReference: _nameSetterReference);
members["_name"] = nameBuilder;
@ -302,7 +301,6 @@ class EnumBuilder extends SourceClassBuilder {
charOffset,
charOffset,
staticFieldNameScheme,
isInstanceMember: false,
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
members["values"] = valuesBuilder;
@ -384,7 +382,6 @@ class EnumBuilder extends SourceClassBuilder {
enumConstantInfo.charOffset,
enumConstantInfo.charOffset,
staticFieldNameScheme,
isInstanceMember: false,
fieldGetterReference: getterReference,
fieldSetterReference: setterReference);
members[name] = fieldBuilder..next = existing;

View file

@ -15,6 +15,7 @@ import '../util/helpers.dart';
import 'builder.dart';
import 'declaration_builder.dart';
import 'field_builder.dart';
import 'library_builder.dart';
import 'member_builder.dart';
import 'metadata_builder.dart';
@ -181,9 +182,21 @@ abstract class ExtensionBuilderImpl extends DeclarationBuilderImpl
{bool setter: false, bool required: false}) {
Builder? builder =
lookupLocalMember(name.text, setter: setter, required: required);
if (builder == null && setter) {
// When looking up setters, we include assignable fields.
builder = lookupLocalMember(name.text, setter: false, required: required);
if (builder is! FieldBuilder || !builder.isAssignable) {
builder = null;
}
}
if (builder != null) {
if (name.isPrivate && library.library != name.library) {
builder = null;
} else if (builder is FieldBuilder &&
!builder.isStatic &&
!builder.isExternal) {
// Non-external extension instance fields are invalid.
builder = null;
} else if (builder.isDuplicate) {
// Duplicates are not visible in the instance scope.
builder = null;

View file

@ -23,6 +23,7 @@ import '../messages.dart'
import '../problems.dart' show unexpected, unhandled;
import '../source/name_scheme.dart';
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
import '../type_inference/type_inferrer.dart';
@ -36,7 +37,6 @@ import 'formal_parameter_builder.dart';
import 'function_builder.dart';
import 'member_builder.dart';
import 'metadata_builder.dart';
import 'procedure_builder.dart';
import 'type_builder.dart';
import 'type_variable_builder.dart';
@ -67,10 +67,10 @@ class SourceFactoryBuilder extends FunctionBuilderImpl {
int charEndOffset,
Reference? procedureReference,
AsyncMarker asyncModifier,
ProcedureNameScheme procedureNameScheme,
NameScheme nameScheme,
{String? nativeMethodName})
: _procedureInternal = new Procedure(
procedureNameScheme.getName(ProcedureKind.Factory, name),
nameScheme.getProcedureName(ProcedureKind.Factory, name),
ProcedureKind.Factory,
new FunctionNode(null),
fileUri: libraryBuilder.fileUri,
@ -273,7 +273,7 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
int charOpenParenOffset,
int charEndOffset,
Reference? procedureReference,
ProcedureNameScheme procedureNameScheme,
NameScheme nameScheme,
String? nativeMethodName,
this.redirectionTarget)
: super(
@ -290,7 +290,7 @@ class RedirectingFactoryBuilder extends SourceFactoryBuilder {
charEndOffset,
procedureReference,
AsyncMarker.Sync,
procedureNameScheme,
nameScheme,
nativeMethodName: nativeMethodName);
@override

View file

@ -9,6 +9,7 @@ import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/type_algebra.dart';
import '../constant_context.dart' show ConstantContext;
@ -27,8 +28,9 @@ import '../problems.dart' show internalProblem;
import '../scope.dart' show Scope;
import '../source/name_scheme.dart';
import '../source/source_extension_builder.dart';
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
import '../source/source_loader.dart' show SourceLoader;
import '../type_inference/type_inference_engine.dart'
@ -117,9 +119,8 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
SourceLibraryBuilder libraryBuilder,
int charOffset,
int charEndOffset,
FieldNameScheme fieldNameScheme,
{required bool isInstanceMember,
Reference? fieldGetterReference,
NameScheme fieldNameScheme,
{Reference? fieldGetterReference,
Reference? fieldSetterReference,
Reference? lateIsSetGetterReference,
Reference? lateIsSetSetterReference,
@ -128,8 +129,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
Token? constInitializerToken})
: _constInitializerToken = constInitializerToken,
super(libraryBuilder, charOffset) {
// ignore: unnecessary_null_comparison
assert(isInstanceMember != null);
bool isInstanceMember = fieldNameScheme.isInstanceMember;
Uri fileUri = libraryBuilder.fileUri;
// If in mixed mode, late lowerings cannot use `null` as a sentinel on
@ -143,6 +143,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
assert(lateGetterReference == null);
assert(lateSetterReference == null);
_fieldEncoding = new AbstractOrExternalFieldEncoding(
this,
name,
fieldNameScheme,
fileUri,
@ -393,7 +394,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
// notInstanceContext is set to true for extension fields as they
// ultimately become static.
fieldType = type!.build(libraryBuilder,
nonInstanceContext: isStatic || isExtensionMember);
nonInstanceContext: isStatic || (isExtensionMember && !isExternal));
}
_fieldEncoding.build(libraryBuilder, this);
}
@ -520,86 +521,6 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
@override
List<ClassMember> get localSetters =>
_localSetters ??= _fieldEncoding.getLocalSetters(this);
static String createFieldName(FieldNameType type, String name,
{required bool isInstanceMember,
required String? className,
bool isExtensionMethod: false,
String? extensionName,
bool isSynthesized: false}) {
assert(isSynthesized || type == FieldNameType.Field,
"Unexpected field name type for non-synthesized field: $type");
// ignore: unnecessary_null_comparison
assert(isExtensionMethod || isInstanceMember != null,
"`isInstanceMember` is null for class member.");
assert(!(isExtensionMethod && extensionName == null),
"No extension name provided for extension member.");
// ignore: unnecessary_null_comparison
assert(isInstanceMember == null || !(isInstanceMember && className == null),
"No class name provided for instance member.");
String baseName;
if (!isExtensionMethod) {
baseName = name;
} else {
baseName = "${extensionName}|${name}";
}
if (!isSynthesized) {
return baseName;
} else {
String namePrefix = late_lowering.lateFieldPrefix;
if (isInstanceMember) {
namePrefix = '$namePrefix${className}#';
}
switch (type) {
case FieldNameType.Field:
return "$namePrefix$baseName";
case FieldNameType.Getter:
return baseName;
case FieldNameType.Setter:
return baseName;
case FieldNameType.IsSetField:
return "$namePrefix$baseName${late_lowering.lateIsSetSuffix}";
}
}
}
}
enum FieldNameType { Field, Getter, Setter, IsSetField }
class FieldNameScheme {
final bool isInstanceMember;
final String? className;
final bool isExtensionMember;
final String? extensionName;
final Reference? libraryReference;
FieldNameScheme(
{required this.isInstanceMember,
required this.className,
required this.isExtensionMember,
required this.extensionName,
required this.libraryReference})
// ignore: unnecessary_null_comparison
: assert(isInstanceMember != null),
// ignore: unnecessary_null_comparison
assert(isExtensionMember != null),
// ignore: unnecessary_null_comparison
assert(!isExtensionMember || extensionName != null),
// ignore: unnecessary_null_comparison
assert(libraryReference != null);
Name getName(FieldNameType type, String name, {required bool isSynthesized}) {
// ignore: unnecessary_null_comparison
assert(isSynthesized != null);
String text = SourceFieldBuilder.createFieldName(type, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: isSynthesized);
return new Name.byReference(text, libraryReference);
}
}
/// Strategy pattern for creating different encodings of a declared field.
@ -671,8 +592,8 @@ abstract class FieldEncoding {
class RegularFieldEncoding implements FieldEncoding {
late final Field _field;
RegularFieldEncoding(String name, FieldNameScheme fieldNameScheme,
Uri fileUri, int charOffset, int charEndOffset,
RegularFieldEncoding(String name, NameScheme nameScheme, Uri fileUri,
int charOffset, int charEndOffset,
{required bool isFinal,
required bool isConst,
required bool isLate,
@ -692,7 +613,7 @@ class RegularFieldEncoding implements FieldEncoding {
isLate ? (isFinal && hasInitializer) : (isFinal || isConst);
_field = isImmutable
? new Field.immutable(
fieldNameScheme.getName(FieldNameType.Field, name,
nameScheme.getFieldName(FieldNameType.Field, name,
isSynthesized: false),
isFinal: isFinal,
isConst: isConst,
@ -700,7 +621,7 @@ class RegularFieldEncoding implements FieldEncoding {
fileUri: fileUri,
getterReference: getterReference)
: new Field.mutable(
fieldNameScheme.getName(FieldNameType.Field, name,
nameScheme.getFieldName(FieldNameType.Field, name,
isSynthesized: false),
isFinal: isFinal,
isLate: isLate,
@ -883,7 +804,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
AbstractLateFieldEncoding(
this.name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -901,7 +822,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
_forceIncludeIsSetField =
isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
_field = new Field.mutable(
fieldNameScheme.getName(FieldNameType.Field, name, isSynthesized: true),
nameScheme.getFieldName(FieldNameType.Field, name, isSynthesized: true),
fileUri: fileUri,
getterReference: fieldGetterReference,
setterReference: fieldSetterReference)
@ -917,7 +838,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
case late_lowering.IsSetStrategy.forceUseIsSetField:
case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
_lateIsSetField = new Field.mutable(
fieldNameScheme.getName(FieldNameType.IsSetField, name,
nameScheme.getFieldName(FieldNameType.IsSetField, name,
isSynthesized: true),
fileUri: fileUri,
getterReference: lateIsSetGetterReference,
@ -929,7 +850,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
break;
}
_lateGetter = new Procedure(
fieldNameScheme.getName(FieldNameType.Getter, name,
nameScheme.getFieldName(FieldNameType.Getter, name,
isSynthesized: true),
ProcedureKind.Getter,
new FunctionNode(null)
@ -941,7 +862,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
..fileEndOffset = charEndOffset
..isNonNullableByDefault = true;
_lateSetter = _createSetter(
fieldNameScheme.getName(FieldNameType.Setter, name,
nameScheme.getFieldName(FieldNameType.Setter, name,
isSynthesized: true),
fileUri,
charOffset,
@ -1267,7 +1188,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
with NonFinalLate, LateWithoutInitializer {
LateFieldWithoutInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1281,7 +1202,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
nameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1299,7 +1220,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding
with NonFinalLate {
LateFieldWithInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1313,7 +1234,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
nameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1346,7 +1267,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
with LateWithoutInitializer {
LateFinalFieldWithoutInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1360,7 +1281,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
nameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1394,7 +1315,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
LateFinalFieldWithInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1408,7 +1329,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
nameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1595,15 +1516,19 @@ class _SynthesizedFieldClassMember implements ClassMember {
}
class AbstractOrExternalFieldEncoding implements FieldEncoding {
final SourceFieldBuilder _fieldBuilder;
final bool isAbstract;
final bool isExternal;
final bool _isExtensionInstanceMember;
late Procedure _getter;
Procedure? _setter;
DartType? _type;
AbstractOrExternalFieldEncoding(
this._fieldBuilder,
String name,
FieldNameScheme fieldNameScheme,
NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1623,45 +1548,138 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
// ignore: unnecessary_null_comparison
assert(isCovariant != null),
// ignore: unnecessary_null_comparison
assert(isNonNullableByDefault != null) {
_getter = new Procedure(
fieldNameScheme.getName(FieldNameType.Getter, name,
isSynthesized: true),
ProcedureKind.Getter,
new FunctionNode(null),
fileUri: fileUri,
reference: getterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
if (!isFinal) {
VariableDeclaration parameter =
new VariableDeclaration("#externalFieldValue")
..isCovariant = isCovariant
..fileOffset = charOffset;
_setter = new Procedure(
fieldNameScheme.getName(FieldNameType.Setter, name,
isSynthesized: true),
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
assert(isNonNullableByDefault != null),
_isExtensionInstanceMember = isExternal &&
nameScheme.isExtensionMember &&
nameScheme.isInstanceMember {
if (_isExtensionInstanceMember) {
_getter = new Procedure(
nameScheme.getProcedureName(ProcedureKind.Getter, name),
ProcedureKind.Method,
new FunctionNode(null, positionalParameters: [
new VariableDeclaration(extensionThisName)..fileOffset
]),
fileUri: fileUri,
reference: setterReference)
reference: getterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
if (!isFinal) {
VariableDeclaration parameter =
new VariableDeclaration("#externalFieldValue")
..isCovariant = isCovariant
..fileOffset = charOffset;
_setter = new Procedure(
nameScheme.getProcedureName(ProcedureKind.Setter, name),
ProcedureKind.Method,
new FunctionNode(null,
positionalParameters: [
new VariableDeclaration(extensionThisName)..fileOffset,
parameter
],
returnType: const VoidType())
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
fileUri: fileUri,
reference: setterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
}
} else {
_getter = new Procedure(
nameScheme.getFieldName(FieldNameType.Getter, name,
isSynthesized: true),
ProcedureKind.Getter,
new FunctionNode(null),
fileUri: fileUri,
reference: getterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
if (!isFinal) {
VariableDeclaration parameter =
new VariableDeclaration("#externalFieldValue")
..isCovariant = isCovariant
..fileOffset = charOffset;
_setter = new Procedure(
nameScheme.getFieldName(FieldNameType.Setter, name,
isSynthesized: true),
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
fileUri: fileUri,
reference: setterReference)
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = isNonNullableByDefault;
}
}
}
@override
DartType get type => _getter.function.returnType;
DartType get type {
assert(_type != null,
"Type has not been computed for field ${_fieldBuilder.name}.");
return _type!;
}
@override
void set type(DartType value) {
_getter.function.returnType = value;
_setter?.function.positionalParameters.first.type = value;
assert(_type == null || _type is ImplicitFieldType,
"Type has already been computed for field ${_fieldBuilder.name}.");
_type = value;
if (value is! ImplicitFieldType) {
if (_isExtensionInstanceMember) {
SourceExtensionBuilder extensionBuilder =
_fieldBuilder.parent as SourceExtensionBuilder;
DartType onType = extensionBuilder.extension.onType;
List<TypeParameter> typeParameters =
extensionBuilder.extension.typeParameters;
if (typeParameters.isNotEmpty) {
FreshTypeParameters getterTypeParameters =
getFreshTypeParameters(typeParameters);
_getter.function.positionalParameters.first.type =
getterTypeParameters.substitute(onType);
_getter.function.returnType = getterTypeParameters.substitute(value);
_getter.function.typeParameters =
getterTypeParameters.freshTypeParameters;
setParents(
getterTypeParameters.freshTypeParameters, _getter.function);
Procedure? setter = _setter;
if (setter != null) {
FreshTypeParameters setterTypeParameters =
getFreshTypeParameters(typeParameters);
setter.function.positionalParameters.first.type =
setterTypeParameters.substitute(onType);
setter.function.positionalParameters[1].type =
setterTypeParameters.substitute(value);
setter.function.typeParameters =
setterTypeParameters.freshTypeParameters;
setParents(
setterTypeParameters.freshTypeParameters, setter.function);
}
} else {
_getter.function.returnType = value;
_setter?.function.positionalParameters[1].type = value;
_getter.function.positionalParameters.first.type = onType;
_setter?.function.positionalParameters.first.type = onType;
}
} else {
_getter.function.returnType = value;
Procedure? setter = _setter;
if (setter != null) {
if (setter.kind == ProcedureKind.Method) {
setter.function.positionalParameters[1].type = value;
} else {
setter.function.positionalParameters.first.type = value;
}
}
}
}
}
@override

View file

@ -68,6 +68,7 @@ abstract class MemberBuilder implements ModifierBuilder {
// TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
ProcedureKind? get kind;
@override
bool get isExternal;
bool get isAbstract;

View file

@ -276,7 +276,7 @@ class NamedTypeBuilder extends TypeBuilder {
// TODO(johnniwinther): Store [origin] on the built type.
DartType buildInternal(LibraryBuilder library,
{TypedefType? origin,
bool? nonInstanceContext,
required bool? nonInstanceContext,
required bool forTypeLiteral}) {
assert(declaration != null, "Declaration has not been resolved on $this.");
// TODO(johnniwinther): Change `nonInstanceContext == true` to

View file

@ -10,6 +10,7 @@ import '../kernel/member_covariance.dart';
import '../loader.dart' show Loader;
import '../source/name_scheme.dart';
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
import 'builder.dart';
@ -94,7 +95,7 @@ class SourceProcedureBuilder extends FunctionBuilderImpl
Reference? procedureReference,
this._tearOffReference,
AsyncMarker asyncModifier,
ProcedureNameScheme procedureNameScheme,
NameScheme nameScheme,
{required bool isExtensionMember,
required bool isInstanceMember,
String? nativeMethodName})
@ -107,7 +108,7 @@ class SourceProcedureBuilder extends FunctionBuilderImpl
super(metadata, modifiers, returnType, name, typeVariables, formals,
libraryBuilder, charOffset, nativeMethodName) {
_procedure = new Procedure(
procedureNameScheme.getName(kind, name),
nameScheme.getProcedureName(kind, name),
isExtensionInstanceMember ? ProcedureKind.Method : kind,
new FunctionNode(null),
fileUri: libraryBuilder.fileUri,
@ -119,7 +120,7 @@ class SourceProcedureBuilder extends FunctionBuilderImpl
this.asyncModifier = asyncModifier;
if (isExtensionMember && isInstanceMember && kind == ProcedureKind.Method) {
_extensionTearOff ??= new Procedure(
procedureNameScheme.getName(ProcedureKind.Getter, name),
nameScheme.getProcedureName(ProcedureKind.Getter, name),
ProcedureKind.Method,
new FunctionNode(null),
isStatic: true,
@ -310,35 +311,6 @@ class SourceProcedureBuilder extends FunctionBuilderImpl
return _procedure;
}
static String createProcedureName(bool isExtensionMethod, bool isStatic,
ProcedureKind kind, String? extensionName, String name) {
if (isExtensionMethod) {
String kindInfix = '';
if (!isStatic) {
// Instance getter and setter are converted to methods so we use an
// infix to make their names unique.
switch (kind) {
case ProcedureKind.Getter:
kindInfix = 'get#';
break;
case ProcedureKind.Setter:
kindInfix = 'set#';
break;
case ProcedureKind.Method:
case ProcedureKind.Operator:
kindInfix = '';
break;
case ProcedureKind.Factory:
throw new UnsupportedError(
'Unexpected extension method kind ${kind}');
}
}
return '${extensionName}|${kindInfix}${name}';
} else {
return name;
}
}
/// Creates a top level function that creates a tear off of an extension
/// instance method.
///
@ -591,33 +563,3 @@ class SourceProcedureMember extends BuilderClassMember {
memberBuilder == other.memberBuilder;
}
}
class ProcedureNameScheme {
final bool isExtensionMember;
final bool isStatic;
final String? extensionName;
final Reference libraryReference;
ProcedureNameScheme(
{required this.isExtensionMember,
required this.isStatic,
this.extensionName,
required this.libraryReference})
// ignore: unnecessary_null_comparison
: assert(isExtensionMember != null),
// ignore: unnecessary_null_comparison
assert(isStatic != null),
// ignore: unnecessary_null_comparison
assert(!isExtensionMember || extensionName != null),
// ignore: unnecessary_null_comparison
assert(libraryReference != null);
Name getName(ProcedureKind kind, String name) {
// ignore: unnecessary_null_comparison
assert(kind != null);
return new Name.byReference(
SourceProcedureBuilder.createProcedureName(
isExtensionMember, isStatic, kind, extensionName, name),
libraryReference);
}
}

View file

@ -6845,7 +6845,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
builder.declaration as TypeVariableBuilder;
TypeParameter typeParameter = typeParameterBuilder.parameter;
LocatedMessage message;
bool extensionField = member.isExtensionMember && member.isField;
bool extensionField =
member.isExtensionMember && member.isField && !member.isExternal;
if ((extensionField || !isDeclarationInstanceContext) &&
(typeParameter.parent is Class ||
typeParameter.parent is Extension)) {

View file

@ -1942,6 +1942,10 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
assert(!getterBuilder.isStatic);
MemberBuilder memberBuilder = getterBuilder as MemberBuilder;
invokeTarget = memberBuilder.invokeTarget as Procedure?;
} else if (getterBuilder.isField) {
assert(!getterBuilder.isStatic);
MemberBuilder memberBuilder = getterBuilder as MemberBuilder;
readTarget = memberBuilder.invokeTarget as Procedure?;
} else {
return unhandled(
"$getterBuilder (${getterBuilder.runtimeType})",
@ -1959,6 +1963,10 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
assert(!setterBuilder.isStatic);
MemberBuilder memberBuilder = setterBuilder as MemberBuilder;
writeTarget = memberBuilder.writeTarget as Procedure?;
} else if (setterBuilder.isField) {
assert(!setterBuilder.isStatic);
MemberBuilder memberBuilder = setterBuilder as MemberBuilder;
writeTarget = memberBuilder.writeTarget as Procedure?;
} else {
return unhandled(
"$setterBuilder (${setterBuilder.runtimeType})",
@ -2598,7 +2606,7 @@ class ExplicitExtensionAccessGenerator extends Generator {
Generator _createInstanceAccess(Token token, Name name,
{bool isNullAware: false}) {
Builder? getter = extensionBuilder.lookupLocalMemberByName(name);
if (getter != null && (getter.isStatic || getter.isField)) {
if (getter != null && getter.isStatic) {
getter = null;
}
Builder? setter =

View file

@ -67,6 +67,7 @@ import '../messages.dart'
templateSuperclassHasNoDefaultConstructor;
import '../problems.dart' show unhandled;
import '../scope.dart' show AmbiguousBuilder;
import '../source/name_scheme.dart';
import '../source/source_class_builder.dart' show SourceClassBuilder;
import '../source/source_library_builder.dart'
show LanguageVersion, SourceLibraryBuilder;
@ -1185,7 +1186,7 @@ class KernelTarget extends TargetImplementation {
assert(() {
Set<String> patchFieldNames = {};
builder.forEachDeclaredField((String name, FieldBuilder fieldBuilder) {
patchFieldNames.add(SourceFieldBuilder.createFieldName(
patchFieldNames.add(NameScheme.createFieldName(
FieldNameType.Field,
name,
isInstanceMember: fieldBuilder.isClassInstanceMember,

View file

@ -0,0 +1,137 @@
// Copyright (c) 2021, 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.
import 'package:kernel/ast.dart';
import '../kernel/late_lowering.dart' as late_lowering;
enum FieldNameType { Field, Getter, Setter, IsSetField }
class NameScheme {
final bool isInstanceMember;
final String? className;
final bool isExtensionMember;
final String? extensionName;
final Reference? libraryReference;
NameScheme(
{required this.isInstanceMember,
required this.className,
required this.isExtensionMember,
required this.extensionName,
required this.libraryReference})
// ignore: unnecessary_null_comparison
: assert(isInstanceMember != null),
// ignore: unnecessary_null_comparison
assert(isExtensionMember != null),
// ignore: unnecessary_null_comparison
assert(!isExtensionMember || extensionName != null),
// ignore: unnecessary_null_comparison
assert(libraryReference != null);
bool get isStatic => !isInstanceMember;
Name getFieldName(FieldNameType type, String name,
{required bool isSynthesized}) {
// ignore: unnecessary_null_comparison
assert(isSynthesized != null);
String text = createFieldName(type, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: isSynthesized);
return new Name.byReference(text, libraryReference);
}
static String createFieldName(FieldNameType type, String name,
{required bool isInstanceMember,
required String? className,
bool isExtensionMethod: false,
String? extensionName,
bool isSynthesized: false}) {
assert(isSynthesized || type == FieldNameType.Field,
"Unexpected field name type for non-synthesized field: $type");
// ignore: unnecessary_null_comparison
assert(isExtensionMethod || isInstanceMember != null,
"`isInstanceMember` is null for class member.");
assert(!(isExtensionMethod && extensionName == null),
"No extension name provided for extension member.");
// ignore: unnecessary_null_comparison
assert(isInstanceMember == null || !(isInstanceMember && className == null),
"No class name provided for instance member.");
String baseName;
if (!isExtensionMethod) {
baseName = name;
} else {
baseName = "${extensionName}|${name}";
}
if (!isSynthesized) {
return baseName;
} else {
String namePrefix = late_lowering.lateFieldPrefix;
if (isInstanceMember) {
namePrefix = '$namePrefix${className}#';
}
switch (type) {
case FieldNameType.Field:
return "$namePrefix$baseName";
case FieldNameType.Getter:
return baseName;
case FieldNameType.Setter:
return baseName;
case FieldNameType.IsSetField:
return "$namePrefix$baseName${late_lowering.lateIsSetSuffix}";
}
}
}
Name getProcedureName(ProcedureKind kind, String name) {
// ignore: unnecessary_null_comparison
assert(kind != null);
return new Name.byReference(
createProcedureName(
isExtensionMethod: isExtensionMember,
isStatic: isStatic,
kind: kind,
extensionName: extensionName,
name: name),
libraryReference);
}
static String createProcedureName(
{required bool isExtensionMethod,
required bool isStatic,
required ProcedureKind kind,
String? extensionName,
required String name}) {
if (isExtensionMethod) {
assert(extensionName != null);
String kindInfix = '';
if (!isStatic) {
// Instance getter and setter are converted to methods so we use an
// infix to make their names unique.
switch (kind) {
case ProcedureKind.Getter:
kindInfix = 'get#';
break;
case ProcedureKind.Setter:
kindInfix = 'set#';
break;
case ProcedureKind.Method:
case ProcedureKind.Operator:
kindInfix = '';
break;
case ProcedureKind.Factory:
throw new UnsupportedError(
'Unexpected extension method kind ${kind}');
}
}
return '${extensionName}|${kindInfix}${name}';
} else {
return name;
}
}
}

View file

@ -93,6 +93,8 @@ class SourceExtensionBuilder extends ExtensionBuilderImpl {
Extension build(
SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary,
{required bool addMembersToLibrary}) {
_extension.onType = onType.build(libraryBuilder);
SourceLibraryBuilder.checkMemberConflicts(library, scope,
checkForInstanceVsStaticConflict: true,
checkForMethodVsSetterConflict: true);
@ -191,8 +193,6 @@ class SourceExtensionBuilder extends ExtensionBuilderImpl {
scope.forEach(buildBuilders);
_extension.onType = onType.build(libraryBuilder);
return _extension;
}

View file

@ -122,12 +122,10 @@ import '../scope.dart';
import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
import 'name_scheme.dart';
import 'source_class_builder.dart' show SourceClassBuilder;
import 'source_extension_builder.dart' show SourceExtensionBuilder;
import 'source_loader.dart' show SourceLoader;
import 'source_type_alias_builder.dart';
class SourceLibraryBuilder extends LibraryBuilderImpl {
@ -2227,7 +2225,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
Reference? lateGetterReference;
Reference? lateSetterReference;
FieldNameScheme fieldNameScheme = new FieldNameScheme(
NameScheme nameScheme = new NameScheme(
isInstanceMember: isInstanceMember,
className: className,
isExtensionMember: isExtensionMember,
@ -2236,14 +2234,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
if (referencesFrom != null) {
IndexedContainer indexedContainer =
(_currentClassReferencesFromIndexed ?? referencesFromIndexed)!;
Name nameToLookupName = fieldNameScheme.getName(FieldNameType.Field, name,
Name nameToLookupName = nameScheme.getFieldName(FieldNameType.Field, name,
isSynthesized: fieldIsLateWithLowering);
fieldGetterReference =
indexedContainer.lookupGetterReference(nameToLookupName);
fieldSetterReference =
indexedContainer.lookupSetterReference(nameToLookupName);
if (fieldIsLateWithLowering) {
Name lateIsSetNameName = fieldNameScheme.getName(
Name lateIsSetNameName = nameScheme.getFieldName(
FieldNameType.IsSetField, name,
isSynthesized: fieldIsLateWithLowering);
lateIsSetGetterReference =
@ -2251,10 +2249,10 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
lateIsSetSetterReference =
indexedContainer.lookupSetterReference(lateIsSetNameName);
lateGetterReference = indexedContainer.lookupGetterReference(
fieldNameScheme.getName(FieldNameType.Getter, name,
nameScheme.getFieldName(FieldNameType.Getter, name,
isSynthesized: fieldIsLateWithLowering));
lateSetterReference = indexedContainer.lookupSetterReference(
fieldNameScheme.getName(FieldNameType.Setter, name,
nameScheme.getFieldName(FieldNameType.Setter, name,
isSynthesized: fieldIsLateWithLowering));
}
}
@ -2268,8 +2266,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
this,
charOffset,
charEndOffset,
fieldNameScheme,
isInstanceMember: isInstanceMember,
nameScheme,
fieldGetterReference: fieldGetterReference,
fieldSetterReference: fieldSetterReference,
lateIsSetGetterReference: lateIsSetGetterReference,
@ -2371,12 +2368,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
assert(!isExtensionMember ||
currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration);
String? className = (isInstanceMember && !isExtensionMember)
? currentTypeParameterScopeBuilder.name
: null;
String? extensionName =
isExtensionMember ? currentTypeParameterScopeBuilder.name : null;
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
NameScheme nameScheme = new NameScheme(
isExtensionMember: isExtensionMember,
className: className,
extensionName: extensionName,
isStatic: !isInstanceMember,
isInstanceMember: isInstanceMember,
libraryReference: referencesFrom?.reference ?? library.reference);
if (returnType == null) {
@ -2390,7 +2391,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
Reference? procedureReference;
Reference? tearOffReference;
if (referencesFrom != null) {
Name nameToLookup = procedureNameScheme.getName(kind, name);
Name nameToLookup = nameScheme.getProcedureName(kind, name);
if (_currentClassReferencesFromIndexed != null) {
if (kind == ProcedureKind.Setter) {
procedureReference = _currentClassReferencesFromIndexed!
@ -2411,7 +2412,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
}
if (isExtensionMember && kind == ProcedureKind.Method) {
tearOffReference = referencesFromIndexed!.lookupGetterReference(
procedureNameScheme.getName(ProcedureKind.Getter, name));
nameScheme.getProcedureName(ProcedureKind.Getter, name));
}
}
}
@ -2431,7 +2432,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
procedureReference,
tearOffReference,
asyncModifier,
procedureNameScheme,
nameScheme,
isExtensionMember: isExtensionMember,
isInstanceMember: isInstanceMember,
nativeMethodName: nativeMethodName);
@ -2474,10 +2475,11 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
procedureName = name as String;
}
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
NameScheme procedureNameScheme = new NameScheme(
isExtensionMember: false,
className: null,
extensionName: null,
isStatic: true,
isInstanceMember: false,
libraryReference: referencesFrom != null
? (_currentClassReferencesFromIndexed ?? referencesFromIndexed)!
.library

View file

@ -106,8 +106,6 @@ import '../loader.dart' show Loader, untranslatableUriScheme;
import '../problems.dart' show internalProblem;
import '../source/stack_listener_impl.dart' show offsetForToken;
import '../type_inference/type_inference_engine.dart';
import '../type_inference/type_inferrer.dart';
@ -115,10 +113,12 @@ import '../util/helpers.dart';
import 'diet_listener.dart' show DietListener;
import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
import 'name_scheme.dart';
import 'outline_builder.dart' show OutlineBuilder;
import 'source_class_builder.dart' show SourceClassBuilder;
import 'source_library_builder.dart' show SourceLibraryBuilder;
import 'source_type_alias_builder.dart';
import 'stack_listener_impl.dart' show offsetForToken;
class SourceLoader extends Loader {
/// The [FileSystem] which should be used to access files.
@ -551,9 +551,11 @@ class SourceLoader extends Loader {
null,
null,
AsyncMarker.Sync,
new ProcedureNameScheme(
new NameScheme(
className: null,
extensionName: null,
isExtensionMember: false,
isStatic: true,
isInstanceMember: false,
libraryReference: libraryBuilder.library.reference),
isInstanceMember: false,
isExtensionMember: false)

View file

@ -1039,22 +1039,31 @@ class TypeInferrerImpl implements TypeInferrer {
if (typeSchemaEnvironment.isSubtypeOf(
receiverType, onType, SubtypeCheckMode.withNullabilities)) {
ObjectAccessTarget target = const ObjectAccessTarget.missing();
if (thisBuilder != null && !thisBuilder.isStatic) {
if (thisBuilder.isField) {
if (thisBuilder.isExternal) {
target = new ObjectAccessTarget.extensionMember(
setter ? thisBuilder.writeTarget! : thisBuilder.readTarget!,
thisBuilder.readTarget,
setter ? ProcedureKind.Setter : ProcedureKind.Getter,
inferredTypeArguments,
isPotentiallyNullable: isPotentiallyNullableAccess);
}
} else {
target = new ObjectAccessTarget.extensionMember(
setter ? thisBuilder.writeTarget! : thisBuilder.invokeTarget!,
thisBuilder.readTarget,
thisBuilder.kind!,
inferredTypeArguments,
isPotentiallyNullable: isPotentiallyNullableAccess);
}
}
ExtensionAccessCandidate candidate = new ExtensionAccessCandidate(
(thisBuilder ?? otherBuilder)!,
onType,
onTypeInstantiateToBounds,
thisBuilder != null &&
!thisBuilder.isField &&
!thisBuilder.isStatic
? new ObjectAccessTarget.extensionMember(
setter
? thisBuilder.writeTarget!
: thisBuilder.invokeTarget!,
thisBuilder.readTarget,
thisBuilder.kind!,
inferredTypeArguments,
isPotentiallyNullable: isPotentiallyNullableAccess)
: const ObjectAccessTarget.missing(),
target,
isPlatform: extensionBuilder.library.importUri.scheme == 'dart');
if (noneMoreSpecific.isNotEmpty) {
bool isMostSpecific = true;

View file

@ -0,0 +1,63 @@
// Copyright (c) 2021, 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 Extension<T extends num> on List<T> {
external T field;
external static int staticField;
external final T finalField;
external static final int staticFinalField;
external T method();
external static int staticMethod();
external T get getter;
external static int get staticGetter;
external void set setter(T value);
external static void set staticSetter(int value);
external T get property;
external void set property(T value);
external static int get staticProperty;
external static void set staticProperty(int value);
external final T fieldSetter;
external void set fieldSetter(T value);
external static final int staticFieldSetter;
external static void set staticFieldSetter(int value);
}
test() {
List<int> list = [];
int value = list.field;
list.field = value;
value = list.finalField;
value = list.method();
value = list.getter;
list.setter = value;
value = list.property;
list.property = value;
value = list.fieldSetter;
list.fieldSetter = value;
List<int> iterable = list;
num n = Extension<num>(iterable).field;
Extension<num>(iterable).field = n;
n = Extension<num>(iterable).finalField;
n = Extension<num>(iterable).method();
n = Extension<num>(iterable).getter;
Extension<num>(iterable).setter = n;
n = Extension<num>(iterable).property;
Extension<num>(iterable).property = n;
n = Extension<num>(iterable).fieldSetter;
Extension<num>(iterable).fieldSetter = n;
value = Extension.staticField;
Extension.staticField = value;
value = Extension.staticFinalField;
value = Extension.staticMethod();
value = Extension.staticGetter;
Extension.staticSetter = value;
value = Extension.staticProperty;
Extension.staticProperty = value;
value = Extension.staticFieldSetter;
Extension.staticFieldSetter = value;
}
main() {}

View file

@ -0,0 +1,23 @@
extension Extension<T extends num> on List<T> {
external T field;
external static int staticField;
external final T finalField;
external static final int staticFinalField;
external T method();
external static int staticMethod();
external T get getter;
external static int get staticGetter;
external void set setter(T value);
external static void set staticSetter(int value);
external T get property;
external void set property(T value);
external static int get staticProperty;
external static void set staticProperty(int value);
external final T fieldSetter;
external void set fieldSetter(T value);
external static final int staticFieldSetter;
external static void set staticFieldSetter(int value);
}
test() {}
main() {}

View file

@ -0,0 +1,23 @@
extension Extension<T extends num> on List<T> {
external T field;
external T get getter;
external T get property;
external T method();
external final T fieldSetter;
external final T finalField;
external static final int staticFieldSetter;
external static final int staticFinalField;
external static int get staticGetter;
external static int get staticProperty;
external static int staticField;
external static int staticMethod();
external static void set staticFieldSetter(int value);
external static void set staticProperty(int value);
external static void set staticSetter(int value);
external void set fieldSetter(T value);
external void set property(T value);
external void set setter(T value);
}
main() {}
test() {}

View file

@ -0,0 +1,84 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
extension Extension<T extends core::num> on core::List<T> {
get field = self::Extension|get#field;
set field = self::Extension|set#field;
static get staticField = get self::Extension|staticField;
static set staticField = set self::Extension|staticField;
get finalField = self::Extension|get#finalField;
static get staticFinalField = get self::Extension|staticFinalField;
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
static method staticMethod = self::Extension|staticMethod;
get getter = self::Extension|get#getter;
static get staticGetter = get self::Extension|staticGetter;
get property = self::Extension|get#property;
static get staticProperty = get self::Extension|staticProperty;
get fieldSetter = self::Extension|get#fieldSetter;
static get staticFieldSetter = get self::Extension|staticFieldSetter;
set setter = self::Extension|set#setter;
static set staticSetter = set self::Extension|staticSetter;
set property = self::Extension|set#property;
static set staticProperty = set self::Extension|staticProperty;
set fieldSetter = self::Extension|set#fieldSetter;
static set staticFieldSetter = set self::Extension|staticFieldSetter;
}
external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
external static get Extension|staticField() → core::int;
external static set Extension|staticField(core::int #externalFieldValue) → void;
external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
external static get Extension|staticFinalField() → core::int;
external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
external static method Extension|staticMethod() → core::int;
external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
external static get Extension|staticGetter() → core::int;
external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
external static set Extension|staticSetter(core::int value) → void;
external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
external static get Extension|staticProperty() → core::int;
external static set Extension|staticProperty(core::int value) → void;
external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
external static get Extension|staticFieldSetter() → core::int;
external static set Extension|staticFieldSetter(core::int value) → void;
static method test() → dynamic {
core::List<core::int> list = <core::int>[];
core::int value = self::Extension|get#field<core::int>(list);
self::Extension|set#field<core::int>(list, value);
value = self::Extension|get#finalField<core::int>(list);
value = self::Extension|method<core::int>(list);
value = self::Extension|get#getter<core::int>(list);
self::Extension|set#setter<core::int>(list, value);
value = self::Extension|get#property<core::int>(list);
self::Extension|set#property<core::int>(list, value);
value = self::Extension|get#fieldSetter<core::int>(list);
self::Extension|set#fieldSetter<core::int>(list, value);
core::List<core::int> iterable = list;
core::num n = self::Extension|get#field<core::num>(iterable);
self::Extension|set#field<core::num>(iterable, n);
n = self::Extension|get#finalField<core::num>(iterable);
n = self::Extension|method<core::num>(iterable);
n = self::Extension|get#getter<core::num>(iterable);
self::Extension|set#setter<core::num>(iterable, n);
n = self::Extension|get#property<core::num>(iterable);
self::Extension|set#property<core::num>(iterable, n);
n = self::Extension|get#fieldSetter<core::num>(iterable);
self::Extension|set#fieldSetter<core::num>(iterable, n);
value = self::Extension|staticField;
self::Extension|staticField = value;
value = self::Extension|staticFinalField;
value = self::Extension|staticMethod();
value = self::Extension|staticGetter;
self::Extension|staticSetter = value;
value = self::Extension|staticProperty;
self::Extension|staticProperty = value;
value = self::Extension|staticFieldSetter;
self::Extension|staticFieldSetter = value;
}
static method main() → dynamic {}

View file

@ -0,0 +1,53 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
extension Extension<T extends core::num> on core::List<T> {
get field = self::Extension|get#field;
set field = self::Extension|set#field;
static get staticField = get self::Extension|staticField;
static set staticField = set self::Extension|staticField;
get finalField = self::Extension|get#finalField;
static get staticFinalField = get self::Extension|staticFinalField;
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
static method staticMethod = self::Extension|staticMethod;
get getter = self::Extension|get#getter;
static get staticGetter = get self::Extension|staticGetter;
get property = self::Extension|get#property;
static get staticProperty = get self::Extension|staticProperty;
get fieldSetter = self::Extension|get#fieldSetter;
static get staticFieldSetter = get self::Extension|staticFieldSetter;
set setter = self::Extension|set#setter;
static set staticSetter = set self::Extension|staticSetter;
set property = self::Extension|set#property;
static set staticProperty = set self::Extension|staticProperty;
set fieldSetter = self::Extension|set#fieldSetter;
static set staticFieldSetter = set self::Extension|staticFieldSetter;
}
external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
external static get Extension|staticField() → core::int;
external static set Extension|staticField(core::int #externalFieldValue) → void;
external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
external static get Extension|staticFinalField() → core::int;
external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
external static method Extension|staticMethod() → core::int;
external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
external static get Extension|staticGetter() → core::int;
external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
external static set Extension|staticSetter(core::int value) → void;
external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
external static get Extension|staticProperty() → core::int;
external static set Extension|staticProperty(core::int value) → void;
external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
external static get Extension|staticFieldSetter() → core::int;
external static set Extension|staticFieldSetter(core::int value) → void;
static method test() → dynamic
;
static method main() → dynamic
;

View file

@ -0,0 +1,84 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
extension Extension<T extends core::num> on core::List<T> {
get field = self::Extension|get#field;
set field = self::Extension|set#field;
static get staticField = get self::Extension|staticField;
static set staticField = set self::Extension|staticField;
get finalField = self::Extension|get#finalField;
static get staticFinalField = get self::Extension|staticFinalField;
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
static method staticMethod = self::Extension|staticMethod;
get getter = self::Extension|get#getter;
static get staticGetter = get self::Extension|staticGetter;
get property = self::Extension|get#property;
static get staticProperty = get self::Extension|staticProperty;
get fieldSetter = self::Extension|get#fieldSetter;
static get staticFieldSetter = get self::Extension|staticFieldSetter;
set setter = self::Extension|set#setter;
static set staticSetter = set self::Extension|staticSetter;
set property = self::Extension|set#property;
static set staticProperty = set self::Extension|staticProperty;
set fieldSetter = self::Extension|set#fieldSetter;
static set staticFieldSetter = set self::Extension|staticFieldSetter;
}
external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
external static get Extension|staticField() → core::int;
external static set Extension|staticField(core::int #externalFieldValue) → void;
external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
external static get Extension|staticFinalField() → core::int;
external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
external static method Extension|staticMethod() → core::int;
external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
external static get Extension|staticGetter() → core::int;
external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
external static set Extension|staticSetter(core::int value) → void;
external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
external static get Extension|staticProperty() → core::int;
external static set Extension|staticProperty(core::int value) → void;
external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
external static get Extension|staticFieldSetter() → core::int;
external static set Extension|staticFieldSetter(core::int value) → void;
static method test() → dynamic {
core::List<core::int> list = core::_GrowableList::•<core::int>(0);
core::int value = self::Extension|get#field<core::int>(list);
self::Extension|set#field<core::int>(list, value);
value = self::Extension|get#finalField<core::int>(list);
value = self::Extension|method<core::int>(list);
value = self::Extension|get#getter<core::int>(list);
self::Extension|set#setter<core::int>(list, value);
value = self::Extension|get#property<core::int>(list);
self::Extension|set#property<core::int>(list, value);
value = self::Extension|get#fieldSetter<core::int>(list);
self::Extension|set#fieldSetter<core::int>(list, value);
core::List<core::int> iterable = list;
core::num n = self::Extension|get#field<core::num>(iterable);
self::Extension|set#field<core::num>(iterable, n);
n = self::Extension|get#finalField<core::num>(iterable);
n = self::Extension|method<core::num>(iterable);
n = self::Extension|get#getter<core::num>(iterable);
self::Extension|set#setter<core::num>(iterable, n);
n = self::Extension|get#property<core::num>(iterable);
self::Extension|set#property<core::num>(iterable, n);
n = self::Extension|get#fieldSetter<core::num>(iterable);
self::Extension|set#fieldSetter<core::num>(iterable, n);
value = self::Extension|staticField;
self::Extension|staticField = value;
value = self::Extension|staticFinalField;
value = self::Extension|staticMethod();
value = self::Extension|staticGetter;
self::Extension|staticSetter = value;
value = self::Extension|staticProperty;
self::Extension|staticProperty = value;
value = self::Extension|staticFieldSetter;
self::Extension|staticFieldSetter = value;
}
static method main() → dynamic {}

View file

@ -101,9 +101,9 @@ abstract class B extends core::Object /*isMixinDeclaration*/ {
external static get finalStaticField() → core::int;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@ -113,9 +113,9 @@ external static set topLevelField(core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(core::int #externalFieldValue) → void;
external static get Extension|extensionInstanceField() → core::int;
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
external static get Extension|extensionStaticField() → core::int;
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionStaticField() → core::int;

View file

@ -101,9 +101,9 @@ abstract class B extends core::Object /*isMixinDeclaration*/ {
external static get finalStaticField() → core::int;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@ -113,9 +113,9 @@ external static set topLevelField(core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(core::int #externalFieldValue) → void;
external static get Extension|extensionInstanceField() → core::int;
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
external static get Extension|extensionStaticField() → core::int;
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionStaticField() → core::int;

View file

@ -101,9 +101,9 @@ abstract class B extends core::Object /*isMixinDeclaration*/ {
external static get finalStaticField() → core::int;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@ -113,9 +113,9 @@ external static set topLevelField(core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(core::int #externalFieldValue) → void;
external static get Extension|extensionInstanceField() → core::int;
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
external static get Extension|extensionStaticField() → core::int;
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionStaticField() → core::int;

View file

@ -21,9 +21,9 @@ abstract class B extends core::Object /*isMixinDeclaration*/ {
external static get finalStaticField() → core::int;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@ -33,9 +33,9 @@ external static set topLevelField(core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(core::int #externalFieldValue) → void;
external static get Extension|extensionInstanceField() → core::int;
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
external static get Extension|extensionStaticField() → core::int;
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionStaticField() → core::int;

View file

@ -101,9 +101,9 @@ abstract class B extends core::Object /*isMixinDeclaration*/ {
external static get finalStaticField() → core::int;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
@ -113,9 +113,9 @@ external static set topLevelField(core::int #externalFieldValue) → void;
external static get finalTopLevelField() → core::int;
external static get constField() → core::int;
external static set constField(core::int #externalFieldValue) → void;
external static get Extension|extensionInstanceField() → core::int;
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
external static get Extension|extensionStaticField() → core::int;
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
external static get Extension|finalExtensionStaticField() → core::int;

View file

@ -78,15 +78,15 @@ class C extends core::Object implements self::A {
external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@ -101,20 +101,20 @@ external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@#C1
external static get Extension|extensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@#C1
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@#C1
external static get Extension|extensionStaticField() → core::int;
@#C1
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionStaticField() → core::int;
external static get Extension|untypedExtensionInstanceField() → dynamic;
external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;

View file

@ -78,15 +78,15 @@ class C extends core::Object implements self::A {
external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@ -101,20 +101,20 @@ external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@#C1
external static get Extension|extensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@#C1
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@#C1
external static get Extension|extensionStaticField() → core::int;
@#C1
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionStaticField() → core::int;
external static get Extension|untypedExtensionInstanceField() → dynamic;
external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;

View file

@ -78,15 +78,15 @@ class C extends core::Object implements self::A {
external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@ -101,20 +101,20 @@ external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@#C1
external static get Extension|extensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@#C1
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@#C1
external static get Extension|extensionStaticField() → core::int;
@#C1
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionStaticField() → core::int;
external static get Extension|untypedExtensionInstanceField() → dynamic;
external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;

View file

@ -76,15 +76,15 @@ class C extends core::Object implements self::A {
external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@ -99,20 +99,20 @@ external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@self::Annotation::•()
external static get Extension|extensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@self::Annotation::•()
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@self::Annotation::•()
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@self::Annotation::•()
external static get Extension|extensionStaticField() → core::int;
@self::Annotation::•()
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@self::Annotation::•()
external static get Extension|finalExtensionStaticField() → core::int;
external static get Extension|untypedExtensionInstanceField() → dynamic;
external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;

View file

@ -78,15 +78,15 @@ class C extends core::Object implements self::A {
external set untypedCovariantInstanceField(covariant dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
get extensionInstanceField = get self::Extension|extensionInstanceField;
set extensionInstanceField = set self::Extension|extensionInstanceField;
get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
get extensionInstanceField = self::Extension|get#extensionInstanceField;
set extensionInstanceField = self::Extension|set#extensionInstanceField;
get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
static get extensionStaticField = get self::Extension|extensionStaticField;
static set extensionStaticField = set self::Extension|extensionStaticField;
static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
get untypedExtensionInstanceField = get self::Extension|untypedExtensionInstanceField;
set untypedExtensionInstanceField = set self::Extension|untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = get self::Extension|untypedFinalExtensionInstanceField;
get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
@ -101,20 +101,20 @@ external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@#C1
external static get Extension|extensionInstanceField() → core::int;
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@#C1
external static set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionInstanceField() → core::int;
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@#C1
external static get Extension|extensionStaticField() → core::int;
@#C1
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionStaticField() → core::int;
external static get Extension|untypedExtensionInstanceField() → dynamic;
external static set Extension|untypedExtensionInstanceField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionInstanceField() → dynamic;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;