Allow "field promotion" to apply to abstract getters.

A quirk of analyzer and CFE implementations is that they resolve
property gets such as `foo.bar` to specific field or getter
declarations that may be not be directly defined on the target type;
for example if `foo` has type `B`, and `B` extends `A`, and `A`
contains a field called `bar`, then `foo.bar` is considered to refer
to `A.bar`, for example:

    class A {
      int? bar;
    }
    class B extends A {}
    f(B foo) {
      print(foo.bar); // Resolved to `A.bar`.
    }

This is in contrast with the language specification, which makes a
clean distinction between class _declarations_ and the _interfaces_
implied by those declarations. While a class declaration can contain
(among other things) both getters and fields, which might be concrete
or abstract, an interface doesn't distinguish between getters and
fields, and is inherently abstract.

The advantage of the analyzer/CFE approach is that it allows more
intuitive error messages and "go to definition" behavior, which
benefits users. But it has some ill-defined corner cases involving
complex class hierarchies, because not every property access can be
resolved to a unique declaration (sometimes a getter is multiply
inherited from multiple interfaces, for example). The language spec
approach has the advantage of being well-defined and consistent even
in situations involving complex class hierarchies.

When I initially implemented field promotion, I took advantage of this
quirk of the analyzer and CFE implementations, so that I could make
property gets that refer to field declarations promotable, while
keeping property gets that refer to abstract getter declarations
non-promotable. This caused unpredictable behaviors in the ill-defined
corner cases. It also meant that in certain rare cases, a property
access might not be promoted even when it would be sound to do so
(e.g. a property access might refer to a private abstract getter
declaration, but the only concrete _implementation_ of that abstract
getter was a final field).

This CL changes the rule for promotability so that any get of a
private property is considered promotable, provided that the
containing library doesn't contain any concrete getters, non-final
fields, or external fields with the same name. It no longer matters
whether the private property refers to a field or a getter. This rule
is simpler than the old rule, restores the spec's clean distinction
between class declarations and interfaces, and allows more promotions
without sacrificing soundness.

For additional details please see the breaking change announcement at
https://github.com/dart-lang/sdk/issues/54056, as well as the original
change proposal at https://github.com/dart-lang/language/issues/3328.

Fixes https://github.com/dart-lang/sdk/issues/54056.
Fixes https://github.com/dart-lang/language/issues/3328.

Change-Id: I38ffcb9ecce8bccb93b1b2586a1222a0fb1005a7
Bug: https://github.com/dart-lang/sdk/issues/54056
Bug: https://github.com/dart-lang/language/issues/3328
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/337609
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Paul Berry 2023-12-07 23:40:27 +00:00 committed by Commit Queue
parent 7dda27b543
commit 004f564f40
36 changed files with 374 additions and 301 deletions

View file

