@@ -20,6 +20,7 @@ import '../builder/class_builder.dart';
2020import '../builder/declaration_builder.dart' ;
2121import '../builder/extension_builder.dart' ;
2222import '../builder/invalid_type_declaration_builder.dart' ;
23+ import '../builder/library_builder.dart' ;
2324import '../builder/member_builder.dart' ;
2425import '../builder/named_type_builder.dart' ;
2526import '../builder/nullability_builder.dart' ;
@@ -1386,12 +1387,18 @@ class StaticAccessGenerator extends Generator {
13861387 final int ? typeOffset;
13871388 final bool isNullAware;
13881389
1390+ /// The builder for the parent of [readTarget] and [writeTarget] . This is
1391+ /// either the builder for the enclosing library, class, or extension.
1392+ final Builder ? parentBuilder;
1393+
13891394 StaticAccessGenerator (ExpressionGeneratorHelper helper, Token token,
1390- this .targetName, this .readTarget, this .writeTarget,
1395+ this .targetName, this .parentBuilder, this . readTarget, this .writeTarget,
13911396 {this .typeOffset, this .isNullAware: false })
13921397 // ignore: unnecessary_null_comparison
13931398 : assert (targetName != null ),
13941399 assert (readTarget != null || writeTarget != null ),
1400+ assert (parentBuilder is DeclarationBuilder ||
1401+ parentBuilder is LibraryBuilder ),
13951402 super (helper, token);
13961403
13971404 factory StaticAccessGenerator .fromBuilder (
@@ -1402,19 +1409,44 @@ class StaticAccessGenerator extends Generator {
14021409 MemberBuilder ? setterBuilder,
14031410 {int ? typeOffset,
14041411 bool isNullAware: false }) {
1405- return new StaticAccessGenerator (helper, token, targetName,
1406- getterBuilder? .readTarget, setterBuilder? .writeTarget,
1407- typeOffset: typeOffset, isNullAware: isNullAware);
1412+ // If both [getterBuilder] and [setterBuilder] exist, they must both be
1413+ // either top level (potentially from different libraries) or from the same
1414+ // class/extension.
1415+ assert (getterBuilder == null ||
1416+ setterBuilder == null ||
1417+ (getterBuilder.parent is LibraryBuilder &&
1418+ setterBuilder.parent is LibraryBuilder ) ||
1419+ getterBuilder.parent == setterBuilder.parent);
1420+ return new StaticAccessGenerator (
1421+ helper,
1422+ token,
1423+ targetName,
1424+ getterBuilder? .parent ?? setterBuilder? .parent,
1425+ getterBuilder? .readTarget,
1426+ setterBuilder? .writeTarget,
1427+ typeOffset: typeOffset,
1428+ isNullAware: isNullAware);
14081429 }
14091430
14101431 void _reportNonNullableInNullAwareWarningIfNeeded () {
14111432 if (isNullAware && _helper.libraryBuilder.isNonNullableByDefault) {
1412- String className = (readTarget ?? writeTarget)! .enclosingClass! .name;
1413- _helper.libraryBuilder.addProblem (
1414- templateClassInNullAwareReceiver.withArguments (className),
1415- typeOffset ?? fileOffset,
1416- typeOffset != null ? className.length : noLength,
1417- _helper.uri);
1433+ DeclarationBuilder declarationBuilder =
1434+ parentBuilder as DeclarationBuilder ;
1435+ if (declarationBuilder.isExtension) {
1436+ String extensionName = declarationBuilder.name;
1437+ _helper.libraryBuilder.addProblem (
1438+ templateExtensionInNullAwareReceiver.withArguments (extensionName),
1439+ typeOffset ?? fileOffset,
1440+ typeOffset != null ? extensionName.length : noLength,
1441+ _helper.uri);
1442+ } else {
1443+ String className = declarationBuilder.name;
1444+ _helper.libraryBuilder.addProblem (
1445+ templateClassInNullAwareReceiver.withArguments (className),
1446+ typeOffset ?? fileOffset,
1447+ typeOffset != null ? className.length : noLength,
1448+ _helper.uri);
1449+ }
14181450 }
14191451 }
14201452
0 commit comments