@@ -597,7 +597,7 @@ class Transformer {
597597 id: id,
598598 scope: scope,
599599 static : isStatic,
600- parameters: params.map (( t) {
600+ parameters: params.mapIndexed ((index, t) {
601601 ReferredType ? paramType;
602602 final paramRawType = t.type;
603603 if (paramRawType case final ty? when ts.isTypeReferenceNode (ty)) {
@@ -612,7 +612,7 @@ class Transformer {
612612 paramType = parent? .asReferredType (
613613 parent.typeParameters.map ((t) => GenericType (name: t.name)));
614614 }
615- return _transformParameter (t, paramType);
615+ return _transformParameter (t, type : paramType, index : index );
616616 }).toList (),
617617 typeParameters:
618618 typeParams? .map (_transformTypeParamDeclaration).toList () ?? [],
@@ -654,7 +654,9 @@ class Transformer {
654654 id: id,
655655 dartName: dartName.trim ().isEmpty ? null : dartName.trim (),
656656 name: name,
657- parameters: params.map (_transformParameter).toList (),
657+ parameters: params
658+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
659+ .toList (),
658660 scope: scope,
659661 documentation: _parseAndTransformDocumentation (constructor));
660662 }
@@ -689,7 +691,9 @@ class Transformer {
689691 name: 'call' ,
690692 dartName: dartName,
691693 id: id,
692- parameters: params.map (_transformParameter).toList (),
694+ parameters: params
695+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
696+ .toList (),
693697 typeParameters:
694698 typeParams? .map (_transformTypeParamDeclaration).toList () ?? [],
695699 returnType: methodType ??
@@ -730,7 +734,9 @@ class Transformer {
730734 }
731735
732736 final doc = _parseAndTransformDocumentation (indexSignature);
733- final transformedParameters = params.map (_transformParameter).toList ();
737+ final transformedParameters = params
738+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
739+ .toList ();
734740 final type = indexerType ?? _transformType (indexSignature.type);
735741 final transformedTypeParams =
736742 typeParams? .map (_transformTypeParamDeclaration).toList () ?? [];
@@ -800,7 +806,9 @@ class Transformer {
800806 id: id,
801807 kind: MethodKind .getter,
802808 scope: scope,
803- parameters: params.map (_transformParameter).toList (),
809+ parameters: params
810+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
811+ .toList (),
804812 typeParameters:
805813 typeParams? .map (_transformTypeParamDeclaration).toList () ?? [],
806814 returnType: methodType ??
@@ -830,7 +838,7 @@ class Transformer {
830838 dartName: dartName,
831839 kind: MethodKind .setter,
832840 id: id,
833- parameters: params.map (( t) {
841+ parameters: params.mapIndexed ((index, t) {
834842 ReferredType ? paramType;
835843 final paramRawType = t.type;
836844 if (paramRawType case final ty? when ts.isTypeReferenceNode (ty)) {
@@ -845,7 +853,7 @@ class Transformer {
845853 paramType = parent? .asReferredType (
846854 parent.typeParameters.map ((t) => GenericType (name: t.name)));
847855 }
848- return _transformParameter (t, paramType);
856+ return _transformParameter (t, type : paramType, index : index );
849857 }).toList (),
850858 scope: scope,
851859 typeParameters:
@@ -880,7 +888,9 @@ class Transformer {
880888 id: id,
881889 dartName: uniqueName,
882890 exported: isExported,
883- parameters: params.map (_transformParameter).toList (),
891+ parameters: params
892+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
893+ .toList (),
884894 typeParameters:
885895 typeParams? .map (_transformTypeParamDeclaration).toList () ?? [],
886896 returnType: function.type != null
@@ -1053,7 +1063,7 @@ class Transformer {
10531063 }
10541064
10551065 ParameterDeclaration _transformParameter (TSParameterDeclaration parameter,
1056- [ Type ? type] ) {
1066+ { Type ? type, int ? index} ) {
10571067 type ?? = parameter.type != null
10581068 ? _transformType (parameter.type! , parameter: true )
10591069 : BuiltinType .anyType;
@@ -1068,11 +1078,82 @@ class Transformer {
10681078 type: type,
10691079 variadic: isVariadic,
10701080 optional: isOptional);
1081+ case TSSyntaxKind .ObjectBindingPattern ||
1082+ TSSyntaxKind .ArrayBindingPattern :
1083+ Iterable <TSDeclaration > expandBindingPatterns (
1084+ @UnionOf (
1085+ [TSIdentifier , TSObjectBindingPattern , TSArrayBindingPattern ])
1086+ TSNode name) {
1087+ switch (name.kind) {
1088+ case TSSyntaxKind .Identifier :
1089+ return [name as TSIdentifier ];
1090+ case TSSyntaxKind .ObjectBindingPattern ||
1091+ TSSyntaxKind .ArrayBindingPattern :
1092+ return (name as TSBindingPattern )
1093+ .elements
1094+ .toDart
1095+ .map ((e) => e.name == null
1096+ ? < TSDeclaration > []
1097+ : expandBindingPatterns (e.name! ))
1098+ .flattenedToList;
1099+ default :
1100+ return [];
1101+ }
1102+ }
1103+ final name = parameter.name as TSBindingPattern ;
1104+ // just return the object
1105+ final elements = expandBindingPatterns (name);
1106+ final elementText = name.getText ();
1107+ final documentation = isVariadic
1108+ ? null
1109+ : Documentation (docs: 'Parameter is of the form: $elementText ' );
1110+
1111+ final rearWord =
1112+ parameter.name.kind == TSSyntaxKind .ObjectBindingPattern
1113+ ? 'obj'
1114+ : 'arr' ;
1115+
1116+ if (elements.isEmpty) {
1117+ return ParameterDeclaration (
1118+ name: 'unknown$rearWord ' ,
1119+ type: type,
1120+ variadic: isVariadic,
1121+ optional: isOptional,
1122+ documentation: documentation);
1123+ } else if (elements.singleOrNull case final singleEl? ) {
1124+ final singleElName = singleEl.kind == TSSyntaxKind .Identifier
1125+ ? (singleEl as TSIdentifier ).text
1126+ : (singleEl as TSNamedDeclaration ).name? .text ?? 'unknown' ;
1127+ return ParameterDeclaration (
1128+ name: '$singleElName $rearWord ' ,
1129+ type: type,
1130+ variadic: isVariadic,
1131+ optional: isOptional,
1132+ documentation: documentation);
1133+ } else {
1134+ final hash = AnonymousHasher .hashTuple (elements
1135+ .map ((e) => e.kind == TSSyntaxKind .Identifier
1136+ ? (e as TSIdentifier ).text
1137+ : (e as TSNamedDeclaration ).name? .text ?? '' )
1138+ .toList ());
1139+ return ParameterDeclaration (
1140+ name: '$rearWord ${hash .substring (0 , 3 )}' ,
1141+ type: type,
1142+ variadic: isVariadic,
1143+ optional: isOptional,
1144+ documentation: documentation);
1145+ }
10711146 default :
1072- // TODO: Support Destructured Object Parameters
1073- // and Destructured Array Parameters
1074- throw Exception (
1075- 'Unsupported Parameter Name kind ${parameter .name .kind }' );
1147+ final elementText = parameter.name.getText ();
1148+ final documentation = isVariadic
1149+ ? null
1150+ : Documentation (docs: 'Parameter is of the form: $elementText ' );
1151+ return ParameterDeclaration (
1152+ name: 'unknown${index ?? "" }' ,
1153+ type: type,
1154+ variadic: isVariadic,
1155+ optional: isOptional,
1156+ documentation: documentation);
10761157 }
10771158 }
10781159
@@ -1247,8 +1328,9 @@ class Transformer {
12471328 case TSSyntaxKind .ConstructorType || TSSyntaxKind .FunctionType :
12481329 final funType = type as TSFunctionOrConstructorTypeNodeBase ;
12491330
1250- final parameters =
1251- funType.parameters.toDart.map (_transformParameter).toList ();
1331+ final parameters = funType.parameters.toDart
1332+ .mapIndexed ((index, p) => _transformParameter (p, index: index))
1333+ .toList ();
12521334
12531335 final typeParameters = funType.typeParameters? .toDart
12541336 .map (_transformTypeParamDeclaration)
0 commit comments