Skip to content

Commit 74c777b

Browse files
committed
feat: spread param
1 parent 94650b6 commit 74c777b

File tree

5 files changed

+238
-6
lines changed

5 files changed

+238
-6
lines changed

packages/analyzer/fixtures/03-module/functionLike/fixture/custom-elements.json

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,45 @@
164164
"name": "emptyReturn",
165165
"kind": "function"
166166
},
167+
{
168+
"kind": "function",
169+
"name": "functionWithRestParam1",
170+
"parameters": [
171+
{
172+
"name": "args",
173+
"type": {
174+
"text": "string"
175+
},
176+
"rest": true
177+
}
178+
]
179+
},
180+
{
181+
"kind": "function",
182+
"name": "functionWithRestParam2",
183+
"parameters": [
184+
{
185+
"name": "args",
186+
"type": {
187+
"text": "number"
188+
},
189+
"rest": true
190+
}
191+
]
192+
},
193+
{
194+
"kind": "function",
195+
"name": "functionWithRestParam3",
196+
"parameters": [
197+
{
198+
"name": "args",
199+
"type": {
200+
"text": "number"
201+
},
202+
"rest": true
203+
}
204+
]
205+
},
167206
{
168207
"kind": "class",
169208
"description": "METHODS",
@@ -244,6 +283,45 @@
244283
}
245284
}
246285
]
286+
},
287+
{
288+
"kind": "method",
289+
"name": "functionWithRestParam1",
290+
"parameters": [
291+
{
292+
"name": "args",
293+
"type": {
294+
"text": "string"
295+
},
296+
"rest": true
297+
}
298+
]
299+
},
300+
{
301+
"kind": "method",
302+
"name": "functionWithRestParam2",
303+
"parameters": [
304+
{
305+
"name": "args",
306+
"type": {
307+
"text": "number"
308+
},
309+
"rest": true
310+
}
311+
]
312+
},
313+
{
314+
"kind": "method",
315+
"name": "functionWithRestParam3",
316+
"parameters": [
317+
{
318+
"name": "args",
319+
"type": {
320+
"text": "number"
321+
},
322+
"rest": true
323+
}
324+
]
247325
}
248326
]
249327
}
@@ -353,6 +431,30 @@
353431
},
354432
"kind": "js"
355433
},
434+
{
435+
"kind": "js",
436+
"name": "functionWithRestParam1",
437+
"declaration": {
438+
"name": "functionWithRestParam1",
439+
"module": "my-element.js"
440+
}
441+
},
442+
{
443+
"kind": "js",
444+
"name": "functionWithRestParam2",
445+
"declaration": {
446+
"name": "functionWithRestParam2",
447+
"module": "my-element.js"
448+
}
449+
},
450+
{
451+
"kind": "js",
452+
"name": "functionWithRestParam3",
453+
"declaration": {
454+
"name": "functionWithRestParam3",
455+
"module": "my-element.js"
456+
}
457+
},
356458
{
357459
"kind": "js",
358460
"name": "MyEl",

packages/analyzer/fixtures/03-module/functionLike/output.json

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,45 @@
164164
"kind": "function",
165165
"name": "emptyReturn"
166166
},
167+
{
168+
"kind": "function",
169+
"name": "functionWithRestParam1",
170+
"parameters": [
171+
{
172+
"name": "args",
173+
"type": {
174+
"text": "string"
175+
},
176+
"rest": true
177+
}
178+
]
179+
},
180+
{
181+
"kind": "function",
182+
"name": "functionWithRestParam2",
183+
"parameters": [
184+
{
185+
"name": "args",
186+
"type": {
187+
"text": "number"
188+
},
189+
"rest": true
190+
}
191+
]
192+
},
193+
{
194+
"kind": "function",
195+
"name": "functionWithRestParam3",
196+
"parameters": [
197+
{
198+
"name": "args",
199+
"type": {
200+
"text": "number"
201+
},
202+
"rest": true
203+
}
204+
]
205+
},
167206
{
168207
"kind": "class",
169208
"description": "METHODS",
@@ -244,6 +283,45 @@
244283
}
245284
}
246285
]
286+
},
287+
{
288+
"kind": "method",
289+
"name": "functionWithRestParam1",
290+
"parameters": [
291+
{
292+
"name": "args",
293+
"type": {
294+
"text": "string"
295+
},
296+
"rest": true
297+
}
298+
]
299+
},
300+
{
301+
"kind": "method",
302+
"name": "functionWithRestParam2",
303+
"parameters": [
304+
{
305+
"name": "args",
306+
"type": {
307+
"text": "number"
308+
},
309+
"rest": true
310+
}
311+
]
312+
},
313+
{
314+
"kind": "method",
315+
"name": "functionWithRestParam3",
316+
"parameters": [
317+
{
318+
"name": "args",
319+
"type": {
320+
"text": "number"
321+
},
322+
"rest": true
323+
}
324+
]
247325
}
248326
]
249327
}
@@ -353,6 +431,30 @@
353431
"module": "my-element.js"
354432
}
355433
},
434+
{
435+
"kind": "js",
436+
"name": "functionWithRestParam1",
437+
"declaration": {
438+
"name": "functionWithRestParam1",
439+
"module": "my-element.js"
440+
}
441+
},
442+
{
443+
"kind": "js",
444+
"name": "functionWithRestParam2",
445+
"declaration": {
446+
"name": "functionWithRestParam2",
447+
"module": "my-element.js"
448+
}
449+
},
450+
{
451+
"kind": "js",
452+
"name": "functionWithRestParam3",
453+
"declaration": {
454+
"name": "functionWithRestParam3",
455+
"module": "my-element.js"
456+
}
457+
},
356458
{
357459
"kind": "js",
358460
"name": "MyEl",

packages/analyzer/fixtures/03-module/functionLike/package/my-element.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ export function emptyReturn() {
3939
return;
4040
}
4141

42+
export function functionWithRestParam1(...args: string){}
43+
/**
44+
* @param {...number} args
45+
*/
46+
export function functionWithRestParam2(args: string){}
47+
/**
48+
* @param {...number} args
49+
*/
50+
export function functionWithRestParam3(args){}
51+
4252
/**
4353
* METHODS
4454
*/
@@ -57,4 +67,14 @@ export class MyEl {
5767
* @return {string}
5868
*/
5969
functionDeclaration6(bar:string):boolean{}
70+
71+
functionWithRestParam1(...args: string){}
72+
/**
73+
* @param {...number} args
74+
*/
75+
functionWithRestParam2(args: string){}
76+
/**
77+
* @param {...number} args
78+
*/
79+
functionWithRestParam3(args){}
6080
}

packages/analyzer/src/features/analyse-phase/creators/createFunctionLike.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ export function createFunctionLike(node) {
1010
kind: '',
1111
name: node?.name?.getText() || ''
1212
};
13-
13+
1414
functionLikeTemplate = handleKind(functionLikeTemplate, node);
1515
functionLikeTemplate = handleModifiers(functionLikeTemplate, node);
1616
functionLikeTemplate = handleParametersAndReturnType(functionLikeTemplate, node);
1717
functionLikeTemplate = handleJsDoc(functionLikeTemplate, node);
18-
18+
1919
return functionLikeTemplate;
2020
}
2121

