@@ -297,15 +297,21 @@ class _Parameter {
297297}
298298
299299sealed class _Property {
300- final _MemberName name;
300+ late final _MemberName name;
301301 final _RawType type;
302302 final MdnProperty ? mdnProperty;
303303
304304 // TODO(srujzs): Remove ignore after
305305 // https://github.com/dart-lang/sdk/issues/55720 is resolved.
306306 // 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+ }
309315}
310316
311317class _Attribute extends _Property {
@@ -357,22 +363,47 @@ abstract class _OverridableMember {
357363}
358364
359365class _OverridableOperation extends _OverridableMember {
360- _MemberName name;
366+ bool _finalized = false ;
367+ _MemberName _name;
368+
361369 final bool isStatic;
362370 final _RawType returnType;
363371 final MdnProperty ? mdnProperty;
372+ late final _MemberName name = _generateName ();
364373
365- _OverridableOperation ._(this .name , this .isStatic, this .returnType,
374+ _OverridableOperation ._(this ._name , this .isStatic, this .returnType,
366375 this .mdnProperty, super .parameters);
367376
368377 factory _OverridableOperation (idl.Operation operation, _MemberName name,
369378 MdnProperty ? mdnProperty) =>
370379 _OverridableOperation ._(name, operation.special == 'static' ,
371380 _getRawType (operation.idlType), mdnProperty, operation.arguments);
372381
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+
373400 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;
376407 assert (thisName == that.name && isStatic == (that.special == 'static' ));
377408 returnType.update (that.idlType);
378409 _processParameters (that.arguments);
@@ -462,28 +493,23 @@ class _PartialInterfacelike {
462493 final isStatic = operation.special == 'static' ;
463494 if (! _shouldGenerateMember (operationName, isStatic: isStatic)) break ;
464495 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.
465498 if (isStatic) {
466499 if (staticOperations.containsKey (operationName)) {
467500 staticOperations[operationName]! .update (operation);
468501 } else {
469- final _MemberName memberName;
502+ staticOperations[operationName] = _OverridableOperation (
503+ operation, _MemberName (operationName), docs);
470504 if (operations.containsKey (operationName)) {
471- memberName = _MemberName ('${operationName }_' , operationName);
472- } else {
473- memberName = _MemberName (operationName);
505+ staticOperations[operationName]! .underscoreName ();
474506 }
475- staticOperations[operationName] =
476- _OverridableOperation (operation, memberName, docs);
477507 }
478508 } else {
479509 if (operations.containsKey (operationName)) {
480510 operations[operationName]! .update (operation);
481511 } else {
482- final staticOperation = staticOperations[operationName];
483- if (staticOperation != null ) {
484- staticOperation.name =
485- _MemberName ('${operationName }_' , operationName);
486- }
512+ staticOperations[operationName]? .underscoreName ();
487513 operations[operationName] = _OverridableOperation (
488514 operation, _MemberName (operationName), docs);
489515 }
0 commit comments