Version 2.15.0-85.0.dev
Merge commit 'f42cc14c3c5055f141cda84105c1f8bc35aa0041' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7233909..2c7f285 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -89,9 +89,9 @@
#### Dart VM
-- **Breaking Change** [#45451][]: Support for `dart-ext:`-style native
- extensions has been removed as previously announced. Use `dart:ffi` to bind
- to native libraries instead.
+- **Breaking Change** [#45451](https://github.com/dart-lang/sdk/issues/45451) :
+ Support for `dart-ext:`-style native extensions has been removed as previously
+ announced. Use `dart:ffi` to bind to native libraries instead.
## 2.14.0
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index b0fa8e8..f933d9f 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -36,6 +36,8 @@
bool get isGetter;
+ bool get isExternal;
+
/// Returns `true` if this builder is an extension declaration.
///
/// For instance `B` in:
@@ -277,6 +279,9 @@
bool get isStatic => false;
@override
+ bool get isExternal => false;
+
+ @override
bool get isSynthetic => false;
@override
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 98e54de..3822c10 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -55,8 +55,8 @@
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 @@
/// String toString() => _name;
/// }
- FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
+ NameScheme instanceFieldNameScheme = new NameScheme(
isInstanceMember: true,
className: name,
isExtensionMember: false,
@@ -198,7 +198,7 @@
? referencesFromIndexed.library.reference
: parent.library.reference);
- FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
+ NameScheme staticFieldNameScheme = new NameScheme(
isInstanceMember: false,
className: name,
isExtensionMember: false,
@@ -207,8 +207,9 @@
? 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 @@
charOffset,
charOffset,
instanceFieldNameScheme,
- isInstanceMember: true,
fieldGetterReference: indexGetterReference,
fieldSetterReference: indexSetterReference);
members["index"] = indexBuilder;
@@ -268,7 +268,6 @@
charOffset,
charOffset,
instanceFieldNameScheme,
- isInstanceMember: true,
fieldGetterReference: _nameGetterReference,
fieldSetterReference: _nameSetterReference);
members["_name"] = nameBuilder;
@@ -302,7 +301,6 @@
charOffset,
charOffset,
staticFieldNameScheme,
- isInstanceMember: false,
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
members["values"] = valuesBuilder;
@@ -384,7 +382,6 @@
enumConstantInfo.charOffset,
enumConstantInfo.charOffset,
staticFieldNameScheme,
- isInstanceMember: false,
fieldGetterReference: getterReference,
fieldSetterReference: setterReference);
members[name] = fieldBuilder..next = existing;
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index d0250bf..4ac03ac 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -15,6 +15,7 @@
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 @@
{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;
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 14c0575..f375735 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -23,6 +23,7 @@
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 '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 @@
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 @@
int charOpenParenOffset,
int charEndOffset,
Reference? procedureReference,
- ProcedureNameScheme procedureNameScheme,
+ NameScheme nameScheme,
String? nativeMethodName,
this.redirectionTarget)
: super(
@@ -290,7 +290,7 @@
charEndOffset,
procedureReference,
AsyncMarker.Sync,
- procedureNameScheme,
+ nameScheme,
nativeMethodName: nativeMethodName);
@override
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 1915d6c..e3b28d2 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -9,6 +9,7 @@
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 '../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 @@
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 @@
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 @@
assert(lateGetterReference == null);
assert(lateSetterReference == null);
_fieldEncoding = new AbstractOrExternalFieldEncoding(
+ this,
name,
fieldNameScheme,
fileUri,
@@ -393,7 +394,7 @@
// 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 @@
@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 @@
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 @@
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 @@
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 @@
AbstractLateFieldEncoding(
this.name,
- FieldNameScheme fieldNameScheme,
+ NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -901,7 +822,7 @@
_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 @@
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 @@
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 @@
..fileEndOffset = charEndOffset
..isNonNullableByDefault = true;
_lateSetter = _createSetter(
- fieldNameScheme.getName(FieldNameType.Setter, name,
+ nameScheme.getFieldName(FieldNameType.Setter, name,
isSynthesized: true),
fileUri,
charOffset,
@@ -1267,7 +1188,7 @@
with NonFinalLate, LateWithoutInitializer {
LateFieldWithoutInitializerEncoding(
String name,
- FieldNameScheme fieldNameScheme,
+ NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1281,7 +1202,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
- fieldNameScheme,
+ nameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1299,7 +1220,7 @@
with NonFinalLate {
LateFieldWithInitializerEncoding(
String name,
- FieldNameScheme fieldNameScheme,
+ NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1313,7 +1234,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
- fieldNameScheme,
+ nameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1346,7 +1267,7 @@
with LateWithoutInitializer {
LateFinalFieldWithoutInitializerEncoding(
String name,
- FieldNameScheme fieldNameScheme,
+ NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1360,7 +1281,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
- fieldNameScheme,
+ nameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1394,7 +1315,7 @@
class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
LateFinalFieldWithInitializerEncoding(
String name,
- FieldNameScheme fieldNameScheme,
+ NameScheme nameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@@ -1408,7 +1329,7 @@
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
- fieldNameScheme,
+ nameScheme,
fileUri,
charOffset,
charEndOffset,
@@ -1595,15 +1516,19 @@
}
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 @@
// 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
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index bae23b9..f164ecc 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -68,6 +68,7 @@
// TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
ProcedureKind? get kind;
+ @override
bool get isExternal;
bool get isAbstract;
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index bccd75e..8c5b997 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -276,7 +276,7 @@
// 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
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 741445c..48b6cd4 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -10,6 +10,7 @@
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 @@
Reference? procedureReference,
this._tearOffReference,
AsyncMarker asyncModifier,
- ProcedureNameScheme procedureNameScheme,
+ NameScheme nameScheme,
{required bool isExtensionMember,
required bool isInstanceMember,
String? nativeMethodName})
@@ -107,7 +108,7 @@
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 @@
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 @@
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 @@
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);
- }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 0db0a7a..2a2955a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6845,7 +6845,8 @@
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)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index dd26634..49d92a1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1942,6 +1942,10 @@
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 @@
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 @@
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 =
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 64ce17a..f38b46b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -67,6 +67,7 @@
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 @@
assert(() {
Set<String> patchFieldNames = {};
builder.forEachDeclaredField((String name, FieldBuilder fieldBuilder) {
- patchFieldNames.add(SourceFieldBuilder.createFieldName(
+ patchFieldNames.add(NameScheme.createFieldName(
FieldNameType.Field,
name,
isInstanceMember: fieldBuilder.isClassInstanceMember,
diff --git a/pkg/front_end/lib/src/fasta/source/name_scheme.dart b/pkg/front_end/lib/src/fasta/source/name_scheme.dart
new file mode 100644
index 0000000..65bcfe7
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/name_scheme.dart
@@ -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;
+ }
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index d528324..180e20c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -93,6 +93,8 @@
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 @@
scope.forEach(buildBuilders);
- _extension.onType = onType.build(libraryBuilder);
-
return _extension;
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 3cf100e..76d8d26 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -122,12 +122,10 @@
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 @@
Reference? lateGetterReference;
Reference? lateSetterReference;
- FieldNameScheme fieldNameScheme = new FieldNameScheme(
+ NameScheme nameScheme = new NameScheme(
isInstanceMember: isInstanceMember,
className: className,
isExtensionMember: isExtensionMember,
@@ -2236,14 +2234,14 @@
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 @@
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 @@
this,
charOffset,
charEndOffset,
- fieldNameScheme,
- isInstanceMember: isInstanceMember,
+ nameScheme,
fieldGetterReference: fieldGetterReference,
fieldSetterReference: fieldSetterReference,
lateIsSetGetterReference: lateIsSetGetterReference,
@@ -2371,12 +2368,16 @@
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 @@
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 @@
}
if (isExtensionMember && kind == ProcedureKind.Method) {
tearOffReference = referencesFromIndexed!.lookupGetterReference(
- procedureNameScheme.getName(ProcedureKind.Getter, name));
+ nameScheme.getProcedureName(ProcedureKind.Getter, name));
}
}
}
@@ -2431,7 +2432,7 @@
procedureReference,
tearOffReference,
asyncModifier,
- procedureNameScheme,
+ nameScheme,
isExtensionMember: isExtensionMember,
isInstanceMember: isInstanceMember,
nativeMethodName: nativeMethodName);
@@ -2474,10 +2475,11 @@
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
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 308ab12..110567c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -106,8 +106,6 @@
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 '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 @@
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)
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 4a559f2..d76c881 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1039,22 +1039,31 @@
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;
diff --git a/pkg/front_end/testcases/extensions/external.dart b/pkg/front_end/testcases/extensions/external.dart
new file mode 100644
index 0000000..29f5ed2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart
@@ -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() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect
new file mode 100644
index 0000000..8a7d6d9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.textual_outline.expect
@@ -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() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e84ee4c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.textual_outline_modelled.expect
@@ -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() {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.expect b/pkg/front_end/testcases/extensions/external.dart.weak.expect
new file mode 100644
index 0000000..f9c3590
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.expect
@@ -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 {}
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect
new file mode 100644
index 0000000..9dc219e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.outline.expect
@@ -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
+ ;
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect
new file mode 100644
index 0000000..e19cd2d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.transformed.expect
@@ -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 {}
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.expect
@@ -101,9 +101,9 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.strong.transformed.expect
@@ -101,9 +101,9 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.expect
@@ -101,9 +101,9 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
index d92b2fe..994b1f9 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.outline.expect
@@ -21,9 +21,9 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
index 5d4f518..ec21f8d 100644
--- a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.transformed.expect
@@ -101,9 +101,9 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.expect
@@ -78,15 +78,15 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.strong.transformed.expect
@@ -78,15 +78,15 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.expect
@@ -78,15 +78,15 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
index 99614fc..3b1721d 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.outline.expect
@@ -76,15 +76,15 @@
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 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;
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
index 660d848..27fd69e 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.transformed.expect
@@ -78,15 +78,15 @@
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 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;
diff --git a/tools/VERSION b/tools/VERSION
index 470204da..4ae6011 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 84
+PRERELEASE 85
PRERELEASE_PATCH 0
\ No newline at end of file