2222
/**
23-
* Determine the kind of the functionLike, either `'function'` or `'method'`
23+
* Determine the kind of the functionLike, either `'function'` or `'method'`
2424
*/
2525
export function handleKind(functionLike, node) {
2626
switch(node.kind) {
@@ -45,7 +45,7 @@ export function handleParametersAndReturnType(functionLike, node) {
4545
}
4646

4747
const parameters = [];
48-
node?.parameters?.forEach((param) => {
48+
node?.parameters?.forEach((param) => {
4949
const parameter = {
5050
name: param.name.getText(),
5151
}
@@ -62,6 +62,10 @@ export function handleParametersAndReturnType(functionLike, node) {
6262
parameter.type = {text: param.type.getText() }
6363
}
6464

65+
if(param?.dotDotDotToken) {
66+
parameter.rest = true;
67+
}
68+
6569
parameters.push(parameter);
6670
});
6771

packages/analyzer/src/features/analyse-phase/creators/handlers.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,12 @@ export function handleJsDoc(doc, node) {
8383
}
8484

8585
if(tag?.typeExpression) {
86-
parameterTemplate.type = {
87-
text: handleJsDocType(tag.typeExpression.type.getText())
86+
const typeExpression = handleJsDoc(tag.typeExpression.type.getText());
87+
if(typeExpression.startsWith('...')) {
88+
parameterTemplate.type = { text: typeExpression.replace('...', '') };
89+
parameterTemplate.rest = true;
90+
} else {
91+
parameterTemplate.type = { text: typeExpression };
8892
}
8993
}
9094

0 commit comments

Comments
 (0)