@@ -20,6 +20,7 @@ import '../builder/class_builder.dart';
20
20
import '../builder/declaration_builder.dart' ;
21
21
import '../builder/extension_builder.dart' ;
22
22
import '../builder/invalid_type_declaration_builder.dart' ;
23
+ import '../builder/library_builder.dart' ;
23
24
import '../builder/member_builder.dart' ;
24
25
import '../builder/named_type_builder.dart' ;
25
26
import '../builder/nullability_builder.dart' ;
@@ -1386,12 +1387,18 @@ class StaticAccessGenerator extends Generator {
1386
1387
final int ? typeOffset;
1387
1388
final bool isNullAware;
1388
1389
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
+
1389
1394
StaticAccessGenerator (ExpressionGeneratorHelper helper, Token token,
1390
- this .targetName, this .readTarget, this .writeTarget,
1395
+ this .targetName, this .parentBuilder, this . readTarget, this .writeTarget,
1391
1396
{this .typeOffset, this .isNullAware: false })
1392
1397
// ignore: unnecessary_null_comparison
1393
1398
: assert (targetName != null ),
1394
1399
assert (readTarget != null || writeTarget != null ),
1400
+ assert (parentBuilder is DeclarationBuilder ||
1401
+ parentBuilder is LibraryBuilder ),
1395
1402
super (helper, token);
1396
1403
1397
1404
factory StaticAccessGenerator .fromBuilder (
@@ -1402,19 +1409,44 @@ class StaticAccessGenerator extends Generator {
1402
1409
MemberBuilder ? setterBuilder,
1403
1410
{int ? typeOffset,
1404
1411
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);
1408
1429
}
1409
1430
1410
1431
void _reportNonNullableInNullAwareWarningIfNeeded () {
1411
1432
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
+ }
1418
1450
}
1419
1451
}
1420
1452
0 commit comments