@@ -297,15 +297,21 @@ class _Parameter {
297
297
}
298
298
299
299
sealed class _Property {
300
- final _MemberName name;
300
+ late final _MemberName name;
301
301
final _RawType type;
302
302
final MdnProperty ? mdnProperty;
303
303
304
304
// TODO(srujzs): Remove ignore after
305
305
// https://github.com/dart-lang/sdk/issues/55720 is resolved.
306
306
// ignore: unused_element
307
- _Property (this .name, idl.IDLType idlType, [this .mdnProperty])
308
- : type = _getRawType (idlType);
307
+ _Property (_MemberName name, idl.IDLType idlType, [this .mdnProperty])
308
+ : type = _getRawType (idlType) {
309
+ // Rename the property if there's a collision with the type name.
310
+ final dartName = name.name;
311
+ final jsName = name.jsOverride.isEmpty ? dartName : name.jsOverride;
312
+ this .name =
313
+ dartName == type.type ? _MemberName ('${dartName }_' , jsName) : name;
314
+ }
309
315
}
310
316
311
317
class _Attribute extends _Property {
@@ -357,22 +363,47 @@ abstract class _OverridableMember {
357
363
}
358
364
359
365
class _OverridableOperation extends _OverridableMember {
360
- _MemberName name;
366
+ bool _finalized = false ;
367
+ _MemberName _name;
368
+
361
369
final bool isStatic;
362
370
final _RawType returnType;
363
371
final MdnProperty ? mdnProperty;
372
+ late final _MemberName name = _generateName ();
364
373
365
- _OverridableOperation ._(this .name , this .isStatic, this .returnType,
374
+ _OverridableOperation ._(this ._name , this .isStatic, this .returnType,
366
375
this .mdnProperty, super .parameters);
367
376
368
377
factory _OverridableOperation (idl.Operation operation, _MemberName name,
369
378
MdnProperty ? mdnProperty) =>
370
379
_OverridableOperation ._(name, operation.special == 'static' ,
371
380
_getRawType (operation.idlType), mdnProperty, operation.arguments);
372
381
382
+ _MemberName _generateName () {
383
+ // The name is determined after all updates are done, so finalize the
384
+ // operation.
385
+ _finalized = true ;
386
+ // Rename the member if the name collides with a return or parameter type.
387
+ final dartName = _name.name;
388
+ if (dartName == returnType.type ||
389
+ parameters.any ((parameter) => dartName == parameter.type.type)) {
390
+ underscoreName ();
391
+ }
392
+ return _name;
393
+ }
394
+
395
+ void underscoreName () {
396
+ final jsName = _name.jsOverride.isEmpty ? _name.name : _name.jsOverride;
397
+ _name = _MemberName ('${_name .name }_' , jsName);
398
+ }
399
+
373
400
void update (idl.Operation that) {
374
- final jsOverride = name.jsOverride;
375
- final thisName = jsOverride.isNotEmpty ? jsOverride : name.name;
401
+ assert (
402
+ ! _finalized,
403
+ 'Call to _OverridableOperation.update was made after the operation was '
404
+ 'finalized.' );
405
+ final jsOverride = _name.jsOverride;
406
+ final thisName = jsOverride.isNotEmpty ? jsOverride : _name.name;
376
407
assert (thisName == that.name && isStatic == (that.special == 'static' ));
377
408
returnType.update (that.idlType);
378
409
_processParameters (that.arguments);
@@ -462,28 +493,23 @@ class _PartialInterfacelike {
462
493
final isStatic = operation.special == 'static' ;
463
494
if (! _shouldGenerateMember (operationName, isStatic: isStatic)) break ;
464
495
final docs = mdnInterface? .propertyFor (operationName);
496
+ // Static member may have the same name as instance members in the
497
+ // IDL, but not in Dart. Rename the static member if so.
465
498
if (isStatic) {
466
499
if (staticOperations.containsKey (operationName)) {
467
500
staticOperations[operationName]! .update (operation);
468
501
} else {
469
- final _MemberName memberName;
502
+ staticOperations[operationName] = _OverridableOperation (
503
+ operation, _MemberName (operationName), docs);
470
504
if (operations.containsKey (operationName)) {
471
- memberName = _MemberName ('${operationName }_' , operationName);
472
- } else {
473
- memberName = _MemberName (operationName);
505
+ staticOperations[operationName]! .underscoreName ();
474
506
}
475
- staticOperations[operationName] =
476
- _OverridableOperation (operation, memberName, docs);
477
507
}
478
508
} else {
479
509
if (operations.containsKey (operationName)) {
480
510
operations[operationName]! .update (operation);
481
511
} else {
482
- final staticOperation = staticOperations[operationName];
483
- if (staticOperation != null ) {
484
- staticOperation.name =
485
- _MemberName ('${operationName }_' , operationName);
486
- }
512
+ staticOperations[operationName]? .underscoreName ();
487
513
operations[operationName] = _OverridableOperation (
488
514
operation, _MemberName (operationName), docs);
489
515
}
0 commit comments