mirror of
https://github.com/dart-lang/sdk
synced 2024-10-02 23:59:16 +00:00
[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:
parent
2b41685519
commit
8f270ea432
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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,
|
||||
|
|
137
pkg/front_end/lib/src/fasta/source/name_scheme.dart
Normal file
137
pkg/front_end/lib/src/fasta/source/name_scheme.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
63
pkg/front_end/testcases/extensions/external.dart
Normal file
63
pkg/front_end/testcases/extensions/external.dart
Normal 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() {}
|
|
@ -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() {}
|
|
@ -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() {}
|
84
pkg/front_end/testcases/extensions/external.dart.weak.expect
Normal file
84
pkg/front_end/testcases/extensions/external.dart.weak.expect
Normal 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 {}
|
|
@ -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
|
||||
;
|
|
@ -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 {}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue