@@ -262,7 +262,7 @@ class SourceExtensionTypeDeclarationBuilder
262
262
if (representationFieldBuilder != null ) {
263
263
TypeBuilder typeBuilder = representationFieldBuilder! .type;
264
264
if (typeBuilder.isExplicit) {
265
- if (_checkRepresentationDependency (typeBuilder, {this }, {})) {
265
+ if (_checkRepresentationDependency (typeBuilder, this , {this }, {})) {
266
266
representationType = const InvalidType ();
267
267
} else {
268
268
representationType =
@@ -309,6 +309,7 @@ class SourceExtensionTypeDeclarationBuilder
309
309
310
310
bool _checkRepresentationDependency (
311
311
TypeBuilder ? typeBuilder,
312
+ ExtensionTypeDeclarationBuilder rootExtensionTypeDeclaration,
312
313
Set <ExtensionTypeDeclarationBuilder > seenExtensionTypeDeclarations,
313
314
Set <TypeAliasBuilder > usedTypeAliasBuilders) {
314
315
TypeBuilder ? unaliased = typeBuilder? .unalias (
@@ -322,7 +323,9 @@ class SourceExtensionTypeDeclarationBuilder
322
323
typeArguments: List <TypeBuilder >? arguments
323
324
):
324
325
if (declaration is ExtensionTypeDeclarationBuilder ) {
325
- if (! seenExtensionTypeDeclarations.add (declaration)) {
326
+ bool declarationSeenFirstTime =
327
+ seenExtensionTypeDeclarations.add (declaration);
328
+ if (declaration == rootExtensionTypeDeclaration) {
326
329
List <LocatedMessage > context = [];
327
330
for (ExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder
328
331
in seenExtensionTypeDeclarations) {
@@ -349,9 +352,10 @@ class SourceExtensionTypeDeclarationBuilder
349
352
} else {
350
353
TypeBuilder ? representationTypeBuilder =
351
354
declaration.declaredRepresentationTypeBuilder;
352
- if (representationTypeBuilder != null ) {
355
+ if (declarationSeenFirstTime && representationTypeBuilder != null ) {
353
356
if (_checkRepresentationDependency (
354
357
representationTypeBuilder,
358
+ rootExtensionTypeDeclaration,
355
359
seenExtensionTypeDeclarations.toSet (),
356
360
usedTypeAliasBuilders.toSet ())) {
357
361
return true ;
@@ -363,6 +367,7 @@ class SourceExtensionTypeDeclarationBuilder
363
367
for (TypeBuilder typeArgument in arguments) {
364
368
if (_checkRepresentationDependency (
365
369
typeArgument,
370
+ rootExtensionTypeDeclaration,
366
371
seenExtensionTypeDeclarations.toSet (),
367
372
usedTypeAliasBuilders.toSet ())) {
368
373
return true ;
@@ -376,6 +381,7 @@ class SourceExtensionTypeDeclarationBuilder
376
381
):
377
382
if (_checkRepresentationDependency (
378
383
returnType,
384
+ rootExtensionTypeDeclaration,
379
385
seenExtensionTypeDeclarations.toSet (),
380
386
usedTypeAliasBuilders.toSet ())) {
381
387
return true ;
@@ -384,6 +390,7 @@ class SourceExtensionTypeDeclarationBuilder
384
390
for (ParameterBuilder formal in formals) {
385
391
if (_checkRepresentationDependency (
386
392
formal.type,
393
+ rootExtensionTypeDeclaration,
387
394
seenExtensionTypeDeclarations.toSet (),
388
395
usedTypeAliasBuilders.toSet ())) {
389
396
return true ;
@@ -395,6 +402,7 @@ class SourceExtensionTypeDeclarationBuilder
395
402
TypeBuilder ? bound = typeVariable.bound;
396
403
if (_checkRepresentationDependency (
397
404
bound,
405
+ rootExtensionTypeDeclaration,
398
406
seenExtensionTypeDeclarations.toSet (),
399
407
usedTypeAliasBuilders.toSet ())) {
400
408
return true ;
@@ -409,6 +417,7 @@ class SourceExtensionTypeDeclarationBuilder
409
417
for (RecordTypeFieldBuilder field in positionalFields) {
410
418
if (_checkRepresentationDependency (
411
419
field.type,
420
+ rootExtensionTypeDeclaration,
412
421
seenExtensionTypeDeclarations.toSet (),
413
422
usedTypeAliasBuilders.toSet ())) {
414
423
return true ;
@@ -419,6 +428,7 @@ class SourceExtensionTypeDeclarationBuilder
419
428
for (RecordTypeFieldBuilder field in namedFields) {
420
429
if (_checkRepresentationDependency (
421
430
field.type,
431
+ rootExtensionTypeDeclaration,
422
432
seenExtensionTypeDeclarations.toSet (),
423
433
usedTypeAliasBuilders.toSet ())) {
424
434
return true ;
0 commit comments