11import  { 
2-  ArrayBindingPattern , 
32 FunctionDeclaration , 
43 Identifier , 
4+  isTupleTypeNode , 
5+  isTypeLiteralNode , 
6+  isTypeReferenceNode , 
57 MethodDeclaration , 
68 MethodSignature , 
79 Node , 
8-  ObjectBindingPattern , 
910 ParameterDeclaration , 
11+  PropertySignature , 
1012 SyntaxKind , 
1113 VariableStatement , 
1214}  from  'typescript' ; 
@@ -15,9 +17,18 @@ import { ConstructorDeclaration as TshConstructor } from '../declarations/Constr
1517import  {  DefaultDeclaration  as  TshDefault  }  from  '../declarations/DefaultDeclaration' ; 
1618import  {  FunctionDeclaration  as  TshFunction  }  from  '../declarations/FunctionDeclaration' ; 
1719import  {  MethodDeclaration  as  TshMethod  }  from  '../declarations/MethodDeclaration' ; 
18- import  {  ParameterDeclaration  as  TshParameter  }  from  '../declarations/ParameterDeclaration' ; 
20+ import  { 
21+  ArrayBoundParameterDeclaration , 
22+  ObjectBoundParameterDeclaration , 
23+  ParameterDeclaration  as  TshParameter , 
24+ }  from  '../declarations/ParameterDeclaration' ; 
1925import  {  Resource  }  from  '../resources/Resource' ; 
20- import  {  isArrayBindingPattern ,  isIdentifier ,  isObjectBindingPattern  }  from  '../type-guards/TypescriptGuards' ; 
26+ import  { 
27+  isArrayBindingPattern , 
28+  isIdentifier , 
29+  isObjectBindingPattern , 
30+  isPropertySignature , 
31+ }  from  '../type-guards/TypescriptGuards' ; 
2132import  {  parseIdentifier  }  from  './identifier-parser' ; 
2233import  {  getDefaultResourceIdentifier ,  getNodeType ,  isNodeDefaultExported ,  isNodeExported  }  from  './parse-utilities' ; 
2334import  {  parseVariable  }  from  './variable-parser' ; 
@@ -63,22 +74,51 @@ export function parseMethodParams(
6374) : TshParameter [ ]  { 
6475 return  node . parameters . reduce ( 
6576 ( all : TshParameter [ ] ,  cur : ParameterDeclaration )  =>  { 
66-  let  params  =  all ; 
77+  const  params  =  all ; 
6778 if  ( isIdentifier ( cur . name ) )  { 
6879 params . push ( new  TshParameter ( 
6980 ( cur . name  as  Identifier ) . text ,  getNodeType ( cur . type ) ,  cur . getStart ( ) ,  cur . getEnd ( ) , 
7081 ) ) ; 
71-  }  else  if  ( isObjectBindingPattern ( cur . name )  ||  isArrayBindingPattern ( cur . name ) )  { 
72-  const  identifiers  =  cur . name  as  ObjectBindingPattern  |  ArrayBindingPattern ; 
73-  const  elements  =  [ ...identifiers . elements ] ; 
74-  // TODO: BindingElement 
75-  params  =  params . concat ( < TshParameter [ ] > elements . map ( ( o : any )  =>  { 
76-  if  ( isIdentifier ( o . name ) )  { 
77-  return  new  TshParameter ( 
78-  ( o . name  as  Identifier ) . text ,  undefined ,  o . getStart ( ) ,  o . getEnd ( ) , 
79-  ) ; 
80-  } 
81-  } ) . filter ( Boolean ) ) ; 
82+  }  else  if  ( isObjectBindingPattern ( cur . name ) )  { 
83+  const  elements  =  cur . name . elements ; 
84+  let  types : ( string  |  undefined ) [ ]  =  [ ] ; 
85+  const  boundParam  =  new  ObjectBoundParameterDeclaration ( cur . getStart ( ) ,  cur . getEnd ( ) ) ; 
86+ 
87+  if  ( cur . type  &&  isTypeReferenceNode ( cur . type ) )  { 
88+  boundParam . typeReference  =  getNodeType ( cur . type ) ; 
89+  }  else  if  ( cur . type  &&  isTypeLiteralNode ( cur . type ) )  { 
90+  types  =  cur . type . members 
91+  . filter ( member  =>  isPropertySignature ( member ) ) 
92+  . map ( ( signature : any )  =>  getNodeType ( ( signature  as  PropertySignature ) . type ) ) ; 
93+  } 
94+ 
95+  boundParam . parameters  =  elements . map ( ( bindingElement ,  index )  =>  new  TshParameter ( 
96+  bindingElement . name . getText ( ) , 
97+  types [ index ] , 
98+  bindingElement . getStart ( ) , 
99+  bindingElement . getEnd ( ) , 
100+  ) ) ; 
101+ 
102+  params . push ( boundParam ) ; 
103+  }  else  if  ( isArrayBindingPattern ( cur . name ) )  { 
104+  const  elements  =  cur . name . elements ; 
105+  let  types : ( string  |  undefined ) [ ]  =  [ ] ; 
106+  const  boundParam  =  new  ArrayBoundParameterDeclaration ( cur . getStart ( ) ,  cur . getEnd ( ) ) ; 
107+ 
108+  if  ( cur . type  &&  isTypeReferenceNode ( cur . type ) )  { 
109+  boundParam . typeReference  =  getNodeType ( cur . type ) ; 
110+  }  else  if  ( cur . type  &&  isTupleTypeNode ( cur . type ) )  { 
111+  types  =  cur . type . elementTypes . map ( type  =>  getNodeType ( type ) ) ; 
112+  } 
113+ 
114+  boundParam . parameters  =  elements . map ( ( bindingElement ,  index )  =>  new  TshParameter ( 
115+  bindingElement . getText ( ) , 
116+  types [ index ] , 
117+  bindingElement . getStart ( ) , 
118+  bindingElement . getEnd ( ) , 
119+  ) ) ; 
120+ 
121+  params . push ( boundParam ) ; 
82122 } 
83123 return  params ; 
84124 } , 
0 commit comments