@ -1,5 +1,49 @@
## 3.3.0
### Language
- **Breaking Change** [#54056][]: The rules for private field promotion have
been changed so that an abstract getter is considered promotable if there are
no conflicting declarations (i.e., there are no non-final fields, external
fields, concrete getters, or `noSuchMethod` forwarding getters with the same
name in the same library). This makes the implementation more consistent and
allows type promotion in a few rare scenarios where it wasn't prevoiusly
allowed. It is unlikely, but this change could in principle cause a breakage
by changing an inferred type in a way that breaks later code. For example:
```dart
class A {
int? get _field;
}
class B extends A {
final int? _field;
B(this._field);
}
test(A a) {
if (a._field != null) {
var x = a._field; // Previously had type `int?`; now has type `int`
...
x = null; // Previously allowed; now causes a compile-time error.
}
}
```
Affected code can be fixed by adding an explicit type annotation (e.g., in the
above example `var x` can be changed to `int? x`).
It's also possible that some continuous integration configurations might fail
if they have been configured to treat warnings as errors, because the expanded
type promotion could lead to one of the following warnings:
- unnecessary_non_null_assertion
- unnecessary_cast
- invalid_null_aware_operator
These warnings can be addressed in the usual way, by removing the unnecessary
operation in the first two cases, or changing `?.` to `.` in the second case.
[#54056]: https://github.com/dart-lang/sdk/issues/54056
### Libraries
#### `dart:core`

View file

@ -222,16 +222,16 @@ abstract class FieldPromotability<Class extends Object, Field, Getter> {
///
/// [isAbstract] indicates whether the getter is abstract.
///
/// Note that unlike [addField], this method does not return a
/// [PropertyNonPromotabilityReason]. The caller may safely assume that the
/// reason that getters are not promotable is
/// [PropertyNonPromotabilityReason.isNotField].
void addGetter(ClassInfo<Class> classInfo, Getter getter, String name,
/// A return value of `null` indicates that this getter *might* wind up being
/// promotable; any other return value indicates the reason why it
/// *definitely* isn't promotable.
PropertyNonPromotabilityReason? addGetter(
ClassInfo<Class> classInfo, Getter getter, String name,
{required bool isAbstract}) {
// Public fields are never promotable, so we may safely ignore getters with
// public names.
if (!name.startsWith('_')) {
return;
return PropertyNonPromotabilityReason.isNotPrivate;
}
// Record the getter name for later use in computation of `noSuchMethod`
@ -242,6 +242,10 @@ abstract class FieldPromotability<Class extends Object, Field, Getter> {
// The getter is concrete, so no fields with the same name are promotable.
_fieldNonPromoInfo(name).conflictingGetters.add(getter);
return PropertyNonPromotabilityReason.isNotField;
} else {
return null;
}
}

View file

@ -5704,14 +5704,17 @@ Message _withArgumentsFieldNotPromotedBecauseNotFinal(
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name, String string)>
templateFieldNotPromotedBecauseNotPrivate =
const Template<Message Function(String name, String string)>(
"FieldNotPromotedBecauseNotPrivate",
problemMessageTemplate:
r"""'#name' refers to a public field so it couldn't be promoted.""",
correctionMessageTemplate: r"""See #string""",
withArguments: _withArgumentsFieldNotPromotedBecauseNotPrivate);
const Template<
Message Function(
String name,
String
string)> templateFieldNotPromotedBecauseNotPrivate = const Template<
Message Function(String name, String string)>(
"FieldNotPromotedBecauseNotPrivate",
problemMessageTemplate:
r"""'#name' refers to a public property so it couldn't be promoted.""",
correctionMessageTemplate: r"""See #string""",
withArguments: _withArgumentsFieldNotPromotedBecauseNotPrivate);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Message Function(String name, String string)>
@ -5728,7 +5731,7 @@ Message _withArgumentsFieldNotPromotedBecauseNotPrivate(
if (string.isEmpty) throw 'No string provided';
return new Message(codeFieldNotPromotedBecauseNotPrivate,
problemMessage:
"""'${name}' refers to a public field so it couldn't be promoted.""",
"""'${name}' refers to a public property so it couldn't be promoted.""",
correctionMessage: """See ${string}""",
arguments: {'name': name, 'string': string});
}

View file

@ -88,6 +88,8 @@ main() {
check(nonPromotabilityInfo.keys).unorderedEquals({'_f'});
check(nonPromotabilityInfo['_f']!.conflictingGetters)
.unorderedEquals([getter]);
check(getter.nonPromotabilityReason)
.equals(PropertyNonPromotabilityReason.isNotField);
});
test('in an abstract class', () {
@ -98,16 +100,20 @@ main() {
check(nonPromotabilityInfo.keys).unorderedEquals({'_f'});
check(nonPromotabilityInfo['_f']!.conflictingGetters)
.unorderedEquals([getter]);
check(getter.nonPromotabilityReason)
.equals(PropertyNonPromotabilityReason.isNotField);
});
});
test('abstract getter does not render a private field non-promotable', () {
var f = Field('_f', isFinal: true);
var c = Class(fields: [f]);
var d = Class(isAbstract: true, getters: [Getter('_f', isAbstract: true)]);
var getter = Getter('_f', isAbstract: true);
var d = Class(isAbstract: true, getters: [getter]);
var nonPromotabilityInfo = _TestFieldPromotability().run([c, d]);
check(nonPromotabilityInfo).isEmpty();
check(f.nonPromotabilityReason).equals(null);
check(getter.nonPromotabilityReason).equals(null);
});
test('public concrete getter is ignored', () {
@ -115,25 +121,29 @@ main() {
// algorithm to keep track of public concrete getters.
var f = Field('f', isFinal: true);
var c = Class(fields: [f]);
var d = Class(getters: [Getter('f')]);
var getter = Getter('f');
var d = Class(getters: [getter]);
// Therefore the map returned by `_TestFieldPromotability.run` is empty.
var nonPromotabilityInfo = _TestFieldPromotability().run([c, d]);
check(nonPromotabilityInfo).isEmpty();
check(f.nonPromotabilityReason)
.equals(PropertyNonPromotabilityReason.isNotPrivate);
check(getter.nonPromotabilityReason)
.equals(PropertyNonPromotabilityReason.isNotPrivate);
});
group('unimplemented getter renders a field non-promotable:', () {
test('induced by getter', () {
var f = Field('_f', isFinal: true);
var c = Class(fields: [f]);
var d =
Class(isAbstract: true, getters: [Getter('_f', isAbstract: true)]);
var getter = Getter('_f', isAbstract: true);
var d = Class(isAbstract: true, getters: [getter]);
var e = Class(implements: [d]);
var nonPromotabilityInfo = _TestFieldPromotability().run([c, d, e]);
check(nonPromotabilityInfo.keys).unorderedEquals({'_f'});
check(nonPromotabilityInfo['_f']!.conflictingNsmClasses)
.unorderedEquals([e]);
check(getter.nonPromotabilityReason).equals(null);
});
test('induced by field', () {
@ -151,11 +161,13 @@ main() {
test('unimplemented getter in an abstract class is ok', () {
var f = Field('_f', isFinal: true);
var c = Class(fields: [f]);
var d = Class(isAbstract: true, getters: [Getter('_f', isAbstract: true)]);
var getter = Getter('_f', isAbstract: true);
var d = Class(isAbstract: true, getters: [getter]);
var e = Class(isAbstract: true, implements: [d]);
var nonPromotabilityInfo = _TestFieldPromotability().run([c, d, e]);
check(nonPromotabilityInfo).isEmpty();
check(f.nonPromotabilityReason).equals(null);
check(getter.nonPromotabilityReason).equals(null);
});
test('unimplemented abstract field renders a field non-promotable:', () {
@ -237,6 +249,7 @@ class Field {
class Getter {
final String name;
final bool isAbstract;
late final PropertyNonPromotabilityReason? nonPromotabilityReason;
Getter(this.name, {this.isAbstract = false});
}
@ -265,7 +278,8 @@ class _TestFieldPromotability extends FieldPromotability<Class, Field, Getter> {
isExternal: field.isExternal);
}
for (var getter in class_.getters) {
addGetter(classInfo, getter, getter.name,
getter.nonPromotabilityReason = addGetter(
classInfo, getter, getter.name,
isAbstract: getter.isAbstract);
}
}

View file

@ -510,6 +510,7 @@ class TypeSystemOperations
@override
PropertyNonPromotabilityReason? whyPropertyIsNotPromotable(
covariant ExecutableElement property) {
if (property.isPublic) return PropertyNonPromotabilityReason.isNotPrivate;
if (property is! PropertyAccessorElement) {
return PropertyNonPromotabilityReason.isNotField;
}
@ -523,7 +524,6 @@ class TypeSystemOperations
return PropertyNonPromotabilityReason.isNotField;
}
if (field.isPromotable) return null;
if (field.isPublic) return PropertyNonPromotabilityReason.isNotPrivate;
if (field.isExternal) return PropertyNonPromotabilityReason.isExternal;
if (!field.isFinal) return PropertyNonPromotabilityReason.isNotFinal;
// Non-promotion reason must be due to a conflict with some other

View file

@ -5279,7 +5279,7 @@ class _WhyNotPromotedVisitor
PropertyNonPromotabilityReason.isNotField =>
"'$propertyName' refers to a getter so it couldn't be promoted.",
PropertyNonPromotabilityReason.isNotPrivate =>
"'$propertyName' refers to a public field so it couldn't be "
"'$propertyName' refers to a public property so it couldn't be "
"promoted.",
PropertyNonPromotabilityReason.isExternal =>
"'$propertyName' refers to an external field so it couldn't be "

View file

@ -1301,8 +1301,11 @@ class _FieldPromotability extends FieldPromotability<InterfaceElement,
continue;
}
addGetter(classInfo, accessor, accessor.name,
var nonPromotabilityReason = addGetter(classInfo, accessor, accessor.name,
isAbstract: accessor.isAbstract);
if (enabled && nonPromotabilityReason == null) {
_potentiallyPromotableFields.add(accessor.variable as FieldElementImpl);
}
}
}
}

View file

@ -654,9 +654,9 @@ PrefixedIdentifier
identifier: SimpleIdentifier
token: _foo
staticElement: self::@class::C::@getter::_foo
staticType: int?
staticType: int
staticElement: self::@class::C::@getter::_foo
staticType: int?
staticType: int
''');
}

View file

@ -1654,10 +1654,12 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
}
} else if (member is SourceProcedureBuilder && member.isGetter) {
if (member.isSynthetic) continue;
fieldPromotability.addGetter(classInfo, member, member.name,
PropertyNonPromotabilityReason? reason = fieldPromotability.addGetter(
classInfo, member, member.name,
isAbstract: member.isAbstract);
individualPropertyReasons[member.procedure] =
PropertyNonPromotabilityReason.isNotField;
if (reason != null) {
individualPropertyReasons[member.procedure] = reason;
}
}
}
}
@ -1673,7 +1675,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
!member.isStatic &&
member.isGetter) {
individualPropertyReasons[member.procedure] =
PropertyNonPromotabilityReason.isNotField;
member.memberName.isPrivate
? PropertyNonPromotabilityReason.isNotField
: PropertyNonPromotabilityReason.isNotPrivate;
}
}
}
@ -1694,7 +1698,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
!member.isStatic &&
member.isGetter) {
individualPropertyReasons[member.procedure] =
PropertyNonPromotabilityReason.isNotField;
member.memberName.isPrivate
? PropertyNonPromotabilityReason.isNotField
: PropertyNonPromotabilityReason.isNotPrivate;
}
}
}

View file

@ -533,10 +533,6 @@ class OperationsCfe
// We don't promote methods.
return false;
}
if (property.isAbstract && !property.isAbstractFieldAccessor) {
// We don't promote direct references to abstract getter declarations.
return false;
}
}
String name = property.name.text;
if (!name.startsWith('_')) return false;

View file

@ -5547,7 +5547,7 @@ FieldNotPromotedBecauseNotField:
}
FieldNotPromotedBecauseNotPrivate:
problemMessage: "'#name' refers to a public field so it couldn't be promoted."
problemMessage: "'#name' refers to a public property so it couldn't be promoted."
correctionMessage: "See #string"
script: >
class C {

View file

@ -54,8 +54,8 @@ void testPublicField(C c) {
void testPrivateAbstractGetter(C c) {
if (c._privateAbstractGetter != null) {
var x = c._privateAbstractGetter;
// `x` has type `int?` so this is ok
x = null;
// `x` has type `int` so this is ok
acceptsInt(x);
}
}

View file

@ -44,8 +44,8 @@ static method testPublicField(self::C c) → void {
}
static method testPrivateAbstractGetter(self::C c) → void {
if(!(c.{self::C::_privateAbstractGetter}{core::int?} == null)) {
core::int? x = c.{self::C::_privateAbstractGetter}{core::int?};
x = null;
core::int x = c.{self::C::_privateAbstractGetter}{core::int?} as{Unchecked} core::int;
self::acceptsInt(x);
}
}
static method testPublicAbstractGetter(self::C c) → void {

View file

@ -44,8 +44,8 @@ static method testPublicField(self::C c) → void {
}
static method testPrivateAbstractGetter(self::C c) → void {
if(!(c.{self::C::_privateAbstractGetter}{core::int?} == null)) {
core::int? x = c.{self::C::_privateAbstractGetter}{core::int?};
x = null;
core::int x = let core::int? #t2 = c.{self::C::_privateAbstractGetter}{core::int?} in #t2 == null ?{core::int} #t2 as{Unchecked} core::int : #t2{core::int};
self::acceptsInt(x);
}
}
static method testPublicAbstractGetter(self::C c) → void {

View file

@ -44,8 +44,8 @@ static method testPublicField(self::C c) → void {
}
static method testPrivateAbstractGetter(self::C c) → void {
if(!(c.{self::C::_privateAbstractGetter}{core::int?} == null)) {
core::int? x = c.{self::C::_privateAbstractGetter}{core::int?};
x = null;
core::int x = c.{self::C::_privateAbstractGetter}{core::int?} as{Unchecked} core::int;
self::acceptsInt(x);
}
}
static method testPublicAbstractGetter(self::C c) → void {

View file

@ -44,8 +44,8 @@ static method testPublicField(self::C c) → void {
}
static method testPrivateAbstractGetter(self::C c) → void {
if(!(c.{self::C::_privateAbstractGetter}{core::int?} == null)) {
core::int? x = c.{self::C::_privateAbstractGetter}{core::int?};
x = null;
core::int x = c.{self::C::_privateAbstractGetter}{core::int?} as{Unchecked} core::int;
self::acceptsInt(x);
}
}
static method testPublicAbstractGetter(self::C c) → void {

View file

@ -44,8 +44,8 @@ static method testPublicField(self::C c) → void {
}
static method testPrivateAbstractGetter(self::C c) → void {
if(!(c.{self::C::_privateAbstractGetter}{core::int?} == null)) {
core::int? x = c.{self::C::_privateAbstractGetter}{core::int?};
x = null;
core::int x = c.{self::C::_privateAbstractGetter}{core::int?};
self::acceptsInt(x);
}
}
static method testPublicAbstractGetter(self::C c) → void {

View file

@ -12,14 +12,14 @@
extension type E(dynamic d) {
int? get i1 => 0;
// ^^
// [context 1] 'i1' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 3] 'i1' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 5] 'i1' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 7] 'i1' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 9] 'i1' refers to a getter so it couldn't be promoted.
// [context 11] 'i1' refers to a getter so it couldn't be promoted.
// [context 13] 'i1' refers to a getter so it couldn't be promoted.
// [context 15] 'i1' refers to a getter so it couldn't be promoted.
// [context 1] 'i1' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i1' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i1' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'i1' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'i1' refers to a public property so it couldn't be promoted.
// [context 11] 'i1' refers to a public property so it couldn't be promoted.
// [context 13] 'i1' refers to a public property so it couldn't be promoted.
// [context 15] 'i1' refers to a public property so it couldn't be promoted.
int? get _i2 => 0;
// ^^^
// [context 2] '_i2' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field

View file

@ -22,14 +22,14 @@ class C1 {
// [context 43] '_notField' refers to a getter so it couldn't be promoted.
final int? notPrivate = 0;
// ^^^^^^^^^^
// [context 2] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 26] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 32] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 38] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 44] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 2] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 26] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 32] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 38] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 44] 'notPrivate' refers to a public property so it couldn't be promoted.
int? _notFinal = 0;
// ^^^^^^^^^
// [context 3] '_notFinal' refers to a non-final field so it couldn't be promoted. See http://dart.dev/go/non-promo-non-final-field

View file

@ -10,14 +10,14 @@
extension type E(int? i) {
// ^
// [context 1] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public field so it couldn't be promoted.
// [context 6] 'i' refers to a public field so it couldn't be promoted.
// [context 7] 'i' refers to a public field so it couldn't be promoted.
// [context 8] 'i' refers to a public field so it couldn't be promoted.
// [context 1] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public property so it couldn't be promoted.
// [context 6] 'i' refers to a public property so it couldn't be promoted.
// [context 7] 'i' refers to a public property so it couldn't be promoted.
// [context 8] 'i' refers to a public property so it couldn't be promoted.
void viaImplicitThis() {
if (i != null) {
i.isEven;

View file

@ -86,8 +86,8 @@ void testPublicField(C c) {
void testPrivateAbstractGetter(C c) {
if (c._privateAbstractGetter != null) {
var x = c._privateAbstractGetter;
// `x` has type `int?` so this is ok
x = null;
// `x` has type `int` so this is ok
acceptsInt(x);
}
}

View file

@ -2,7 +2,10 @@
// 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.
// Tests that field promotion logic does not try to promote abstract getters.
// Tests that field promotion logic allows promotion of abstract getters.
//
// See https://github.com/dart-lang/language/issues/3328 for the rationale for
// allowing this.
// SharedOptions=--enable-experiment=inference-update-2
@ -21,8 +24,8 @@ void acceptsInt(int x) {}
void testBaseClass(C c) {
if (c._f != null) {
var x = c._f;
// `x` has type `int?` so this is ok
x = null;
// `x` has type `int` so this is ok
acceptsInt(x);
}
}

View file

@ -265,8 +265,8 @@ void notPromotableInTry_promotedInFinally(E e) {
try {
e._c._o1!;
e._o3!;
e._c._o1.expectStaticType<Exactly<Object?>>();
e._o3.expectStaticType<Exactly<Object?>>();
e._c._o1.expectStaticType<Exactly<Object>>();
e._o3.expectStaticType<Exactly<Object>>();
} finally {
e as F;
e._c._o1!;
@ -283,8 +283,8 @@ void assignedButNotPromotableInTry_promotedInFinally(E e, E e2) {
e = e2;
e._c._o1!;
e._o3!;
e._c._o1.expectStaticType<Exactly<Object?>>();
e._o3.expectStaticType<Exactly<Object?>>();
e._c._o1.expectStaticType<Exactly<Object>>();
e._o3.expectStaticType<Exactly<Object>>();
} finally {
e as F;
e._c._o1!;

View file

@ -29,9 +29,9 @@ class C1 {
final int? notPrivate = 0;
// ^^^^^^^^^^
// [context 3] 'notPrivate' couldn't be promoted because field promotion is only available in Dart 3.2 and above. See http://dart.dev/go/non-promo-field-promotion-unavailable
// [context 3] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'notPrivate' couldn't be promoted because field promotion is only available in Dart 3.2 and above.
// [context 10] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 10] 'notPrivate' refers to a public property so it couldn't be promoted.
int? _notFinal = 0;
// ^^^^^^^^^
// [context 4] '_notFinal' couldn't be promoted because field promotion is only available in Dart 3.2 and above. See http://dart.dev/go/non-promo-field-promotion-unavailable

View file

@ -14,8 +14,8 @@ class C {
// [context 4] '_privateGetter' refers to a getter so it couldn't be promoted.
final int? publicField;
// ^^^^^^^^^^^
// [context 2] 'publicField' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'publicField' refers to a public field so it couldn't be promoted.
// [context 2] 'publicField' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'publicField' refers to a public property so it couldn't be promoted.
int? _nonFinalField;
// ^^^^^^^^^^^^^^
// [context 3] '_nonFinalField' refers to a non-final field so it couldn't be promoted. See http://dart.dev/go/non-promo-non-final-field

View file

@ -34,14 +34,14 @@ mixin M {
// [context 43] '_notField' refers to a getter so it couldn't be promoted.
final int? notPrivate = 0;
// ^^^^^^^^^^
// [context 2] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'notPrivate' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 26] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 32] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 38] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 44] 'notPrivate' refers to a public field so it couldn't be promoted.
// [context 2] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'notPrivate' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 26] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 32] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 38] 'notPrivate' refers to a public property so it couldn't be promoted.
// [context 44] 'notPrivate' refers to a public property so it couldn't be promoted.
int? _notFinal = 0;
// ^^^^^^^^^
// [context 3] '_notFinal' refers to a non-final field so it couldn't be promoted. See http://dart.dev/go/non-promo-non-final-field

View file

@ -9,8 +9,8 @@
class C1 {
int? bad;
// ^^^
// [context 1] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 50] 'bad' refers to a public field so it couldn't be promoted.
// [context 1] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 50] 'bad' refers to a public property so it couldn't be promoted.
f(int i) {}
}
@ -26,8 +26,8 @@ required_unnamed(C1 c) {
class C2 {
int? bad;
// ^^^
// [context 2] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 51] 'bad' refers to a public field so it couldn't be promoted.
// [context 2] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 51] 'bad' refers to a public property so it couldn't be promoted.
f([int i = 0]) {}
}
@ -43,8 +43,8 @@ optional_unnamed(C2 c) {
class C3 {
int? bad;
// ^^^
// [context 3] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 52] 'bad' refers to a public field so it couldn't be promoted.
// [context 3] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 52] 'bad' refers to a public property so it couldn't be promoted.
f({required int i}) {}
}
@ -60,8 +60,8 @@ required_named(C3 c) {
class C4 {
int? bad;
// ^^^
// [context 4] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 53] 'bad' refers to a public field so it couldn't be promoted.
// [context 4] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 53] 'bad' refers to a public property so it couldn't be promoted.
f({int i = 0}) {}
}
@ -77,8 +77,8 @@ optional_named(C4 c) {
class C5 {
List<int>? bad;
// ^^^
// [context 5] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 54] 'bad' refers to a public field so it couldn't be promoted.
// [context 5] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 54] 'bad' refers to a public property so it couldn't be promoted.
f<T>(List<T> x) {}
}
@ -94,8 +94,8 @@ type_inferred(C5 c) {
class C6 {
int? bad;
// ^^^
// [context 6] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 55] 'bad' refers to a public field so it couldn't be promoted.
// [context 6] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 55] 'bad' refers to a public property so it couldn't be promoted.
C6(int i);
}
@ -111,8 +111,8 @@ C6? constructor_with_implicit_new(C6 c) {
class C7 {
int? bad;
// ^^^
// [context 7] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 56] 'bad' refers to a public field so it couldn't be promoted.
// [context 7] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 56] 'bad' refers to a public property so it couldn't be promoted.
C7(int i);
}
@ -128,8 +128,8 @@ C7? constructor_with_explicit_new(C7 c) {
class C8 {
int? bad;
// ^^^
// [context 8] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 57] 'bad' refers to a public field so it couldn't be promoted.
// [context 8] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 57] 'bad' refers to a public property so it couldn't be promoted.
}
userDefinableBinaryOpRhs(C8 c) {
@ -180,10 +180,10 @@ equalRhs(C10 c, D10 d) {
class C11 {
bool? bad;
// ^^^
// [context 9] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 58] 'bad' refers to a public field so it couldn't be promoted.
// [context 59] 'bad' refers to a public field so it couldn't be promoted.
// [context 9] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 58] 'bad' refers to a public property so it couldn't be promoted.
// [context 59] 'bad' refers to a public property so it couldn't be promoted.
f(bool b) {}
}
@ -204,10 +204,10 @@ andOperand(C11 c, bool b) {
class C12 {
bool? bad;
// ^^^
// [context 11] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 60] 'bad' refers to a public field so it couldn't be promoted.
// [context 61] 'bad' refers to a public field so it couldn't be promoted.
// [context 11] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 60] 'bad' refers to a public property so it couldn't be promoted.
// [context 61] 'bad' refers to a public property so it couldn't be promoted.
f(bool b) {}
}
@ -228,8 +228,8 @@ orOperand(C12 c, bool b) {
class C13 {
bool? bad;
// ^^^
// [context 13] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 62] 'bad' refers to a public field so it couldn't be promoted.
// [context 13] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 62] 'bad' refers to a public property so it couldn't be promoted.
}
assertStatementCondition(C13 c) {
@ -244,8 +244,8 @@ assertStatementCondition(C13 c) {
class C14 {
bool? bad;
// ^^^
// [context 14] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 63] 'bad' refers to a public field so it couldn't be promoted.
// [context 14] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 63] 'bad' refers to a public property so it couldn't be promoted.
C14.assertInitializerCondition(C14 c)
: bad = c.bad!,
assert(c.bad);
@ -258,8 +258,8 @@ class C14 {
class C15 {
bool? bad;
// ^^^
// [context 15] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 64] 'bad' refers to a public field so it couldn't be promoted.
// [context 15] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 64] 'bad' refers to a public property so it couldn't be promoted.
f(bool b) {}
}
@ -275,14 +275,14 @@ notOperand(C15 c) {
class C16 {
bool? bad;
// ^^^
// [context 16] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 17] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 18] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 19] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 65] 'bad' refers to a public field so it couldn't be promoted.
// [context 66] 'bad' refers to a public field so it couldn't be promoted.
// [context 67] 'bad' refers to a public field so it couldn't be promoted.
// [context 68] 'bad' refers to a public field so it couldn't be promoted.
// [context 16] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 17] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 18] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 19] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 65] 'bad' refers to a public property so it couldn't be promoted.
// [context 66] 'bad' refers to a public property so it couldn't be promoted.
// [context 67] 'bad' refers to a public property so it couldn't be promoted.
// [context 68] 'bad' refers to a public property so it couldn't be promoted.
}
forLoopCondition(C16 c) {
@ -312,8 +312,8 @@ forLoopCondition(C16 c) {
class C17 {
bool? bad;
// ^^^
// [context 20] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 69] 'bad' refers to a public field so it couldn't be promoted.
// [context 20] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 69] 'bad' refers to a public property so it couldn't be promoted.
f(int i) {}
}
@ -329,8 +329,8 @@ conditionalExpressionCondition(C17 c) {
class C18 {
bool? bad;
// ^^^
// [context 21] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 70] 'bad' refers to a public field so it couldn't be promoted.
// [context 21] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 70] 'bad' refers to a public property so it couldn't be promoted.
}
doLoopCondition(C18 c) {
@ -345,14 +345,14 @@ doLoopCondition(C18 c) {
class C19 {
bool? bad;
// ^^^
// [context 22] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 23] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 24] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 25] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 71] 'bad' refers to a public field so it couldn't be promoted.
// [context 72] 'bad' refers to a public field so it couldn't be promoted.
// [context 73] 'bad' refers to a public field so it couldn't be promoted.
// [context 74] 'bad' refers to a public field so it couldn't be promoted.
// [context 22] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 23] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 24] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 25] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 71] 'bad' refers to a public property so it couldn't be promoted.
// [context 72] 'bad' refers to a public property so it couldn't be promoted.
// [context 73] 'bad' refers to a public property so it couldn't be promoted.
// [context 74] 'bad' refers to a public property so it couldn't be promoted.
}
ifCondition(C19 c) {
@ -382,8 +382,8 @@ ifCondition(C19 c) {
class C20 {
bool? bad;
// ^^^
// [context 26] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 75] 'bad' refers to a public field so it couldn't be promoted.
// [context 26] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 75] 'bad' refers to a public property so it couldn't be promoted.
}
whileCondition(C20 c) {
@ -398,8 +398,8 @@ whileCondition(C20 c) {
class C21 {
int? bad;
// ^^^
// [context 27] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 76] 'bad' refers to a public field so it couldn't be promoted.
// [context 27] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 76] 'bad' refers to a public property so it couldn't be promoted.
}
assignmentRhs(C21 c, int i) {
@ -414,8 +414,8 @@ assignmentRhs(C21 c, int i) {
class C22 {
int? bad;
// ^^^
// [context 28] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 77] 'bad' refers to a public field so it couldn't be promoted.
// [context 28] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 77] 'bad' refers to a public property so it couldn't be promoted.
}
variableInitializer(C22 c) {
@ -430,8 +430,8 @@ variableInitializer(C22 c) {
class C23 {
int? bad;
// ^^^
// [context 29] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 78] 'bad' refers to a public field so it couldn't be promoted.
// [context 29] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 78] 'bad' refers to a public property so it couldn't be promoted.
final int x;
final int y;
C23.constructorInitializer(C23 c)
@ -446,14 +446,14 @@ class C23 {
class C24 {
int? bad;
// ^^^
// [context 30] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 31] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 32] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 33] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 79] 'bad' refers to a public field so it couldn't be promoted.
// [context 80] 'bad' refers to a public field so it couldn't be promoted.
// [context 81] 'bad' refers to a public field so it couldn't be promoted.
// [context 82] 'bad' refers to a public field so it couldn't be promoted.
// [context 30] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 31] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 32] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 33] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 79] 'bad' refers to a public property so it couldn't be promoted.
// [context 80] 'bad' refers to a public property so it couldn't be promoted.
// [context 81] 'bad' refers to a public property so it couldn't be promoted.
// [context 82] 'bad' refers to a public property so it couldn't be promoted.
}
forVariableInitializer(C24 c) {
@ -483,14 +483,14 @@ forVariableInitializer(C24 c) {
class C25 {
int? bad;
// ^^^
// [context 34] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 35] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 36] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 37] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 83] 'bad' refers to a public field so it couldn't be promoted.
// [context 84] 'bad' refers to a public field so it couldn't be promoted.
// [context 85] 'bad' refers to a public field so it couldn't be promoted.
// [context 86] 'bad' refers to a public field so it couldn't be promoted.
// [context 34] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 35] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 36] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 37] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 83] 'bad' refers to a public property so it couldn't be promoted.
// [context 84] 'bad' refers to a public property so it couldn't be promoted.
// [context 85] 'bad' refers to a public property so it couldn't be promoted.
// [context 86] 'bad' refers to a public property so it couldn't be promoted.
}
forAssignmentInitializer(C25 c, int i) {
@ -520,8 +520,8 @@ forAssignmentInitializer(C25 c, int i) {
class C26 {
int? bad;
// ^^^
// [context 38] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 87] 'bad' refers to a public field so it couldn't be promoted.
// [context 38] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 87] 'bad' refers to a public property so it couldn't be promoted.
}
compoundAssignmentRhs(C26 c) {
@ -537,8 +537,8 @@ compoundAssignmentRhs(C26 c) {
class C27 {
int? bad;
// ^^^
// [context 39] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 88] 'bad' refers to a public field so it couldn't be promoted.
// [context 39] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 88] 'bad' refers to a public property so it couldn't be promoted.
}
indexGet(C27 c, List<int> values) {
@ -553,8 +553,8 @@ indexGet(C27 c, List<int> values) {
class C28 {
int? bad;
// ^^^
// [context 40] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 89] 'bad' refers to a public field so it couldn't be promoted.
// [context 40] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 89] 'bad' refers to a public property so it couldn't be promoted.
}
indexSet(C28 c, List<int> values) {
@ -569,8 +569,8 @@ indexSet(C28 c, List<int> values) {
class C29 {
int? bad;
// ^^^
// [context 41] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 90] 'bad' refers to a public field so it couldn't be promoted.
// [context 41] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 90] 'bad' refers to a public property so it couldn't be promoted.
}
indexSetCompound(C29 c, List<int> values) {
@ -585,8 +585,8 @@ indexSetCompound(C29 c, List<int> values) {
class C30 {
int? bad;
// ^^^
// [context 42] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 91] 'bad' refers to a public field so it couldn't be promoted.
// [context 42] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 91] 'bad' refers to a public property so it couldn't be promoted.
}
indexSetIfNull(C30 c, List<int?> values) {
@ -601,10 +601,10 @@ indexSetIfNull(C30 c, List<int?> values) {
class C31 {
int? bad;
// ^^^
// [context 43] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 44] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 92] 'bad' refers to a public field so it couldn't be promoted.
// [context 93] 'bad' refers to a public field so it couldn't be promoted.
// [context 43] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 44] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 92] 'bad' refers to a public property so it couldn't be promoted.
// [context 93] 'bad' refers to a public property so it couldn't be promoted.
}
indexSetPreIncDec(C31 c, List<int> values) {
@ -624,10 +624,10 @@ indexSetPreIncDec(C31 c, List<int> values) {
class C32 {
int? bad;
// ^^^
// [context 45] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 46] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 94] 'bad' refers to a public field so it couldn't be promoted.
// [context 95] 'bad' refers to a public field so it couldn't be promoted.
// [context 45] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 46] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 94] 'bad' refers to a public property so it couldn't be promoted.
// [context 95] 'bad' refers to a public property so it couldn't be promoted.
}
indexSetPostIncDec(C32 c, List<int> values) {
@ -651,8 +651,8 @@ extension E33 on int {
class C33 {
int? bad;
// ^^^
// [context 47] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 96] 'bad' refers to a public field so it couldn't be promoted.
// [context 47] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 96] 'bad' refers to a public property so it couldn't be promoted.
}
explicitExtensionInvocation(C33 c) {
@ -667,8 +667,8 @@ explicitExtensionInvocation(C33 c) {
class C34 {
int? bad;
// ^^^
// [context 48] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 97] 'bad' refers to a public field so it couldn't be promoted.
// [context 48] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 97] 'bad' refers to a public property so it couldn't be promoted.
C34(int value);
}
@ -686,8 +686,8 @@ class D34 extends C34 {
class C35 {
int? bad;
// ^^^
// [context 49] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 98] 'bad' refers to a public field so it couldn't be promoted.
// [context 49] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 98] 'bad' refers to a public property so it couldn't be promoted.
}
indexSetRhs(C35 c, List<int> x) {

View file

@ -31,16 +31,16 @@ class C {
extension E on C {
int? get i => null;
// ^
// [context 1] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 2] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 3] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 4] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 5] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 6] 'i' refers to a getter so it couldn't be promoted.
// [context 7] 'i' refers to a getter so it couldn't be promoted.
// [context 8] 'i' refers to a getter so it couldn't be promoted.
// [context 9] 'i' refers to a getter so it couldn't be promoted.
// [context 10] 'i' refers to a getter so it couldn't be promoted.
// [context 1] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public property so it couldn't be promoted.
// [context 7] 'i' refers to a public property so it couldn't be promoted.
// [context 8] 'i' refers to a public property so it couldn't be promoted.
// [context 9] 'i' refers to a public property so it couldn't be promoted.
// [context 10] 'i' refers to a public property so it couldn't be promoted.
int? get j => null;
}

View file

@ -5,18 +5,18 @@
class C {
int? i;
// ^
// [context 1] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'i' refers to a public field so it couldn't be promoted.
// [context 8] 'i' refers to a public field so it couldn't be promoted.
// [context 9] 'i' refers to a public field so it couldn't be promoted.
// [context 10] 'i' refers to a public field so it couldn't be promoted.
// [context 11] 'i' refers to a public field so it couldn't be promoted.
// [context 12] 'i' refers to a public field so it couldn't be promoted.
// [context 1] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'i' refers to a public property so it couldn't be promoted.
// [context 8] 'i' refers to a public property so it couldn't be promoted.
// [context 9] 'i' refers to a public property so it couldn't be promoted.
// [context 10] 'i' refers to a public property so it couldn't be promoted.
// [context 11] 'i' refers to a public property so it couldn't be promoted.
// [context 12] 'i' refers to a public property so it couldn't be promoted.
int? j;
get_field_via_explicit_this() {

View file

@ -10,22 +10,22 @@
class C1 {
List<int>? bad;
// ^^^
// [context 1] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'bad' refers to a public field so it couldn't be promoted.
// [context 10] 'bad' refers to a public field so it couldn't be promoted.
// [context 11] 'bad' refers to a public field so it couldn't be promoted.
// [context 12] 'bad' refers to a public field so it couldn't be promoted.
// [context 13] 'bad' refers to a public field so it couldn't be promoted.
// [context 14] 'bad' refers to a public field so it couldn't be promoted.
// [context 15] 'bad' refers to a public field so it couldn't be promoted.
// [context 16] 'bad' refers to a public field so it couldn't be promoted.
// [context 1] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'bad' refers to a public property so it couldn't be promoted.
// [context 10] 'bad' refers to a public property so it couldn't be promoted.
// [context 11] 'bad' refers to a public property so it couldn't be promoted.
// [context 12] 'bad' refers to a public property so it couldn't be promoted.
// [context 13] 'bad' refers to a public property so it couldn't be promoted.
// [context 14] 'bad' refers to a public property so it couldn't be promoted.
// [context 15] 'bad' refers to a public property so it couldn't be promoted.
// [context 16] 'bad' refers to a public property so it couldn't be promoted.
}
forStatement(C1 c) {

View file

@ -10,8 +10,8 @@
class C1 {
List<int>? bad;
// ^^^
// [context 1] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'bad' refers to a public field so it couldn't be promoted.
// [context 1] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'bad' refers to a public property so it couldn't be promoted.
}
test(C1 c) sync* {

View file

@ -9,8 +9,8 @@
class C1 {
C2? bad;
// ^^^
// [context 1] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'bad' refers to a public field so it couldn't be promoted.
// [context 1] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'bad' refers to a public property so it couldn't be promoted.
}
class C2 {
@ -30,8 +30,8 @@ class C3 {
C4? ok;
C5? bad;
// ^^^
// [context 2] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'bad' refers to a public field so it couldn't be promoted.
// [context 2] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'bad' refers to a public property so it couldn't be promoted.
}
class C4 {}
@ -60,8 +60,8 @@ extension_invocation_method(C3 c) {
class C6 {
C7? bad;
// ^^^
// [context 3] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'bad' refers to a public field so it couldn't be promoted.
// [context 3] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'bad' refers to a public property so it couldn't be promoted.
}
class C7 {
@ -81,8 +81,8 @@ instance_getter_invocation(C6 c) {
class C8 {
C10? bad;
// ^^^
// [context 4] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'bad' refers to a public field so it couldn't be promoted.
// [context 4] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'bad' refers to a public property so it couldn't be promoted.
}
class C10 {}
@ -103,8 +103,8 @@ extension_invocation_getter(C8 c) {
class C11 {
void Function()? bad;
// ^^^
// [context 5] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 11] 'bad' refers to a public field so it couldn't be promoted.
// [context 5] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 11] 'bad' refers to a public property so it couldn't be promoted.
}
function_invocation(C11 c) {
@ -119,8 +119,8 @@ function_invocation(C11 c) {
class C12 {
C13? bad;
// ^^^
// [context 6] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'bad' refers to a public field so it couldn't be promoted.
// [context 6] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'bad' refers to a public property so it couldn't be promoted.
}
class C13 {

View file

@ -9,18 +9,18 @@
class C {
int? i;
// ^
// [context 3] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'i' refers to a public field so it couldn't be promoted.
// [context 11] 'i' refers to a public field so it couldn't be promoted.
// [context 12] 'i' refers to a public field so it couldn't be promoted.
// [context 13] 'i' refers to a public field so it couldn't be promoted.
// [context 3] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'i' refers to a public property so it couldn't be promoted.
// [context 11] 'i' refers to a public property so it couldn't be promoted.
// [context 12] 'i' refers to a public property so it couldn't be promoted.
// [context 13] 'i' refers to a public property so it couldn't be promoted.
void Function()? f;
// ^
// [context 7] 'f' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'f' refers to a public field so it couldn't be promoted.
// [context 7] 'f' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'f' refers to a public property so it couldn't be promoted.
}
extension on int {

View file

@ -9,8 +9,8 @@
class C1 {
int? bad;
// ^^^
// [context 1] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'bad' refers to a public field so it couldn't be promoted.
// [context 1] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'bad' refers to a public property so it couldn't be promoted.
}
userDefinableBinaryOpLhs(C1 c) {
@ -24,8 +24,8 @@ userDefinableBinaryOpLhs(C1 c) {
class C2 {
int? bad;
// ^^^
// [context 2] 'bad' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'bad' refers to a public field so it couldn't be promoted.
// [context 2] 'bad' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'bad' refers to a public property so it couldn't be promoted.
}
userDefinableUnaryOp(C2 c) {

View file

@ -9,44 +9,44 @@
class C {
List<int>? listQuestion;
// ^^^^^^^^^^^^
// [context 1] 'listQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'listQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 11] 'listQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 17] 'listQuestion' refers to a public field so it couldn't be promoted.
// [context 21] 'listQuestion' refers to a public field so it couldn't be promoted.
// [context 27] 'listQuestion' refers to a public field so it couldn't be promoted.
// [context 1] 'listQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'listQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 11] 'listQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 17] 'listQuestion' refers to a public property so it couldn't be promoted.
// [context 21] 'listQuestion' refers to a public property so it couldn't be promoted.
// [context 27] 'listQuestion' refers to a public property so it couldn't be promoted.
Object? objectQuestion;
// ^^^^^^^^^^^^^^
// [context 4] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 15] 'objectQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 24] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 25] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 26] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 30] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 31] 'objectQuestion' refers to a public field so it couldn't be promoted.
// [context 4] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 8] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 9] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 10] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 14] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 15] 'objectQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 20] 'objectQuestion' refers to a public property so it couldn't be promoted.
// [context 24] 'objectQuestion' refers to a public property so it couldn't be promoted.
// [context 25] 'objectQuestion' refers to a public property so it couldn't be promoted.
// [context 26] 'objectQuestion' refers to a public property so it couldn't be promoted.
// [context 30] 'objectQuestion' refers to a public property so it couldn't be promoted.
// [context 31] 'objectQuestion' refers to a public property so it couldn't be promoted.
Set<int>? setQuestion;
// ^^^^^^^^^^^
// [context 2] 'setQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'setQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'setQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 16] 'setQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 18] 'setQuestion' refers to a public field so it couldn't be promoted.
// [context 22] 'setQuestion' refers to a public field so it couldn't be promoted.
// [context 28] 'setQuestion' refers to a public field so it couldn't be promoted.
// [context 32] 'setQuestion' refers to a public field so it couldn't be promoted.
// [context 2] 'setQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'setQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 12] 'setQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 16] 'setQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 18] 'setQuestion' refers to a public property so it couldn't be promoted.
// [context 22] 'setQuestion' refers to a public property so it couldn't be promoted.
// [context 28] 'setQuestion' refers to a public property so it couldn't be promoted.
// [context 32] 'setQuestion' refers to a public property so it couldn't be promoted.
Map<int, int>? mapQuestion;
// ^^^^^^^^^^^
// [context 3] 'mapQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'mapQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 13] 'mapQuestion' refers to a public field so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 19] 'mapQuestion' refers to a public field so it couldn't be promoted.
// [context 23] 'mapQuestion' refers to a public field so it couldn't be promoted.
// [context 29] 'mapQuestion' refers to a public field so it couldn't be promoted.
// [context 3] 'mapQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'mapQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 13] 'mapQuestion' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 19] 'mapQuestion' refers to a public property so it couldn't be promoted.
// [context 23] 'mapQuestion' refers to a public property so it couldn't be promoted.
// [context 29] 'mapQuestion' refers to a public property so it couldn't be promoted.
}
list_from_list_question(C c) {

View file

@ -5,18 +5,18 @@
class C {
int? get i => null;
// ^
// [context 1] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 2] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 3] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 4] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 5] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 6] 'i' refers to a getter so it couldn't be promoted. See http://dart.dev/go/non-promo-non-field
// [context 7] 'i' refers to a getter so it couldn't be promoted.
// [context 8] 'i' refers to a getter so it couldn't be promoted.
// [context 9] 'i' refers to a getter so it couldn't be promoted.
// [context 10] 'i' refers to a getter so it couldn't be promoted.
// [context 11] 'i' refers to a getter so it couldn't be promoted.
// [context 12] 'i' refers to a getter so it couldn't be promoted.
// [context 1] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 2] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 3] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 4] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 5] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 6] 'i' refers to a public property so it couldn't be promoted. See http://dart.dev/go/non-promo-public-field
// [context 7] 'i' refers to a public property so it couldn't be promoted.
// [context 8] 'i' refers to a public property so it couldn't be promoted.
// [context 9] 'i' refers to a public property so it couldn't be promoted.
// [context 10] 'i' refers to a public property so it couldn't be promoted.
// [context 11] 'i' refers to a public property so it couldn't be promoted.
// [context 12] 'i' refers to a public property so it couldn't be promoted.
int? get j => null;
get_property_via_explicit_this() {