Skip to content

Commit 50239e9

Browse files
authored
Rename members when they collide with return/parameter type names (#265)
Web IDL allows members to have the same name as their return or parameter types. Dart does not, and therefore, we have to rename them. Cleans up some existing code and makes renaming consistent by always adding an underscore if needed.
1 parent 6b8a465 commit 50239e9

File tree

1 file changed

+44
-18
lines changed

1 file changed

+44
-18
lines changed

tool/generator/translator.dart

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -297,15 +297,21 @@ class _Parameter {
297297
}
298298

299299
sealed 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

311317
class _Attribute extends _Property {
@@ -357,22 +363,47 @@ abstract class _OverridableMember {
357363
}
358364

359365
class _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

Comments
 (0)