[kernel] Make Member.name non-nullable

Change-Id: Id2befd868e93985d6af463c2ccd410cd56b68187
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/194721
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2021-04-12 13:48:46 +00:00 committed by commit-bot@chromium.org
parent d30d9ed839
commit 64460ec47f
40 changed files with 1318 additions and 384 deletions

View file

@ -142,6 +142,7 @@ class ConstructorBuilderImpl extends FunctionBuilderImpl
Member referenceFrom,
[String nativeMethodName])
: _constructor = new Constructor(null,
name: new Name(name, compilationUnit.library),
fileUri: compilationUnit.fileUri,
reference: referenceFrom?.reference)
..startFileOffset = startCharOffset
@ -196,9 +197,11 @@ class ConstructorBuilderImpl extends FunctionBuilderImpl
f(member, BuiltMemberKind.Constructor);
}
bool _hasBeenBuilt = false;
@override
Constructor build(SourceLibraryBuilder libraryBuilder) {
if (_constructor.name == null) {
if (!_hasBeenBuilt) {
_constructor.function = buildFunction(libraryBuilder);
_constructor.function.parent = _constructor;
_constructor.function.fileOffset = charOpenParenOffset;
@ -206,7 +209,8 @@ class ConstructorBuilderImpl extends FunctionBuilderImpl
_constructor.function.typeParameters = const <TypeParameter>[];
_constructor.isConst = isConst;
_constructor.isExternal = isExternal;
_constructor.name = new Name(name, libraryBuilder.library);
updatePrivateMemberName(_constructor, libraryBuilder);
_hasBeenBuilt = true;
}
if (formals != null) {
bool needsInference = false;

View file

@ -172,6 +172,33 @@ class EnumBuilder extends SourceClassBuilder {
/// static const List<E> values = const <E>[id0, ..., idn-1];
/// String toString() => _name;
/// }
FieldNameScheme instanceFieldNameScheme = new FieldNameScheme(
isInstanceMember: true,
className: name,
isExtensionMember: false,
extensionName: null,
libraryReference: referencesFrom != null
? referencesFromIndexed.library.reference
: parent.library.reference);
FieldNameScheme staticFieldNameScheme = new FieldNameScheme(
isInstanceMember: false,
className: name,
isExtensionMember: false,
extensionName: null,
libraryReference: referencesFrom != null
? referencesFromIndexed.library.reference
: parent.library.reference);
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
isStatic: false,
isExtensionMember: false,
extensionName: null,
libraryReference: referencesFrom != null
? referencesFromIndexed.library.reference
: parent.library.reference);
Constructor constructorReference;
Reference toStringReference;
Reference indexGetterReference;
@ -210,6 +237,8 @@ class EnumBuilder extends SourceClassBuilder {
parent,
charOffset,
charOffset,
instanceFieldNameScheme,
isInstanceMember: true,
fieldGetterReference: indexGetterReference,
fieldSetterReference: indexSetterReference);
members["_name"] = new SourceFieldBuilder(
@ -221,6 +250,8 @@ class EnumBuilder extends SourceClassBuilder {
parent,
charOffset,
charOffset,
instanceFieldNameScheme,
isInstanceMember: true,
fieldGetterReference: _nameGetterReference,
fieldSetterReference: _nameSetterReference);
ConstructorBuilder constructorBuilder = new ConstructorBuilderImpl(
@ -251,6 +282,8 @@ class EnumBuilder extends SourceClassBuilder {
parent,
charOffset,
charOffset,
staticFieldNameScheme,
isInstanceMember: false,
fieldGetterReference: valuesGetterReference,
fieldSetterReference: valuesSetterReference);
members["values"] = valuesBuilder;
@ -263,8 +296,8 @@ class EnumBuilder extends SourceClassBuilder {
0,
stringType,
"toString",
null,
null,
/* typeVariables = */ null,
/* formals = */ null,
ProcedureKind.Method,
parent,
charOffset,
@ -272,9 +305,11 @@ class EnumBuilder extends SourceClassBuilder {
charOffset,
charEndOffset,
toStringReference,
null,
/* tearOffReference = */ null,
AsyncMarker.Sync,
/* isExtensionInstanceMember = */ false);
procedureNameScheme,
isExtensionMember: false,
isInstanceMember: true);
members["toString"] = toStringBuilder;
String className = name;
if (enumConstantInfos != null) {
@ -329,6 +364,8 @@ class EnumBuilder extends SourceClassBuilder {
parent,
enumConstantInfo.charOffset,
enumConstantInfo.charOffset,
staticFieldNameScheme,
isInstanceMember: false,
fieldGetterReference: getterReference,
fieldSetterReference: setterReference);
members[name] = fieldBuilder..next = existing;

View file

@ -38,7 +38,6 @@ import '../type_inference/type_inference_engine.dart'
import '../util/helpers.dart' show DelayedActionPerformer;
import 'class_builder.dart';
import 'extension_builder.dart';
import 'library_builder.dart';
import 'member_builder.dart';
import 'metadata_builder.dart';
@ -121,25 +120,36 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
SourceLibraryBuilder libraryBuilder,
int charOffset,
int charEndOffset,
{Reference fieldGetterReference,
FieldNameScheme fieldNameScheme,
{bool isInstanceMember,
Reference fieldGetterReference,
Reference fieldSetterReference,
Reference lateIsSetGetterReference,
Reference lateIsSetSetterReference,
Reference lateGetterReference,
Reference lateSetterReference})
: super(libraryBuilder, charOffset) {
assert(isInstanceMember != null);
Uri fileUri = libraryBuilder?.fileUri;
// If in mixed mode, late lowerings cannot use `null` as a sentinel on
// non-nullable fields since they can be assigned from legacy code.
late_lowering.IsSetStrategy isSetStrategy =
late_lowering.computeIsSetStrategy(libraryBuilder);
if (isAbstract || isExternal) {
assert(lateIsSetGetterReference == null);
assert(lateIsSetSetterReference == null);
assert(lateGetterReference == null);
assert(lateSetterReference == null);
_fieldEncoding = new AbstractOrExternalFieldEncoding(fileUri, charOffset,
charEndOffset, fieldGetterReference, fieldSetterReference,
_fieldEncoding = new AbstractOrExternalFieldEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
fieldGetterReference,
fieldSetterReference,
isAbstract: isAbstract,
isExternal: isExternal,
isFinal: isFinal,
@ -149,11 +159,12 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled(
hasInitializer: hasInitializer,
isFinal: isFinal,
isStatic: (isStatic || isTopLevel))) {
isStatic: !isInstanceMember)) {
if (hasInitializer) {
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -168,6 +179,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
} else {
_fieldEncoding = new LateFieldWithInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -184,6 +196,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithoutInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -198,6 +211,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
} else {
_fieldEncoding = new LateFieldWithoutInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -213,12 +227,13 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
}
} else if (libraryBuilder.isNonNullableByDefault &&
libraryBuilder.loader.target.backendTarget.useStaticFieldLowering &&
(isStatic || isTopLevel) &&
!isInstanceMember &&
!isConst &&
hasInitializer) {
if (isFinal) {
_fieldEncoding = new LateFinalFieldWithInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -233,6 +248,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
} else {
_fieldEncoding = new LateFieldWithInitializerEncoding(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -251,7 +267,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
assert(lateGetterReference == null);
assert(lateSetterReference == null);
_fieldEncoding = new RegularFieldEncoding(
fileUri, charOffset, charEndOffset,
name, fieldNameScheme, fileUri, charOffset, charEndOffset,
isFinal: isFinal,
isConst: isConst,
isLate: isLate,
@ -551,6 +567,36 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
enum FieldNameType { Field, Getter, Setter, IsSetField }
class FieldNameScheme {
final bool isInstanceMember;
final String className;
final bool isExtensionMember;
final String extensionName;
final Reference libraryReference;
FieldNameScheme(
{this.isInstanceMember,
this.className,
this.isExtensionMember,
this.extensionName,
this.libraryReference})
: assert(isInstanceMember != null),
assert(isExtensionMember != null),
assert(!isExtensionMember || extensionName != null),
assert(libraryReference != null);
Name getName(FieldNameType type, String name, {bool isSynthesized}) {
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.
///
/// This is used to provide lowerings for late fields using synthesized getters
@ -621,7 +667,8 @@ abstract class FieldEncoding {
class RegularFieldEncoding implements FieldEncoding {
Field _field;
RegularFieldEncoding(Uri fileUri, int charOffset, int charEndOffset,
RegularFieldEncoding(String name, FieldNameScheme fieldNameScheme,
Uri fileUri, int charOffset, int charEndOffset,
{bool isFinal,
bool isConst,
bool isLate,
@ -636,13 +683,17 @@ class RegularFieldEncoding implements FieldEncoding {
bool isImmutable =
isLate ? (isFinal && hasInitializer) : (isFinal || isConst);
_field = isImmutable
? new Field.immutable(null,
? new Field.immutable(
fieldNameScheme.getName(FieldNameType.Field, name,
isSynthesized: false),
isFinal: isFinal,
isConst: isConst,
isLate: isLate,
fileUri: fileUri,
getterReference: getterReference)
: new Field.mutable(null,
: new Field.mutable(
fieldNameScheme.getName(FieldNameType.Field, name,
isSynthesized: false),
isFinal: isFinal,
isLate: isLate,
fileUri: fileUri,
@ -687,30 +738,19 @@ class RegularFieldEncoding implements FieldEncoding {
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
_field..isCovariant = fieldBuilder.isCovariant;
String fieldName;
if (fieldBuilder.isExtensionMember) {
ExtensionBuilder extension = fieldBuilder.parent;
fieldName = SourceFieldBuilder.createFieldName(
FieldNameType.Field, fieldBuilder.name,
isExtensionMethod: true, extensionName: extension.name);
_field
..isStatic = true
..isExtensionMember = true;
} else {
bool isInstanceMember =
!fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
String className =
isInstanceMember ? fieldBuilder.classBuilder.name : null;
fieldName = SourceFieldBuilder.createFieldName(
FieldNameType.Field, fieldBuilder.name,
isInstanceMember: isInstanceMember, className: className);
_field
..isStatic = !isInstanceMember
..isExtensionMember = false;
}
// TODO(johnniwinther): How can the name already have been computed?
_field.name ??= new Name(fieldName, libraryBuilder.library);
_field.isLate = fieldBuilder.isLate;
updatePrivateMemberName(_field, libraryBuilder);
}
@override
@ -835,6 +875,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
AbstractLateFieldEncoding(
this.name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -851,7 +892,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
_isSetStrategy = isSetStrategy,
_forceIncludeIsSetField =
isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
_field = new Field.mutable(null,
_field = new Field.mutable(
fieldNameScheme.getName(FieldNameType.Field, name, isSynthesized: true),
fileUri: fileUri,
getterReference: fieldGetterReference,
setterReference: fieldSetterReference)
@ -866,7 +908,9 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
break;
case late_lowering.IsSetStrategy.forceUseIsSetField:
case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
_lateIsSetField = new Field.mutable(null,
_lateIsSetField = new Field.mutable(
fieldNameScheme.getName(FieldNameType.IsSetField, name,
isSynthesized: true),
fileUri: fileUri,
getterReference: lateIsSetGetterReference,
setterReference: lateIsSetSetterReference)
@ -877,7 +921,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
break;
}
_lateGetter = new Procedure(
null,
fieldNameScheme.getName(FieldNameType.Getter, name,
isSynthesized: true),
ProcedureKind.Getter,
new FunctionNode(null)
..fileOffset = charOffset
@ -887,7 +932,12 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = true;
_lateSetter = _createSetter(name, fileUri, charOffset, lateSetterReference,
_lateSetter = _createSetter(
fieldNameScheme.getName(FieldNameType.Setter, name,
isSynthesized: true),
fileUri,
charOffset,
lateSetterReference,
isCovariant: isCovariant);
}
@ -997,14 +1047,14 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
Expression initializer, bool useNewMethodInvocationEncoding);
Procedure _createSetter(
String name, Uri fileUri, int charOffset, Reference reference,
Name name, Uri fileUri, int charOffset, Reference reference,
{bool isCovariant}) {
assert(isCovariant != null);
VariableDeclaration parameter = new VariableDeclaration(null)
..isCovariant = isCovariant
..fileOffset = fileOffset;
return new Procedure(
null,
name,
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
@ -1081,12 +1131,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
bool isInstanceMember;
String className;
bool isExtensionMember = fieldBuilder.isExtensionMember;
String extensionName;
if (isExtensionMember) {
ExtensionBuilder extension = fieldBuilder.parent;
extensionName = extension.name;
_field
..isStatic = true
..isExtensionMember = isExtensionMember;
@ -1096,59 +1142,24 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
_field
..isStatic = !isInstanceMember
..isExtensionMember = false;
if (isInstanceMember) {
className = fieldBuilder.classBuilder.name;
}
}
_field.name ??= new Name(
SourceFieldBuilder.createFieldName(
FieldNameType.Field, fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true),
libraryBuilder.library);
updatePrivateMemberName(_field, libraryBuilder);
if (_lateIsSetField != null) {
_lateIsSetField
..name = new Name(
SourceFieldBuilder.createFieldName(
FieldNameType.IsSetField, fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true),
libraryBuilder.library)
..isStatic = !isInstanceMember
..isStatic = _field.isStatic
..isExtensionMember = isExtensionMember;
updatePrivateMemberName(_lateIsSetField, libraryBuilder);
}
_lateGetter
..name = new Name(
SourceFieldBuilder.createFieldName(
FieldNameType.Getter, fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true),
libraryBuilder.library)
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember;
updatePrivateMemberName(_lateGetter, libraryBuilder);
if (_lateSetter != null) {
_lateSetter
..name = new Name(
SourceFieldBuilder.createFieldName(
FieldNameType.Setter, fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true),
libraryBuilder.library)
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember;
updatePrivateMemberName(_lateSetter, libraryBuilder);
}
}
@ -1248,6 +1259,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
with NonFinalLate, LateWithoutInitializer {
LateFieldWithoutInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1261,6 +1273,7 @@ class LateFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1278,6 +1291,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding
with NonFinalLate {
LateFieldWithInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1291,6 +1305,7 @@ class LateFieldWithInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1323,6 +1338,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
with LateWithoutInitializer {
LateFinalFieldWithoutInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1336,6 +1352,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1369,6 +1386,7 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
LateFinalFieldWithInitializerEncoding(
String name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
@ -1382,6 +1400,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
late_lowering.IsSetStrategy isSetStrategy)
: super(
name,
fieldNameScheme,
fileUri,
charOffset,
charEndOffset,
@ -1411,7 +1430,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
@override
Procedure _createSetter(
String name, Uri fileUri, int charOffset, Reference reference,
Name name, Uri fileUri, int charOffset, Reference reference,
{bool isCovariant}) =>
null;
@ -1570,8 +1589,14 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
Procedure _getter;
Procedure _setter;
AbstractOrExternalFieldEncoding(Uri fileUri, int charOffset,
int charEndOffset, Reference getterReference, Reference setterReference,
AbstractOrExternalFieldEncoding(
String name,
FieldNameScheme fieldNameScheme,
Uri fileUri,
int charOffset,
int charEndOffset,
Reference getterReference,
Reference setterReference,
{this.isAbstract,
this.isExternal,
bool isFinal,
@ -1582,8 +1607,13 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
assert(isFinal != null),
assert(isCovariant != null),
assert(isNonNullableByDefault != null) {
_getter = new Procedure(null, ProcedureKind.Getter, new FunctionNode(null),
fileUri: fileUri, reference: getterReference)
_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;
@ -1593,7 +1623,8 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
..isCovariant = isCovariant
..fileOffset = charOffset;
_setter = new Procedure(
null,
fieldNameScheme.getName(FieldNameType.Setter, name,
isSynthesized: true),
ProcedureKind.Setter,
new FunctionNode(null,
positionalParameters: [parameter], returnType: const VoidType())
@ -1636,51 +1667,25 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
@override
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
bool isExtensionMember = false;
String extensionName;
bool isInstanceMember = false;
String className;
if (fieldBuilder.isExtensionMember) {
isExtensionMember = true;
ExtensionBuilder extension = fieldBuilder.parent;
extensionName = extension.name;
} else {
isInstanceMember = !fieldBuilder.isStatic && !fieldBuilder.isTopLevel;
className = isInstanceMember ? fieldBuilder.classBuilder.name : null;
}
bool isExtensionMember = fieldBuilder.isExtensionMember;
bool isInstanceMember = !fieldBuilder.isExtensionMember &&
!fieldBuilder.isStatic &&
!fieldBuilder.isTopLevel;
_getter..isConst = fieldBuilder.isConst;
String getterName = SourceFieldBuilder.createFieldName(
FieldNameType.Getter, fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true);
_getter
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;
// TODO(johnniwinther): How can the name already have been computed?
_getter.name ??= new Name(getterName, libraryBuilder.library);
updatePrivateMemberName(_getter, libraryBuilder);
if (_setter != null) {
String setterName = SourceFieldBuilder.createFieldName(
FieldNameType.Setter,
fieldBuilder.name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtensionMember,
extensionName: extensionName,
isSynthesized: true,
);
_setter
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;
// TODO(johnniwinther): How can the name already have been computed?
_setter?.name ??= new Name(setterName, libraryBuilder.library);
updatePrivateMemberName(_setter, libraryBuilder);
}
}

View file

@ -297,3 +297,13 @@ abstract class BuilderClassMember implements ClassMember {
@override
String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
}
/// If the name of [member] is private, update it to use the library reference
/// of [libraryBuilder].
// TODO(johnniwinther): Avoid having to update private names by setting
// the correct library reference when creating parts.
void updatePrivateMemberName(Member member, LibraryBuilder libraryBuilder) {
if (member.name.isPrivate) {
member.name = new Name(member.name.text, libraryBuilder.library);
}
}

View file

@ -65,7 +65,7 @@ abstract class ProcedureBuilder implements FunctionBuilder {
abstract class ProcedureBuilderImpl extends FunctionBuilderImpl
implements ProcedureBuilder {
final Procedure _procedure;
Procedure _procedure;
@override
final int charOpenParenOffset;
@ -92,23 +92,29 @@ abstract class ProcedureBuilderImpl extends FunctionBuilderImpl
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
this.kind,
SourceLibraryBuilder compilationUnit,
SourceLibraryBuilder libraryBuilder,
int startCharOffset,
int charOffset,
this.charOpenParenOffset,
int charEndOffset,
Reference procedureReference,
this.isExtensionInstanceMember,
[String nativeMethodName])
: _procedure = new Procedure(
null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
fileUri: compilationUnit.fileUri, reference: procedureReference)
..startFileOffset = startCharOffset
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = compilationUnit.isNonNullableByDefault,
ProcedureNameScheme procedureNameScheme,
{bool isExtensionMember,
bool isInstanceMember,
String nativeMethodName})
: assert(isExtensionMember != null),
assert(isInstanceMember != null),
this.isExtensionInstanceMember = isInstanceMember && isExtensionMember,
super(metadata, modifiers, returnType, name, typeVariables, formals,
compilationUnit, charOffset, nativeMethodName);
libraryBuilder, charOffset, nativeMethodName) {
_procedure = new Procedure(procedureNameScheme.getName(kind, name),
isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
fileUri: libraryBuilder.fileUri, reference: procedureReference)
..startFileOffset = startCharOffset
..fileOffset = charOffset
..fileEndOffset = charEndOffset
..isNonNullableByDefault = libraryBuilder.isNonNullableByDefault;
}
@override
ProcedureBuilder get origin => actualOrigin ?? this;
@ -225,7 +231,7 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
ProcedureKind kind,
SourceLibraryBuilder compilationUnit,
SourceLibraryBuilder libraryBuilder,
int startCharOffset,
int charOffset,
int charOpenParenOffset,
@ -233,8 +239,10 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
Reference procedureReference,
this._tearOffReference,
AsyncMarker asyncModifier,
bool isExtensionInstanceMember,
[String nativeMethodName])
ProcedureNameScheme procedureNameScheme,
{bool isExtensionMember,
bool isInstanceMember,
String nativeMethodName})
: super(
metadata,
modifiers,
@ -243,15 +251,27 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
typeVariables,
formals,
kind,
compilationUnit,
libraryBuilder,
startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
procedureReference,
isExtensionInstanceMember,
nativeMethodName) {
procedureNameScheme,
isExtensionMember: isExtensionMember,
isInstanceMember: isInstanceMember,
nativeMethodName: nativeMethodName) {
this.asyncModifier = asyncModifier;
if (isExtensionMember && isInstanceMember && kind == ProcedureKind.Method) {
_extensionTearOff ??= new Procedure(
procedureNameScheme.getName(ProcedureKind.Getter, name),
ProcedureKind.Method,
null,
isStatic: true,
isExtensionMember: true,
reference: _tearOffReference)
..isNonNullableByDefault = library.isNonNullableByDefault;
}
}
bool _typeEnsured = false;
@ -359,33 +379,26 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
@override
Procedure build(SourceLibraryBuilder libraryBuilder) {
// TODO(ahe): I think we may call this twice on parts. Investigate.
if (_procedure.name == null) {
_procedure.function = buildFunction(libraryBuilder);
_procedure.function.parent = _procedure;
_procedure.function.fileOffset = charOpenParenOffset;
_procedure.function.fileEndOffset = _procedure.fileEndOffset;
_procedure.isAbstract = isAbstract;
_procedure.isExternal = isExternal;
_procedure.isConst = isConst;
if (isExtensionMethod) {
ExtensionBuilder extensionBuilder = parent;
_procedure.isExtensionMember = true;
_procedure.isStatic = true;
if (isExtensionInstanceMember) {
assert(_procedure.kind == ProcedureKind.Method);
}
_procedure.name = new Name(
createProcedureName(true, !isExtensionInstanceMember, kind,
extensionBuilder.name, name),
libraryBuilder.library);
} else {
_procedure.isStatic = isStatic;
_procedure.name = new Name(name, libraryBuilder.library);
}
if (extensionTearOff != null) {
_buildExtensionTearOff(libraryBuilder, parent);
_procedure.function = buildFunction(libraryBuilder);
_procedure.function.parent = _procedure;
_procedure.function.fileOffset = charOpenParenOffset;
_procedure.function.fileEndOffset = _procedure.fileEndOffset;
_procedure.isAbstract = isAbstract;
_procedure.isExternal = isExternal;
_procedure.isConst = isConst;
updatePrivateMemberName(_procedure, libraryBuilder);
if (isExtensionMethod) {
_procedure.isExtensionMember = true;
_procedure.isStatic = true;
if (isExtensionInstanceMember) {
assert(_procedure.kind == ProcedureKind.Method);
}
} else {
_procedure.isStatic = isStatic;
}
if (extensionTearOff != null) {
_buildExtensionTearOff(libraryBuilder, parent);
updatePrivateMemberName(extensionTearOff, libraryBuilder);
}
return _procedure;
}
@ -442,7 +455,6 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
SourceLibraryBuilder libraryBuilder, ExtensionBuilder extensionBuilder) {
assert(
_extensionTearOff != null, "No extension tear off created for $this.");
if (_extensionTearOff.name != null) return;
_extensionTearOffParameterMap = {};
@ -550,8 +562,6 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
..fileOffset = fileOffset;
_extensionTearOff
..name = new Name(
'${extensionBuilder.name}|get#${name}', libraryBuilder.library)
..function = (new FunctionNode(
new ReturnStatement(closure)..fileOffset = fileOffset,
typeParameters: tearOffTypeParameters,
@ -566,14 +576,7 @@ class SourceProcedureBuilder extends ProcedureBuilderImpl {
_extensionTearOff.function.parent = _extensionTearOff;
}
Procedure get extensionTearOff {
if (isExtensionInstanceMember && kind == ProcedureKind.Method) {
_extensionTearOff ??= new Procedure(null, ProcedureKind.Method, null,
isStatic: true, isExtensionMember: true, reference: _tearOffReference)
..isNonNullableByDefault = library.isNonNullableByDefault;
}
return _extensionTearOff;
}
Procedure get extensionTearOff => _extensionTearOff;
@override
VariableDeclaration getExtensionTearOffParameter(int index) {
@ -663,6 +666,7 @@ class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
int charOpenParenOffset,
int charEndOffset,
Reference reference,
ProcedureNameScheme procedureNameScheme,
[String nativeMethodName,
this.redirectionTarget])
: super(
@ -679,8 +683,10 @@ class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
charOpenParenOffset,
charEndOffset,
reference,
/* isExtensionInstanceMember = */ false,
nativeMethodName);
procedureNameScheme,
isExtensionMember: false,
isInstanceMember: false,
nativeMethodName: nativeMethodName);
@override
Member get readTarget => null;
@ -741,18 +747,14 @@ class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
@override
Procedure build(SourceLibraryBuilder libraryBuilder) {
// TODO(ahe): I think we may call this twice on parts. Investigate.
if (_procedure.name == null) {
_procedure.function = buildFunction(libraryBuilder);
_procedure.function.parent = _procedure;
_procedure.function.fileOffset = charOpenParenOffset;
_procedure.function.fileEndOffset = _procedure.fileEndOffset;
_procedure.isAbstract = isAbstract;
_procedure.isExternal = isExternal;
_procedure.isConst = isConst;
_procedure.isStatic = isStatic;
_procedure.name = new Name(name, libraryBuilder.library);
}
_procedure.function = buildFunction(libraryBuilder);
_procedure.function.parent = _procedure;
_procedure.function.fileOffset = charOpenParenOffset;
_procedure.function.fileEndOffset = _procedure.fileEndOffset;
_procedure.isAbstract = isAbstract;
_procedure.isExternal = isExternal;
_procedure.isConst = isConst;
_procedure.isStatic = isStatic;
_procedure.isRedirectingFactoryConstructor = true;
if (redirectionTarget.typeArguments != null) {
typeArguments = new List<DartType>.filled(
@ -761,6 +763,7 @@ class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
typeArguments[i] = redirectionTarget.typeArguments[i].build(library);
}
}
updatePrivateMemberName(_procedure, libraryBuilder);
return _procedure;
}
@ -863,3 +866,28 @@ class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
return 1;
}
}
class ProcedureNameScheme {
final bool isExtensionMember;
final bool isStatic;
final String extensionName;
final Reference libraryReference;
ProcedureNameScheme(
{this.isExtensionMember,
this.isStatic,
this.extensionName,
this.libraryReference})
: assert(isExtensionMember != null),
assert(isStatic != null),
assert(!isExtensionMember || extensionName != null),
assert(libraryReference != null);
Name getName(ProcedureKind kind, String name) {
assert(kind != null);
return new Name.byReference(
SourceProcedureBuilder.createProcedureName(
isExtensionMember, isStatic, kind, extensionName, name),
libraryReference);
}
}

View file

@ -859,8 +859,8 @@ class OutlineBuilder extends StackListenerImpl {
endToken.charOffset,
nativeMethodName,
asyncModifier,
isTopLevel: true,
isExtensionInstanceMember: false);
isInstanceMember: false,
isExtensionMember: false);
nativeMethodName = null;
}
@ -1211,6 +1211,7 @@ class OutlineBuilder extends StackListenerImpl {
}
final int startCharOffset =
metadata == null ? beginToken.charOffset : metadata.first.charOffset;
bool isExtensionMember = methodKind == _MethodKind.extensionMethod;
libraryBuilder.addProcedure(
metadata,
modifiers,
@ -1225,9 +1226,8 @@ class OutlineBuilder extends StackListenerImpl {
endToken.charOffset,
nativeMethodName,
asyncModifier,
isTopLevel: false,
isExtensionInstanceMember:
methodKind == _MethodKind.extensionMethod && !isStatic);
isInstanceMember: !isStatic,
isExtensionMember: isExtensionMember);
}
nativeMethodName = null;
inConstructor = false;

View file

@ -2152,17 +2152,17 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
hasInitializer: hasInitializer,
isFinal: (modifiers & finalMask) != 0,
isStatic: isTopLevel || (modifiers & staticMask) != 0);
final bool isInstanceMember = currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.classDeclaration &&
final bool isInstanceMember = currentTypeParameterScopeBuilder.kind !=
TypeParameterScopeKind.library &&
(modifiers & staticMask) == 0;
String className;
if (isInstanceMember) {
className = currentTypeParameterScopeBuilder.name;
}
final bool isExtension = currentTypeParameterScopeBuilder.kind ==
final bool isExtensionMember = currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration;
String extensionName;
if (isExtension) {
if (isExtensionMember) {
extensionName = currentTypeParameterScopeBuilder.name;
}
@ -2172,56 +2172,50 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
Reference lateIsSetSetterReference;
Reference lateGetterReference;
Reference lateSetterReference;
FieldNameScheme fieldNameScheme = new FieldNameScheme(
isInstanceMember: isInstanceMember,
className: className,
isExtensionMember: isExtensionMember,
extensionName: extensionName,
libraryReference: referencesFrom?.reference ?? library.reference);
if (referencesFrom != null) {
String nameToLookup = SourceFieldBuilder.createFieldName(
FieldNameType.Field, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering);
IndexedContainer indexedContainer =
_currentClassReferencesFromIndexed ?? referencesFromIndexed;
Name nameToLookupName = new Name(nameToLookup, indexedContainer.library);
Name nameToLookupName = fieldNameScheme.getName(FieldNameType.Field, name,
isSynthesized: fieldIsLateWithLowering);
fieldGetterReference =
indexedContainer.lookupGetterReference(nameToLookupName);
fieldSetterReference =
indexedContainer.lookupSetterReference(nameToLookupName);
if (fieldIsLateWithLowering) {
String lateIsSetName = SourceFieldBuilder.createFieldName(
Name lateIsSetNameName = fieldNameScheme.getName(
FieldNameType.IsSetField, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering);
Name lateIsSetNameName =
new Name(lateIsSetName, indexedContainer.library);
lateIsSetGetterReference =
indexedContainer.lookupGetterReference(lateIsSetNameName);
lateIsSetSetterReference =
indexedContainer.lookupSetterReference(lateIsSetNameName);
lateGetterReference = indexedContainer.lookupGetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering),
indexedContainer.library));
lateSetterReference = indexedContainer.lookupSetterReference(new Name(
SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
isInstanceMember: isInstanceMember,
className: className,
isExtensionMethod: isExtension,
extensionName: extensionName,
isSynthesized: fieldIsLateWithLowering),
indexedContainer.library));
lateGetterReference = indexedContainer.lookupGetterReference(
fieldNameScheme.getName(FieldNameType.Getter, name,
isSynthesized: fieldIsLateWithLowering));
lateSetterReference = indexedContainer.lookupSetterReference(
fieldNameScheme.getName(FieldNameType.Setter, name,
isSynthesized: fieldIsLateWithLowering));
}
}
SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(metadata, type,
name, modifiers, isTopLevel, this, charOffset, charEndOffset,
SourceFieldBuilder fieldBuilder = new SourceFieldBuilder(
metadata,
type,
name,
modifiers,
isTopLevel,
this,
charOffset,
charEndOffset,
fieldNameScheme,
isInstanceMember: isInstanceMember,
fieldGetterReference: fieldGetterReference,
fieldSetterReference: fieldSetterReference,
lateIsSetGetterReference: lateIsSetGetterReference,
@ -2312,10 +2306,20 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
int charEndOffset,
String nativeMethodName,
AsyncMarker asyncModifier,
{bool isTopLevel,
bool isExtensionInstanceMember}) {
assert(isTopLevel != null);
assert(isExtensionInstanceMember != null);
{bool isInstanceMember,
bool isExtensionMember}) {
assert(isInstanceMember != null);
assert(isExtensionMember != null);
assert(!isExtensionMember ||
currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration);
String extensionName =
isExtensionMember ? currentTypeParameterScopeBuilder.name : null;
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
isExtensionMember: isExtensionMember,
extensionName: extensionName,
isStatic: !isInstanceMember,
libraryReference: referencesFrom?.reference ?? library.reference);
if (returnType == null) {
if (kind == ProcedureKind.Operator &&
@ -2328,52 +2332,28 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
Reference procedureReference;
Reference tearOffReference;
if (referencesFrom != null) {
Name nameToLookup = procedureNameScheme.getName(kind, name);
if (_currentClassReferencesFromIndexed != null) {
if (kind == ProcedureKind.Setter) {
procedureReference =
_currentClassReferencesFromIndexed.lookupSetterReference(
new Name(name, _currentClassReferencesFromIndexed.library));
procedureReference = _currentClassReferencesFromIndexed
.lookupSetterReference(nameToLookup);
} else {
procedureReference =
_currentClassReferencesFromIndexed.lookupGetterReference(
new Name(name, _currentClassReferencesFromIndexed.library));
procedureReference = _currentClassReferencesFromIndexed
.lookupGetterReference(nameToLookup);
}
} else {
if (currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration) {
bool extensionIsStatic = (modifiers & staticMask) != 0;
String nameToLookup = SourceProcedureBuilder.createProcedureName(
true,
extensionIsStatic,
kind,
currentTypeParameterScopeBuilder.name,
name);
if (extensionIsStatic && kind == ProcedureKind.Setter) {
procedureReference = referencesFromIndexed.lookupSetterReference(
new Name(nameToLookup, referencesFromIndexed.library));
} else {
procedureReference = referencesFromIndexed.lookupGetterReference(
new Name(nameToLookup, referencesFromIndexed.library));
}
if (kind == ProcedureKind.Method) {
String tearOffNameToLookup =
SourceProcedureBuilder.createProcedureName(
true,
false,
ProcedureKind.Getter,
currentTypeParameterScopeBuilder.name,
name);
tearOffReference = referencesFromIndexed.lookupGetterReference(
new Name(tearOffNameToLookup, referencesFromIndexed.library));
}
if (kind == ProcedureKind.Setter &&
// Extension instance setters are encoded as methods.
!(isExtensionMember && isInstanceMember)) {
procedureReference =
referencesFromIndexed.lookupSetterReference(nameToLookup);
} else {
if (kind == ProcedureKind.Setter) {
procedureReference = referencesFromIndexed.lookupSetterReference(
new Name(name, referencesFromIndexed.library));
} else {
procedureReference = referencesFromIndexed.lookupGetterReference(
new Name(name, referencesFromIndexed.library));
}
procedureReference =
referencesFromIndexed.lookupGetterReference(nameToLookup);
}
if (isExtensionMember && kind == ProcedureKind.Method) {
tearOffReference = referencesFromIndexed.lookupGetterReference(
procedureNameScheme.getName(ProcedureKind.Getter, name));
}
}
}
@ -2393,8 +2373,10 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
procedureReference,
tearOffReference,
asyncModifier,
isExtensionInstanceMember,
nativeMethodName);
procedureNameScheme,
isExtensionMember: isExtensionMember,
isInstanceMember: isInstanceMember,
nativeMethodName: nativeMethodName);
checkTypeVariables(typeVariables, procedureBuilder);
addBuilder(name, procedureBuilder, charOffset,
getterReference: procedureReference);
@ -2434,6 +2416,16 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
procedureName = name;
}
ProcedureNameScheme procedureNameScheme = new ProcedureNameScheme(
isExtensionMember: false,
extensionName: null,
isStatic: true,
libraryReference: referencesFrom != null
? (_currentClassReferencesFromIndexed ?? referencesFromIndexed)
.library
.reference
: library.reference);
Reference reference = _currentClassReferencesFromIndexed
?.lookupConstructor(
new Name(procedureName, _currentClassReferencesFromIndexed.library))
@ -2457,6 +2449,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
charOpenParenOffset,
charEndOffset,
reference,
procedureNameScheme,
nativeMethodName,
redirectionTarget);
} else {
@ -2479,8 +2472,10 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
reference,
null,
asyncModifier,
/* isExtensionInstanceMember = */ false,
nativeMethodName);
procedureNameScheme,
isExtensionMember: false,
isInstanceMember: false,
nativeMethodName: nativeMethodName);
}
TypeParameterScopeBuilder savedDeclaration =

View file

@ -494,15 +494,15 @@ class SourceLoader extends Loader {
// TODO(johnniwinther,jensj): Handle expression in extensions?
Future<Expression> buildExpression(
SourceLibraryBuilder library,
SourceLibraryBuilder libraryBuilder,
String enclosingClass,
bool isClassInstanceMember,
FunctionNode parameters) async {
Token token = await tokenize(library, suppressLexicalErrors: false);
Token token = await tokenize(libraryBuilder, suppressLexicalErrors: false);
if (token == null) return null;
DietListener dietListener = createDietListener(library);
DietListener dietListener = createDietListener(libraryBuilder);
Builder parent = library;
Builder parent = libraryBuilder;
if (enclosingClass != null) {
Builder cls = dietListener.memberScope.lookup(enclosingClass, -1, null);
if (cls is ClassBuilder) {
@ -522,7 +522,7 @@ class SourceLoader extends Loader {
null,
null,
ProcedureKind.Method,
library,
libraryBuilder,
0,
0,
-1,
@ -530,7 +530,12 @@ class SourceLoader extends Loader {
null,
null,
AsyncMarker.Sync,
/* isExtensionInstanceMember = */ false)
new ProcedureNameScheme(
isExtensionMember: false,
isStatic: true,
libraryReference: libraryBuilder.library.reference),
isInstanceMember: false,
isExtensionMember: false)
..parent = parent;
BodyBuilder listener = dietListener.createListener(
builder, dietListener.memberScope,

View file

@ -91,8 +91,8 @@ main() {
'types:1)',
covariance.toString());
Procedure noParameterProcedure =
new Procedure(null, ProcedureKind.Method, new FunctionNode(null));
Procedure noParameterProcedure = new Procedure(
new Name('foo'), ProcedureKind.Method, new FunctionNode(null));
Covariance noParameterProcedureCovariance =
new Covariance.fromMember(noParameterProcedure, forSetter: false);
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
@ -103,7 +103,7 @@ main() {
Expect.isTrue(noParameterProcedureCovariance.isEmpty);
Procedure oneParameterProcedure = new Procedure(
null,
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null,
positionalParameters: [new VariableDeclaration(null)]));
@ -119,7 +119,7 @@ main() {
oneParameterProcedureCovariance);
Procedure positionalParametersProcedure = new Procedure(
null,
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, positionalParameters: [
new VariableDeclaration(null),
@ -148,7 +148,7 @@ main() {
positionalParametersProcedureCovariance);
Procedure namedParametersProcedure = new Procedure(
null,
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, namedParameters: [
new VariableDeclaration('a'),
@ -177,7 +177,7 @@ main() {
namedParametersProcedureCovariance);
Procedure typeParametersProcedure = new Procedure(
null,
new Name('foo'),
ProcedureKind.Method,
new FunctionNode(null, typeParameters: [
new TypeParameter(null),

View file

@ -0,0 +1,23 @@
// 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.
part 'private_members_part.dart';
test(_AbstractClass c) {
c._privateAbstractField = c._privateAbstractField;
}
main() {
_Class c = new _Class._privateConstructor();
c = new _Class._privateRedirectingFactory();
c._privateMethod();
c._privateSetter = c._privateGetter;
c._privateField = c._privateField;
c._privateFinalField;
0._privateMethod();
(0._privateMethod)();
0._privateSetter = 0._privateGetter;
_Extension._privateField = _Extension._privateField;
_Extension._privateFinalField;
}

View file

@ -0,0 +1,4 @@
part 'private_members_part.dart';
test(_AbstractClass c) {}
main() {}

View file

@ -0,0 +1,4 @@
part 'private_members_part.dart';
main() {}
test(_AbstractClass c) {}

View file

@ -0,0 +1,58 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
synthetic constructor •() → self::_AbstractClass
: super core::Object::•()
;
abstract get _privateAbstractField() → core::int;
abstract set _privateAbstractField(core::int #externalFieldValue) → void;
}
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int _privateField = 1;
field core::int _privateFinalField = 1;
static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
constructor _privateConstructor() → self::_Class
: super core::Object::•()
;
static factory _privateRedirectingFactory() → self::_Class
let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
method _privateMethod() → void {}
get _privateGetter() → core::int
return 42;
set _privateSetter(core::int value) → void {}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
method _privateMethod = self::_Extension|_privateMethod;
tearoff _privateMethod = self::_Extension|get#_privateMethod;
get _privateGetter = self::_Extension|get#_privateGetter;
static field _privateField = self::_Extension|_privateField;
static field _privateFinalField = self::_Extension|_privateFinalField;
set _privateSetter = self::_Extension|set#_privateSetter;
}
static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static method test(self::_AbstractClass c) → dynamic {
c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
}
static method main() → dynamic {
self::_Class c = new self::_Class::_privateConstructor();
c = new self::_Class::_privateConstructor();
c.{self::_Class::_privateMethod}();
c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
c.{self::_Class::_privateFinalField};
self::_Extension|_privateMethod(0);
self::_Extension|get#_privateMethod(0).call();
self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
self::_Extension|_privateField = self::_Extension|_privateField;
self::_Extension|_privateFinalField;
}
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
return () → void => self::_Extension|_privateMethod(#this);
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
return 42;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}

View file

@ -0,0 +1,48 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
synthetic constructor •() → self::_AbstractClass
;
abstract get _privateAbstractField() → core::int;
abstract set _privateAbstractField(core::int #externalFieldValue) → void;
}
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int _privateField;
field core::int _privateFinalField;
static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
constructor _privateConstructor() → self::_Class
;
static factory _privateRedirectingFactory() → self::_Class
let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
method _privateMethod() → void
;
get _privateGetter() → core::int
;
set _privateSetter(core::int value) → void
;
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
method _privateMethod = self::_Extension|_privateMethod;
tearoff _privateMethod = self::_Extension|get#_privateMethod;
get _privateGetter = self::_Extension|get#_privateGetter;
static field _privateField = self::_Extension|_privateField;
static field _privateFinalField = self::_Extension|_privateFinalField;
set _privateSetter = self::_Extension|set#_privateSetter;
}
static field core::int _Extension|_privateField /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int _Extension|_privateFinalField /* from org-dartlang-testcase:///private_members_part.dart */;
static method test(self::_AbstractClass c) → dynamic
;
static method main() → dynamic
;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void
;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
return () → void => self::_Extension|_privateMethod(#this);
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void
;

View file

@ -0,0 +1,58 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
synthetic constructor •() → self::_AbstractClass
: super core::Object::•()
;
abstract get _privateAbstractField() → core::int;
abstract set _privateAbstractField(core::int #externalFieldValue) → void;
}
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int _privateField = 1;
field core::int _privateFinalField = 1;
static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
constructor _privateConstructor() → self::_Class
: super core::Object::•()
;
static factory _privateRedirectingFactory() → self::_Class
let Never #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
method _privateMethod() → void {}
get _privateGetter() → core::int
return 42;
set _privateSetter(core::int value) → void {}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
method _privateMethod = self::_Extension|_privateMethod;
tearoff _privateMethod = self::_Extension|get#_privateMethod;
get _privateGetter = self::_Extension|get#_privateGetter;
static field _privateField = self::_Extension|_privateField;
static field _privateFinalField = self::_Extension|_privateFinalField;
set _privateSetter = self::_Extension|set#_privateSetter;
}
static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static method test(self::_AbstractClass c) → dynamic {
c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
}
static method main() → dynamic {
self::_Class c = new self::_Class::_privateConstructor();
c = new self::_Class::_privateConstructor();
c.{self::_Class::_privateMethod}();
c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
c.{self::_Class::_privateFinalField};
self::_Extension|_privateMethod(0);
self::_Extension|get#_privateMethod(0).call();
self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
self::_Extension|_privateField = self::_Extension|_privateField;
self::_Extension|_privateFinalField;
}
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
return () → void => self::_Extension|_privateMethod(#this);
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
return 42;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}

View file

@ -0,0 +1,37 @@
// 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.
part of 'private_members.dart';
abstract class _AbstractClass {
abstract int _privateAbstractField;
}
class _Class {
_Class._privateConstructor();
factory _Class._privateRedirectingFactory() = _Class._privateConstructor;
void _privateMethod() {}
int get _privateGetter => 42;
void set _privateSetter(int value) {}
int _privateField = 1;
int _privateFinalField = 1;
}
extension _Extension on int {
void _privateMethod() {}
int get _privateGetter => 42;
void set _privateSetter(int value) {}
static int _privateField = 1;
static int _privateFinalField = 1;
}

View file

@ -1,7 +1,9 @@
// Copyright (c) 2018, 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.
// @dart=2.9
import './private_method_tearoff_lib.dart';
// `Bar' contains a private method `_f'. The function `baz' is declared in the

View file

@ -0,0 +1,17 @@
// 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.
part 'private_members_part.dart';
main() {
_Class c = new _Class();
c._privateField1 = c._privateField1;
c._privateField2 = c._privateField2;
c._privateFinalField1;
c._privateFinalField2;
_Extension._privateField1 = _Extension._privateField1;
_Extension._privateField2 = _Extension._privateField2;
_Extension._privateFinalField1;
_Extension._privateFinalField2;
}

View file

@ -0,0 +1,109 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int? _#_Class#_privateField1 = null;
field core::int? _#_Class#_privateField2 = null;
field core::bool _#_Class#_privateField2#isSet = false;
field core::int? _#_Class#_privateFinalField1 = null;
field core::int? _#_Class#_privateFinalField2 = null;
field core::bool _#_Class#_privateFinalField2#isSet = false;
synthetic constructor •() → self::_Class
: super core::Object::•()
;
get _privateField1() → core::int
return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
set _privateField1(core::int #t2) → void
this.{self::_Class::_#_Class#_privateField1} = #t2;
get _privateField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
this.{self::_Class::_#_Class#_privateField2} = 1;
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateField2};
}
set _privateField2(core::int? #t3) → void {
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
this.{self::_Class::_#_Class#_privateField2} = #t3;
}
get _privateFinalField1() → core::int
return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
set _privateFinalField1(core::int #t5) → void
this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
get _privateFinalField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField2} = 1;
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateFinalField2};
}
set _privateFinalField2(core::int? #t6) → void {
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
static field _privateField1 = self::_#_Extension|_privateField1;
static get _privateField1 = get self::_Extension|_privateField1;
static set _privateField1 = set self::_Extension|_privateField1;
static field _privateField2 = self::_#_Extension|_privateField2;
static field _privateField2 = self::_#_Extension|_privateField2#isSet;
static get _privateField2 = get self::_Extension|_privateField2;
static set _privateField2 = set self::_Extension|_privateField2;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
}
static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static method main() → dynamic {
self::_Class c = new self::_Class::•();
c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
c.{self::_Class::_privateFinalField1};
c.{self::_Class::_privateFinalField2};
self::_Extension|_privateField1 = self::_Extension|_privateField1;
self::_Extension|_privateField2 = self::_Extension|_privateField2;
self::_Extension|_privateFinalField1;
self::_Extension|_privateFinalField2;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
self::_#_Extension|_privateField1 = #t8;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
if(!self::_#_Extension|_privateField2#isSet) {
self::_#_Extension|_privateField2 = 1;
self::_#_Extension|_privateField2#isSet = true;
}
return self::_#_Extension|_privateField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
self::_#_Extension|_privateField2#isSet = true;
self::_#_Extension|_privateField2 = #t9;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
self::_#_Extension|_privateFinalField1 = #t11;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
if(!self::_#_Extension|_privateFinalField2#isSet) {
self::_#_Extension|_privateFinalField2 = 1;
self::_#_Extension|_privateFinalField2#isSet = true;
}
return self::_#_Extension|_privateFinalField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
self::_#_Extension|_privateFinalField2#isSet = true;
self::_#_Extension|_privateFinalField2 = #t12;
}

View file

@ -0,0 +1,109 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int? _#_Class#_privateField1 = null;
field core::int? _#_Class#_privateField2 = null;
field core::bool _#_Class#_privateField2#isSet = false;
field core::int? _#_Class#_privateFinalField1 = null;
field core::int? _#_Class#_privateFinalField2 = null;
field core::bool _#_Class#_privateFinalField2#isSet = false;
synthetic constructor •() → self::_Class
: super core::Object::•()
;
get _privateField1() → core::int
return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateField1} = 1 : #t1{core::int};
set _privateField1(core::int #t2) → void
this.{self::_Class::_#_Class#_privateField1} = #t2;
get _privateField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
this.{self::_Class::_#_Class#_privateField2} = 1;
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateField2};
}
set _privateField2(core::int? #t3) → void {
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
this.{self::_Class::_#_Class#_privateField2} = #t3;
}
get _privateFinalField1() → core::int
return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4.==(null) ?{core::int} this.{self::_Class::_#_Class#_privateFinalField1} = 1 : #t4{core::int};
set _privateFinalField1(core::int #t5) → void
this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
get _privateFinalField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField2} = 1;
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateFinalField2};
}
set _privateFinalField2(core::int? #t6) → void {
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
static field _privateField1 = self::_#_Extension|_privateField1;
static get _privateField1 = get self::_Extension|_privateField1;
static set _privateField1 = set self::_Extension|_privateField1;
static field _privateField2 = self::_#_Extension|_privateField2;
static field _privateField2 = self::_#_Extension|_privateField2#isSet;
static get _privateField2 = get self::_Extension|_privateField2;
static set _privateField2 = set self::_Extension|_privateField2;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
}
static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static method main() → dynamic {
self::_Class c = new self::_Class::•();
c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
c.{self::_Class::_privateFinalField1};
c.{self::_Class::_privateFinalField2};
self::_Extension|_privateField1 = self::_Extension|_privateField1;
self::_Extension|_privateField2 = self::_Extension|_privateField2;
self::_Extension|_privateFinalField1;
self::_Extension|_privateFinalField2;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int
return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7.==(null) ?{core::int} self::_#_Extension|_privateField1 = 1 : #t7{core::int};
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void
self::_#_Extension|_privateField1 = #t8;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
if(!self::_#_Extension|_privateField2#isSet) {
self::_#_Extension|_privateField2 = 1;
self::_#_Extension|_privateField2#isSet = true;
}
return self::_#_Extension|_privateField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
self::_#_Extension|_privateField2#isSet = true;
self::_#_Extension|_privateField2 = #t9;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int
return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10.==(null) ?{core::int} self::_#_Extension|_privateFinalField1 = 1 : #t10{core::int};
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void
self::_#_Extension|_privateFinalField1 = #t11;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
if(!self::_#_Extension|_privateFinalField2#isSet) {
self::_#_Extension|_privateFinalField2 = 1;
self::_#_Extension|_privateFinalField2#isSet = true;
}
return self::_#_Extension|_privateFinalField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
self::_#_Extension|_privateFinalField2#isSet = true;
self::_#_Extension|_privateFinalField2 = #t12;
}

View file

@ -0,0 +1,3 @@
part 'private_members_part.dart';
main() {}

View file

@ -0,0 +1,3 @@
part 'private_members_part.dart';
main() {}

View file

@ -0,0 +1,143 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int? _#_Class#_privateField1 = null;
field core::bool _#_Class#_privateField1#isSet = false;
field core::int? _#_Class#_privateField2 = null;
field core::bool _#_Class#_privateField2#isSet = false;
field core::int? _#_Class#_privateFinalField1 = null;
field core::bool _#_Class#_privateFinalField1#isSet = false;
field core::int? _#_Class#_privateFinalField2 = null;
field core::bool _#_Class#_privateFinalField2#isSet = false;
synthetic constructor •() → self::_Class
: super core::Object::•()
;
get _privateField1() → core::int {
if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
this.{self::_Class::_#_Class#_privateField1} = 1;
this.{self::_Class::_#_Class#_privateField1#isSet} = true;
}
return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
}
set _privateField1(core::int #t2) → void {
this.{self::_Class::_#_Class#_privateField1#isSet} = true;
this.{self::_Class::_#_Class#_privateField1} = #t2;
}
get _privateField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
this.{self::_Class::_#_Class#_privateField2} = 1;
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateField2};
}
set _privateField2(core::int? #t3) → void {
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
this.{self::_Class::_#_Class#_privateField2} = #t3;
}
get _privateFinalField1() → core::int {
if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField1} = 1;
this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
}
return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
}
set _privateFinalField1(core::int #t5) → void {
this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
}
get _privateFinalField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField2} = 1;
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateFinalField2};
}
set _privateFinalField2(core::int? #t6) → void {
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
static field _privateField1 = self::_#_Extension|_privateField1;
static field _privateField1 = self::_#_Extension|_privateField1#isSet;
static get _privateField1 = get self::_Extension|_privateField1;
static set _privateField1 = set self::_Extension|_privateField1;
static field _privateField2 = self::_#_Extension|_privateField2;
static field _privateField2 = self::_#_Extension|_privateField2#isSet;
static get _privateField2 = get self::_Extension|_privateField2;
static set _privateField2 = set self::_Extension|_privateField2;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
}
static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static method main() → dynamic {
self::_Class c = new self::_Class::•();
c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
c.{self::_Class::_privateFinalField1};
c.{self::_Class::_privateFinalField2};
self::_Extension|_privateField1 = self::_Extension|_privateField1;
self::_Extension|_privateField2 = self::_Extension|_privateField2;
self::_Extension|_privateFinalField1;
self::_Extension|_privateFinalField2;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
if(!self::_#_Extension|_privateField1#isSet) {
self::_#_Extension|_privateField1 = 1;
self::_#_Extension|_privateField1#isSet = true;
}
return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
self::_#_Extension|_privateField1#isSet = true;
self::_#_Extension|_privateField1 = #t8;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
if(!self::_#_Extension|_privateField2#isSet) {
self::_#_Extension|_privateField2 = 1;
self::_#_Extension|_privateField2#isSet = true;
}
return self::_#_Extension|_privateField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
self::_#_Extension|_privateField2#isSet = true;
self::_#_Extension|_privateField2 = #t9;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
if(!self::_#_Extension|_privateFinalField1#isSet) {
self::_#_Extension|_privateFinalField1 = 1;
self::_#_Extension|_privateFinalField1#isSet = true;
}
return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
self::_#_Extension|_privateFinalField1#isSet = true;
self::_#_Extension|_privateFinalField1 = #t11;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
if(!self::_#_Extension|_privateFinalField2#isSet) {
self::_#_Extension|_privateFinalField2 = 1;
self::_#_Extension|_privateFinalField2#isSet = true;
}
return self::_#_Extension|_privateFinalField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
self::_#_Extension|_privateFinalField2#isSet = true;
self::_#_Extension|_privateFinalField2 = #t12;
}

View file

@ -0,0 +1,61 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int? _#_Class#_privateField1;
field core::bool _#_Class#_privateField1#isSet;
field core::int? _#_Class#_privateField2;
field core::bool _#_Class#_privateField2#isSet;
field core::int? _#_Class#_privateFinalField1;
field core::bool _#_Class#_privateFinalField1#isSet;
field core::int? _#_Class#_privateFinalField2;
field core::bool _#_Class#_privateFinalField2#isSet;
synthetic constructor •() → self::_Class
;
get _privateField1() → core::int;
set _privateField1(core::int #t1) → void;
get _privateField2() → core::int?;
set _privateField2(core::int? #t2) → void;
get _privateFinalField1() → core::int;
set _privateFinalField1(core::int #t3) → void;
get _privateFinalField2() → core::int?;
set _privateFinalField2(core::int? #t4) → void;
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
static field _privateField1 = self::_#_Extension|_privateField1;
static field _privateField1 = self::_#_Extension|_privateField1#isSet;
static get _privateField1 = get self::_Extension|_privateField1;
static set _privateField1 = set self::_Extension|_privateField1;
static field _privateField2 = self::_#_Extension|_privateField2;
static field _privateField2 = self::_#_Extension|_privateField2#isSet;
static get _privateField2 = get self::_Extension|_privateField2;
static set _privateField2 = set self::_Extension|_privateField2;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
}
static field core::int? _#_Extension|_privateField1 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateField2 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField1 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField1#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField2 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField2#isSet /* from org-dartlang-testcase:///private_members_part.dart */;
static method main() → dynamic
;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int;
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t5) → void;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int?;
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t6) → void;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int;
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t7) → void;
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int?;
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t8) → void;

View file

@ -0,0 +1,143 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
part private_members_part.dart;
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
field core::int? _#_Class#_privateField1 = null;
field core::bool _#_Class#_privateField1#isSet = false;
field core::int? _#_Class#_privateField2 = null;
field core::bool _#_Class#_privateField2#isSet = false;
field core::int? _#_Class#_privateFinalField1 = null;
field core::bool _#_Class#_privateFinalField1#isSet = false;
field core::int? _#_Class#_privateFinalField2 = null;
field core::bool _#_Class#_privateFinalField2#isSet = false;
synthetic constructor •() → self::_Class
: super core::Object::•()
;
get _privateField1() → core::int {
if(!this.{self::_Class::_#_Class#_privateField1#isSet}) {
this.{self::_Class::_#_Class#_privateField1} = 1;
this.{self::_Class::_#_Class#_privateField1#isSet} = true;
}
return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1} in #t1{core::int};
}
set _privateField1(core::int #t2) → void {
this.{self::_Class::_#_Class#_privateField1#isSet} = true;
this.{self::_Class::_#_Class#_privateField1} = #t2;
}
get _privateField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateField2#isSet}) {
this.{self::_Class::_#_Class#_privateField2} = 1;
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateField2};
}
set _privateField2(core::int? #t3) → void {
this.{self::_Class::_#_Class#_privateField2#isSet} = true;
this.{self::_Class::_#_Class#_privateField2} = #t3;
}
get _privateFinalField1() → core::int {
if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField1} = 1;
this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
}
return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1} in #t4{core::int};
}
set _privateFinalField1(core::int #t5) → void {
this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
}
get _privateFinalField2() → core::int? {
if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}) {
this.{self::_Class::_#_Class#_privateFinalField2} = 1;
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
}
return this.{self::_Class::_#_Class#_privateFinalField2};
}
set _privateFinalField2(core::int? #t6) → void {
this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
}
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
static field _privateField1 = self::_#_Extension|_privateField1;
static field _privateField1 = self::_#_Extension|_privateField1#isSet;
static get _privateField1 = get self::_Extension|_privateField1;
static set _privateField1 = set self::_Extension|_privateField1;
static field _privateField2 = self::_#_Extension|_privateField2;
static field _privateField2 = self::_#_Extension|_privateField2#isSet;
static get _privateField2 = get self::_Extension|_privateField2;
static set _privateField2 = set self::_Extension|_privateField2;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
}
static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
static method main() → dynamic {
self::_Class c = new self::_Class::•();
c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1};
c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2};
c.{self::_Class::_privateFinalField1};
c.{self::_Class::_privateFinalField2};
self::_Extension|_privateField1 = self::_Extension|_privateField1;
self::_Extension|_privateField2 = self::_Extension|_privateField2;
self::_Extension|_privateFinalField1;
self::_Extension|_privateFinalField2;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
if(!self::_#_Extension|_privateField1#isSet) {
self::_#_Extension|_privateField1 = 1;
self::_#_Extension|_privateField1#isSet = true;
}
return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
self::_#_Extension|_privateField1#isSet = true;
self::_#_Extension|_privateField1 = #t8;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
if(!self::_#_Extension|_privateField2#isSet) {
self::_#_Extension|_privateField2 = 1;
self::_#_Extension|_privateField2#isSet = true;
}
return self::_#_Extension|_privateField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
self::_#_Extension|_privateField2#isSet = true;
self::_#_Extension|_privateField2 = #t9;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
if(!self::_#_Extension|_privateFinalField1#isSet) {
self::_#_Extension|_privateFinalField1 = 1;
self::_#_Extension|_privateFinalField1#isSet = true;
}
return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
self::_#_Extension|_privateFinalField1#isSet = true;
self::_#_Extension|_privateFinalField1 = #t11;
}
static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
if(!self::_#_Extension|_privateFinalField2#isSet) {
self::_#_Extension|_privateFinalField2 = 1;
self::_#_Extension|_privateFinalField2#isSet = true;
}
return self::_#_Extension|_privateFinalField2;
}
static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
self::_#_Extension|_privateFinalField2#isSet = true;
self::_#_Extension|_privateFinalField2 = #t12;
}

View file

@ -0,0 +1,25 @@
// 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.
part of 'private_members.dart';
class _Class {
late int _privateField1 = 1;
late int? _privateField2 = 1;
late int _privateFinalField1 = 1;
late int? _privateFinalField2 = 1;
}
extension _Extension on int {
static late int _privateField1 = 1;
static late int? _privateField2 = 1;
static late int _privateFinalField1 = 1;
static late int? _privateFinalField2 = 1;
}

View file

@ -1617,8 +1617,7 @@ abstract class Member extends NamedNode implements Annotatable, FileUriNode {
@override
List<Expression> annotations = const <Expression>[];
// TODO(johnniwinther): Make this non-nullable.
Name? name;
Name name;
/// The URI of the source file this member was loaded from.
@override
@ -1641,7 +1640,10 @@ abstract class Member extends NamedNode implements Annotatable, FileUriNode {
// TODO(asgerf): It might be worthwhile to put this on classes as well.
int transformerFlags = 0;
Member(this.name, this.fileUri, Reference? reference) : super(reference);
Member(this.name, this.fileUri, Reference? reference)
// ignore: unnecessary_null_comparison
: assert(name != null),
super(reference);
Class? get enclosingClass => parent is Class ? parent as Class : null;
Library get enclosingLibrary =>
@ -1751,7 +1753,7 @@ class Field extends Member {
Reference get getterReference => super.reference;
Field.mutable(Name? name,
Field.mutable(Name name,
{this.type: const DynamicType(),
this.initializer,
bool isCovariant: false,
@ -1775,7 +1777,7 @@ class Field extends Member {
this.transformerFlags = transformerFlags;
}
Field.immutable(Name? name,
Field.immutable(Name name,
{this.type: const DynamicType(),
this.initializer,
bool isCovariant: false,
@ -1925,7 +1927,7 @@ class Field extends Member {
void visitChildren(Visitor v) {
visitList(annotations, v);
type.accept(v);
name?.accept(v);
name.accept(v);
initializer?.accept(v);
}
@ -1993,7 +1995,7 @@ class Constructor extends Member {
List<Initializer> initializers;
Constructor(this.function,
{Name? name,
{required Name name,
bool isConst: false,
bool isExternal: false,
bool isSynthetic: false,
@ -2078,7 +2080,7 @@ class Constructor extends Member {
@override
void visitChildren(Visitor v) {
visitList(annotations, v);
name?.accept(v);
name.accept(v);
visitList(initializers, v);
function?.accept(v);
}
@ -2166,7 +2168,7 @@ class RedirectingFactoryConstructor extends Member {
List<VariableDeclaration> namedParameters;
RedirectingFactoryConstructor(this.targetReference,
{Name? name,
{required Name name,
bool isConst: false,
bool isExternal: false,
int transformerFlags: 0,
@ -2263,7 +2265,7 @@ class RedirectingFactoryConstructor extends Member {
visitList(annotations, v);
target?.acceptReference(v);
visitList(typeArguments, v);
name?.accept(v);
name.accept(v);
}
@override
@ -2534,7 +2536,7 @@ class Procedure extends Member {
ProcedureStubKind stubKind;
Reference? stubTargetReference;
Procedure(Name? name, ProcedureKind kind, FunctionNode? function,
Procedure(Name name, ProcedureKind kind, FunctionNode? function,
{bool isAbstract: false,
bool isStatic: false,
bool isExternal: false,
@ -2560,7 +2562,7 @@ class Procedure extends Member {
stubTargetReference:
getMemberReferenceBasedOnProcedureKind(stubTarget, kind));
Procedure._byReferenceRenamed(Name? name, this.kind, this.function,
Procedure._byReferenceRenamed(Name name, this.kind, this.function,
{bool isAbstract: false,
bool isStatic: false,
bool isExternal: false,
@ -2750,7 +2752,7 @@ class Procedure extends Member {
@override
void visitChildren(Visitor v) {
visitList(annotations, v);
name?.accept(v);
name.accept(v);
function?.accept(v);
}
@ -6088,7 +6090,7 @@ class StaticInvocation extends InvocationExpression {
bool isConst;
@override
Name get name => target.name!;
Name get name => target.name;
StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
: this.byReference(
@ -6175,7 +6177,7 @@ class ConstructorInvocation extends InvocationExpression {
bool isConst;
@override
Name get name => target.name!;
Name get name => target.name;
ConstructorInvocation(Constructor target, Arguments arguments,
{bool isConst: false})
@ -6263,9 +6265,9 @@ class ConstructorInvocation extends InvocationExpression {
}
printer.writeClassName(target.enclosingClass.reference);
printer.writeTypeArguments(arguments.types);
if (target.name!.text.isNotEmpty) {
if (target.name.text.isNotEmpty) {
printer.write('.');
printer.write(target.name!.text);
printer.write(target.name.text);
}
printer.writeArguments(arguments, includeTypeArguments: false);
}
@ -13613,7 +13615,8 @@ final Class dummyClass = new Class(name: '');
/// This is used as the removal sentinel in [RemovingTransformer] and can be
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
final Constructor dummyConstructor = new Constructor(dummyFunctionNode);
final Constructor dummyConstructor =
new Constructor(dummyFunctionNode, name: dummyName);
/// Non-nullable [Extension] dummy value.
///
@ -13649,7 +13652,7 @@ final Field dummyField = new Field.mutable(dummyName);
/// used for instance as a dummy initial value for the `List.filled`
/// constructor.
final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
new RedirectingFactoryConstructor(null);
new RedirectingFactoryConstructor(null, name: dummyName);
/// Non-nullable [Typedef] dummy value.
///

View file

@ -1443,19 +1443,19 @@ class BinaryBuilder {
if (alwaysCreateNewNamedNodes) {
node = null;
}
if (node == null) {
if (setterReference != null) {
node = new Field.mutable(null,
getterReference: getterReference, setterReference: setterReference);
} else {
node = new Field.immutable(null, getterReference: getterReference);
}
}
Uri? fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readUInt30();
Name name = readName();
if (node == null) {
if (setterReference != null) {
node = new Field.mutable(name,
getterReference: getterReference, setterReference: setterReference);
} else {
node = new Field.immutable(name, getterReference: getterReference);
}
}
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@ -1487,15 +1487,15 @@ class BinaryBuilder {
if (alwaysCreateNewNamedNodes) {
node = null;
}
if (node == null) {
node = new Constructor(null, reference: reference);
}
Uri? fileUri = readUriReference();
int startFileOffset = readOffset();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
Name name = readName();
if (node == null) {
node = new Constructor(null, reference: reference, name: name);
}
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@ -1536,13 +1536,13 @@ class BinaryBuilder {
int kindIndex = readByte();
ProcedureKind kind = ProcedureKind.values[kindIndex];
ProcedureStubKind stubKind = ProcedureStubKind.values[readByte()];
int flags = readUInt30();
Name name = readName();
if (node == null) {
node = new Procedure(null, kind, null, reference: reference);
node = new Procedure(name, kind, null, reference: reference);
} else {
assert(node.kind == kind);
}
int flags = readUInt30();
Name name = readName();
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);
@ -1589,14 +1589,15 @@ class BinaryBuilder {
if (alwaysCreateNewNamedNodes) {
node = null;
}
if (node == null) {
node = new RedirectingFactoryConstructor(null, reference: reference);
}
Uri? fileUri = readUriReference();
int fileOffset = readOffset();
int fileEndOffset = readOffset();
int flags = readByte();
Name name = readName();
if (node == null) {
node = new RedirectingFactoryConstructor(null,
reference: reference, name: name);
}
List<Expression> annotations = readAnnotationList(node);
assert(() {
debugPath.add(name.text);

View file

@ -1192,8 +1192,6 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
_currentlyInNonimplementation = false;
}
static final Name _emptyName = new Name('');
@override
void visitConstructor(Constructor node) {
if (node.reference.canonicalName == null) {
@ -1208,7 +1206,7 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
writeOffset(node.fileEndOffset);
writeByte(node.flags);
writeName(node.name ?? _emptyName);
writeName(node.name);
writeAnnotationList(node.annotations);
assert(node.function!.typeParameters.isEmpty);
@ -1272,7 +1270,7 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
writeByte(node.kind.index);
writeByte(node.stubKind.index);
writeUInt30(node.flags);
writeName(node.name ?? _emptyName);
writeName(node.name);
writeAnnotationList(node.annotations);
writeNullAllowedReference(node.stubTargetReference);
writeOptionalFunctionNode(node.function);
@ -1334,7 +1332,7 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
writeUInt30(node.flags);
writeName(node.name!);
writeName(node.name);
writeAnnotationList(node.annotations);
writeNode(node.type);
writeOptionalNode(node.initializer);
@ -1356,7 +1354,7 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
writeByte(node.flags);
writeName(node.name!);
writeName(node.name);
writeAnnotationList(node.annotations);
writeNonNullReference(node.targetReference!);

View file

@ -133,26 +133,26 @@ class CanonicalName {
CanonicalName getChildFromProcedure(Procedure procedure) {
return getChild(getProcedureQualifier(procedure))
.getChildFromQualifiedName(procedure.name!);
.getChildFromQualifiedName(procedure.name);
}
CanonicalName getChildFromField(Field field) {
return getChild('@getters').getChildFromQualifiedName(field.name!);
return getChild('@getters').getChildFromQualifiedName(field.name);
}
CanonicalName getChildFromFieldSetter(Field field) {
return getChild('@setters').getChildFromQualifiedName(field.name!);
return getChild('@setters').getChildFromQualifiedName(field.name);
}
CanonicalName getChildFromConstructor(Constructor constructor) {
return getChild('@constructors')
.getChildFromQualifiedName(constructor.name!);
.getChildFromQualifiedName(constructor.name);
}
CanonicalName getChildFromRedirectingFactoryConstructor(
RedirectingFactoryConstructor redirectingFactoryConstructor) {
return getChild('@factories')
.getChildFromQualifiedName(redirectingFactoryConstructor.name!);
.getChildFromQualifiedName(redirectingFactoryConstructor.name);
}
CanonicalName getChildFromFieldWithName(Name name) {

View file

@ -282,7 +282,7 @@ abstract class ClassHierarchy implements ClassHierarchyBase {
/// [getDeclaredMembers] and [getInterfaceMembers].
static int compareMembers(Member first, Member second) {
if (first == second) return 0;
return compareNames(first.name!, second.name!);
return compareNames(first.name, second.name);
}
/// Compares names, using the same sort order as [getDeclaredMembers] and
@ -328,7 +328,7 @@ abstract class ClassHierarchy implements ClassHierarchyBase {
while (low <= high) {
int mid = low + ((high - low) >> 1);
Member pivot = members[mid];
int comparison = compareNames(name, pivot.name!);
int comparison = compareNames(name, pivot.name);
if (comparison < 0) {
high = mid - 1;
} else if (comparison > 0) {
@ -417,7 +417,7 @@ class _ClosedWorldClassHierarchySubtypes implements ClassHierarchySubtypes {
Member? getSingleTargetForInterfaceInvocation(Member interfaceTarget,
{bool setter: false}) {
if (invalidated) throw "This data structure has been invalidated";
Name name = interfaceTarget.name!;
Name name = interfaceTarget.name;
Member? target = null;
ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass!);
for (Class c in subtypes) {
@ -1218,7 +1218,7 @@ class ClosedWorldClassHierarchy implements ClassHierarchy {
setters: setters)) {
if (mixinMember is! Procedure ||
(mixinMember is Procedure && !mixinMember.isSynthetic)) {
memberMap[mixinMember.name!] = mixinMember;
memberMap[mixinMember.name] = mixinMember;
}
}
}
@ -1227,21 +1227,21 @@ class ClosedWorldClassHierarchy implements ClassHierarchy {
if (procedure.isStatic) continue;
if (procedure.kind == ProcedureKind.Setter) {
if (setters) {
memberMap[procedure.name!] = procedure;
memberMap[procedure.name] = procedure;
}
} else {
if (!setters) {
memberMap[procedure.name!] = procedure;
memberMap[procedure.name] = procedure;
}
}
}
for (Field field in classNode.fields) {
if (field.isStatic) continue;
if (!setters) {
memberMap[field.name!] = field;
memberMap[field.name] = field;
}
if (setters && field.hasSetter) {
memberMap[field.name!] = field;
memberMap[field.name] = field;
}
}

View file

@ -221,14 +221,14 @@ class _MemberTable {
String getDisambiguatedName(Member member) {
if (member is Procedure) {
if (member.isGetter) return LibraryIndex.getterPrefix + member.name!.text;
if (member.isSetter) return LibraryIndex.setterPrefix + member.name!.text;
if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
}
return member.name!.text;
return member.name.text;
}
void _addMember(Member member) {
if (member.name!.isPrivate && member.name!.library != library) {
if (member.name.isPrivate && member.name.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;
@ -254,7 +254,7 @@ class _MemberTable {
final NamedNode? replacement = extensionMember.member.node;
if (replacement is! Member) return;
Member member = replacement;
if (member.name!.isPrivate && member.name!.library != library) {
if (member.name.isPrivate && member.name.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;

View file

@ -46,7 +46,7 @@ abstract class IndexedContainer {
}
void _addProcedure(Procedure procedure) {
Name name = procedure.name!;
Name name = procedure.name;
if (procedure.isSetter) {
assert(_setterReferences[name] == null);
_setterReferences[name] = procedure.reference;
@ -62,7 +62,7 @@ abstract class IndexedContainer {
void _addFields(List<Field> fields) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Name name = field.name!;
Name name = field.name;
assert(_getterReferences[name] == null);
_getterReferences[name] = field.getterReference;
if (field.hasSetter) {
@ -116,12 +116,12 @@ class IndexedClass extends IndexedContainer {
IndexedClass._(Class c, this.library) {
for (int i = 0; i < c.constructors.length; i++) {
Constructor constructor = c.constructors[i];
_constructors[constructor.name!] = constructor;
_constructors[constructor.name] = constructor;
}
for (int i = 0; i < c.procedures.length; i++) {
Procedure procedure = c.procedures[i];
if (procedure.isFactory) {
_constructors[procedure.name!] = procedure;
_constructors[procedure.name] = procedure;
} else {
_addProcedure(procedure);
}

View file

@ -201,8 +201,7 @@ String qualifiedMemberNameToStringByReference(Reference? reference,
}
String memberNameToString(Member node) {
return node.name?.text ??
"null-named member ${node.runtimeType} ${node.hashCode}";
return node.name.text;
}
String qualifiedTypeParameterNameToString(TypeParameter node,

View file

@ -120,7 +120,7 @@ String debugQualifiedClassName(Class node) {
}
String debugMemberName(Member node) {
return node.name?.text ?? globalDebuggingNames.nameMember(node);
return node.name.text;
}
String debugQualifiedMemberName(Member node) {
@ -367,8 +367,9 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
static final Name emptyName = new Name(emptyNameString);
Name getMemberName(Member node) {
if (node.name?.text == '') return emptyName;
if (node.name != null) return node.name!;
if (node.name.text == '') return emptyName;
// ignore: unnecessary_null_comparison
if (node.name != null) return node.name;
return new Name(syntheticNames.nameMember(node));
}
@ -514,11 +515,11 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
} else if (node is Field) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
write(prefix + '::' + node.name!.text);
write(prefix + '::' + node.name.text);
} else if (node is Procedure) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
write(prefix + '::' + node.name!.text);
write(prefix + '::' + node.name.text);
} else if (node is Typedef) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@ -1251,8 +1252,9 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
writeModifier(node.isConst, 'const');
writeWord('redirecting_factory');
// ignore: unnecessary_null_comparison
if (node.name != null) {
writeName(node.name!);
writeName(node.name);
}
writeTypeParameterList(node.typeParameters);
writeParameterList(node.positionalParameters, node.namedParameters,
@ -1655,7 +1657,7 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
if (!first) {
writeComma();
}
writeWord('${fieldRef.asField.name!.text}');
writeWord('${fieldRef.asField.name.text}');
writeSymbol(':');
writeExpression(value);
first = false;
@ -2635,7 +2637,7 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
writeList(node.fieldValues.entries,
(core.MapEntry<Reference, Constant> entry) {
if (entry.key.node != null) {
writeWord('${entry.key.asField.name!.text}');
writeWord('${entry.key.asField.name.text}');
} else {
writeWord('${entry.key.canonicalName!.name}');
}

View file

@ -1967,7 +1967,7 @@ class MemberTagger implements Tagger<Member> {
TextSerializer<Field> mutableFieldSerializer =
Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
(w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
(w) => Tuple4(w.name, w.flags, w.type, w.initializer),
(u) => Field.mutable(u.first, type: u.third, initializer: u.fourth)
..flags = u.second,
Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@ -1975,7 +1975,7 @@ TextSerializer<Field> mutableFieldSerializer =
TextSerializer<Field> immutableFieldSerializer =
Wrapped<Tuple4<Name, int, DartType, Expression?>, Field>(
(w) => Tuple4(w.name!, w.flags, w.type, w.initializer),
(w) => Tuple4(w.name, w.flags, w.type, w.initializer),
(u) => Field.immutable(u.first, type: u.third, initializer: u.fourth)
..flags = u.second,
Tuple4Serializer(nameSerializer, fieldFlagsSerializer,
@ -1983,7 +1983,7 @@ TextSerializer<Field> immutableFieldSerializer =
TextSerializer<Procedure> methodSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
(w) => Tuple3(w.name!, w.flags, w.function!),
(w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Method, u.third)..flags = u.second,
Tuple3Serializer(
@ -1991,7 +1991,7 @@ TextSerializer<Procedure> methodSerializer =
TextSerializer<Procedure> getterSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
(w) => Tuple3(w.name!, w.flags, w.function!),
(w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Getter, u.third)..flags = u.second,
Tuple3Serializer(
@ -1999,7 +1999,7 @@ TextSerializer<Procedure> getterSerializer =
TextSerializer<Procedure> setterSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
(w) => Tuple3(w.name!, w.flags, w.function!),
(w) => Tuple3(w.name, w.flags, w.function!),
(u) =>
Procedure(u.first, ProcedureKind.Setter, u.third)..flags = u.second,
Tuple3Serializer(
@ -2007,7 +2007,7 @@ TextSerializer<Procedure> setterSerializer =
TextSerializer<Procedure> operatorSerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
(w) => Tuple3(w.name!, w.flags, w.function!),
(w) => Tuple3(w.name, w.flags, w.function!),
(u) => Procedure(u.first, ProcedureKind.Operator, u.third)
..flags = u.second,
Tuple3Serializer(
@ -2015,7 +2015,7 @@ TextSerializer<Procedure> operatorSerializer =
TextSerializer<Procedure> factorySerializer =
Wrapped<Tuple3<Name, int, FunctionNode>, Procedure>(
(w) => Tuple3(w.name!, w.flags, w.function!),
(w) => Tuple3(w.name, w.flags, w.function!),
(u) => Procedure(u.first, ProcedureKind.Factory, u.third)
..flags = u.second,
Tuple3Serializer(
@ -2024,7 +2024,7 @@ TextSerializer<Procedure> factorySerializer =
TextSerializer<Constructor> constructorSerializer = Wrapped<
Tuple3<Name, int, Tuple2<FunctionNode, List<Initializer>?>>,
Constructor>(
(w) => Tuple3(w.name!, w.flags, Tuple2(w.function!, w.initializers)),
(w) => Tuple3(w.name, w.flags, Tuple2(w.function!, w.initializers)),
(u) =>
Constructor(u.third.first, name: u.first, initializers: u.third.second)
..flags = u.second,
@ -2043,7 +2043,7 @@ TextSerializer<RedirectingFactoryConstructor>
List<VariableDeclaration>, List<DartType>>>>,
RedirectingFactoryConstructor>(
(w) => Tuple4(
w.name!,
w.name,
w.flags,
w.targetReference!.canonicalName!,
Tuple2(

View file

@ -113,17 +113,17 @@ class MixinFullResolution {
var setters = <Name, Procedure>{};
for (var procedure in class_.procedures) {
if (procedure.isSetter) {
setters[procedure.name!] = procedure;
setters[procedure.name] = procedure;
} else {
nonSetters[procedure.name!] = procedure;
nonSetters[procedure.name] = procedure;
}
}
for (var field in class_.mixin.fields) {
Reference? getterReference =
indexedClass?.lookupGetterReference(field.name!);
indexedClass?.lookupGetterReference(field.name);
Reference? setterReference =
indexedClass?.lookupSetterReference(field.name!);
indexedClass?.lookupSetterReference(field.name);
if (getterReference == null) {
getterReference = nonSetters[field.name]?.reference;
getterReference?.canonicalName?.unbind();
@ -134,7 +134,7 @@ class MixinFullResolution {
}
Field clone =
cloner.cloneField(field, getterReference, setterReference);
Procedure? setter = setters[field.name!];
Procedure? setter = setters[field.name];
if (setter != null) {
setters.remove(field.name);
VariableDeclaration parameter =
@ -169,9 +169,9 @@ class MixinFullResolution {
Reference? reference;
if (procedure.isSetter) {
reference = indexedClass?.lookupSetterReference(procedure.name!);
reference = indexedClass?.lookupSetterReference(procedure.name);
} else {
reference = indexedClass?.lookupGetterReference(procedure.name!);
reference = indexedClass?.lookupGetterReference(procedure.name);
}
// Linear search for a forwarding stub with the same name.

View file

@ -369,7 +369,7 @@ class WidgetCreatorTracker {
void _transformClassImplementingWidget(
Class clazz, ChangedStructureNotifier? changedStructureNotifier) {
if (clazz.fields
.any((Field field) => field.name!.text == _locationFieldName)) {
.any((Field field) => field.name.text == _locationFieldName)) {
// This class has already been transformed. Skip
return;
}

View file

@ -152,7 +152,7 @@ abstract class TypeEnvironment extends Types {
if (class_ == coreTypes.intClass ||
class_ == coreTypes.numClass ||
class_ == coreTypes.doubleClass) {
String name = member.name!.text;
String name = member.name.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@ -162,7 +162,7 @@ abstract class TypeEnvironment extends Types {
} else {
Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
String name = member.name!.text;
String name = member.name.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@ -180,7 +180,7 @@ abstract class TypeEnvironment extends Types {
if (isNonNullableByDefault) {
Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
String name = member.name!.text;
String name = member.name.text;
return name == 'clamp';
}
}

View file

@ -283,11 +283,11 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
TreeNode? oldParent = enterParent(node);
bool isTopLevel = node.parent == currentLibrary;
if (isTopLevel && !node.isStatic) {
problem(node, "The top-level field '${node.name!.text}' should be static",
problem(node, "The top-level field '${node.name.text}' should be static",
context: node);
}
if (node.isConst && !node.isStatic) {
problem(node, "The const field '${node.name!.text}' should be static",
problem(node, "The const field '${node.name.text}' should be static",
context: node);
}
bool isImmutable = node.isLate
@ -296,7 +296,7 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
if (isImmutable == node.hasSetter) {
if (node.hasSetter) {
problem(node,
"The immutable field '${node.name!.text}' has a setter reference",
"The immutable field '${node.name.text}' has a setter reference",
context: node);
} else {
if (isOutline && node.isLate) {
@ -306,7 +306,7 @@ class VerifyingVisitor extends RecursiveResultVisitor<void> {
// whether it has an initializer or not.
} else {
problem(node,
"The mutable field '${node.name!.text}' has no setter reference",
"The mutable field '${node.name.text}' has no setter reference",
context: node);
}
}