From cf71f80b520ff8ad2dff1e718e1354f769826b7e Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+CJieLuo@users.noreply.github.com> Date: Thu, 1 Jul 2021 13:56:52 +0800 Subject: [PATCH 1/6] fix typescript generic type --- src/drivers/abstract-javascript.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index e3d2366..fe8fd0c 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -18,7 +18,7 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos return reject() } - definition = definition[0].slice(2, -2) + definition = definition[0].slice(2, -2).replace(/\<.*\>/g,''); const jsParameterNameRegex = /^[a-zA-Z_$]([0-9a-zA-Z_$]+)?/g From b4b12ff36bbed66101420ffcf1e9ae3c11eb262a Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Thu, 1 Jul 2021 14:51:26 +0800 Subject: [PATCH 2/6] fix function variable match --- src/drivers/abstract-javascript.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index fe8fd0c..80b048a 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -11,14 +11,14 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos if (description && description.length > 0) { try { - const functionDefinitionRegex = /[^ ](?!^)\((.*)\)\:/gm + const functionDefinitionRegex = /\(((?!loading).*)\)/gm let definition = description[0].contents[0].value.match(functionDefinitionRegex) if (!definition || definition.length === 0) { return reject() } - definition = definition[0].slice(2, -2).replace(/\<.*\>/g,''); + definition = definition[0].slice(1, -1).replace(/\<.*\>/g,''); const jsParameterNameRegex = /^[a-zA-Z_$]([0-9a-zA-Z_$]+)?/g From 8d8bd1c365cb31c006729c84f3eb1bb4cd3b2bf0 Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Thu, 1 Jul 2021 16:23:04 +0800 Subject: [PATCH 3/6] fix bracket matching --- src/drivers/abstract-javascript.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index 80b048a..9115aaa 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -10,15 +10,34 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos const shouldHideRedundantAnnotations = vscode.workspace.getConfiguration('inline-parameters').get('hideRedundantAnnotations') if (description && description.length > 0) { - try { - const functionDefinitionRegex = /\(((?!loading).*)\)/gm - let definition = description[0].contents[0].value.match(functionDefinitionRegex) + try { + let definition = description[0].contents[0].value + // Find the left bracket matching the last right bracket + let pos = [0, 0]; + let bracketsCount = 0; + let isFound = false; + for (let i = definition.length - 1; i >= 0; i--) { + const e = definition[i]; + if (e === ')') { + bracketsCount++; + if (!isFound) { + isFound = true; + pos[1] = i; + } + } + else if (e === '(') bracketsCount--; + if (isFound && bracketsCount === 0) { + pos[0] = i; + break; + } + } + definition = definition.slice(pos[0], pos[1] + 1); if (!definition || definition.length === 0) { return reject() } - definition = definition[0].slice(1, -1).replace(/\<.*\>/g,''); + definition = definition.slice(1, -1).replace(/\<.*\>/g,''); const jsParameterNameRegex = /^[a-zA-Z_$]([0-9a-zA-Z_$]+)?/g From 42ed1d8e800eefc7c0d9a71a1dec1a859e0ea968 Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Thu, 1 Jul 2021 17:45:52 +0800 Subject: [PATCH 4/6] Fix "this" type, fix return function type --- src/drivers/abstract-javascript.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index 9115aaa..3052edb 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -11,22 +11,22 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos if (description && description.length > 0) { try { - let definition = description[0].contents[0].value + let definition = description[0].contents[0].value.replace(/(?<=\)\s*\:).*/m, ''); // Find the left bracket matching the last right bracket let pos = [0, 0]; let bracketsCount = 0; - let isFound = false; + let isLastRightBracketFound = false; for (let i = definition.length - 1; i >= 0; i--) { const e = definition[i]; if (e === ')') { bracketsCount++; - if (!isFound) { - isFound = true; + if (!isLastRightBracketFound) { + isLastRightBracketFound = true; pos[1] = i; } } else if (e === '(') bracketsCount--; - if (isFound && bracketsCount === 0) { + if (isLastRightBracketFound && bracketsCount === 0) { pos[0] = i; break; } @@ -37,7 +37,7 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos return reject() } - definition = definition.slice(1, -1).replace(/\<.*\>/g,''); + definition = definition.slice(1, -1).replace(/\<.*?\>/g,''); const jsParameterNameRegex = /^[a-zA-Z_$]([0-9a-zA-Z_$]+)?/g @@ -57,6 +57,11 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos return parameter }) + + // Typescript allows "this" type + if (parameters[0] === "this") { + parameters.shift(); + } } catch (err) { console.error(err) } From de7bf9181cb359f04f46b139fc41c89dbea06f4b Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Thu, 1 Jul 2021 18:37:11 +0800 Subject: [PATCH 5/6] add example --- examples/example.ts | 26 ++++++++++++++++++++++++++ src/drivers/abstract-javascript.ts | 6 ++++-- tsconfig.json | 3 ++- 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 examples/example.ts diff --git a/examples/example.ts b/examples/example.ts new file mode 100644 index 0000000..dafbbfb --- /dev/null +++ b/examples/example.ts @@ -0,0 +1,26 @@ +let a = (a: string, b: Record, c?: number): void => {}; + +a("a", {}, 11); + +type A = a; + +function b( + a: string, + b: A, + c: Record, + d: number +): (() => void) | void {} + +b("aa", "aa", {}, 2); + +class B { + foo(a: (c: string, q: string) => void, c:number) {} + + bar: (a: string) => void; +} + +new B().foo(() => {}, 1); + +new B().bar("aa"); + +a.call(this, 1); diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index 3052edb..128ee06 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -11,7 +11,7 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos if (description && description.length > 0) { try { - let definition = description[0].contents[0].value.replace(/(?<=\)\s*\:).*/m, ''); + let definition = description[0].contents[0].value.replace(/(?<=\)\s*\:)[\s\S]*/m, ''); // Find the left bracket matching the last right bracket let pos = [0, 0]; let bracketsCount = 0; @@ -37,7 +37,9 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos return reject() } - definition = definition.slice(1, -1).replace(/\<.*?\>/g,''); + definition = definition.slice(1, -1) + .replace(/\<.*?\>/g,'') + .replace(/\(.*?\)/g,''); const jsParameterNameRegex = /^[a-zA-Z_$]([0-9a-zA-Z_$]+)?/g diff --git a/tsconfig.json b/tsconfig.json index 8937be0..a4b5818 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ }, "exclude": [ "node_modules", - ".vscode-test" + ".vscode-test", + "examples" ] } From 6a2c82d30b4b23c03dfd6bf79ff2f3eb392399a6 Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Wed, 7 Jul 2021 18:11:02 +0800 Subject: [PATCH 6/6] fix () => () => --- src/drivers/abstract-javascript.ts | 41 +++++++++++++++++++----------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/drivers/abstract-javascript.ts b/src/drivers/abstract-javascript.ts index 128ee06..d1a0bb4 100644 --- a/src/drivers/abstract-javascript.ts +++ b/src/drivers/abstract-javascript.ts @@ -11,24 +11,35 @@ export function getParameterName(editor: vscode.TextEditor, position: vscode.Pos if (description && description.length > 0) { try { - let definition = description[0].contents[0].value.replace(/(?<=\)\s*\:)[\s\S]*/m, ''); - // Find the left bracket matching the last right bracket - let pos = [0, 0]; + let definition = description[0].contents[0].value; + // Find the bracket matching () => or () : + let pos = [0, -1]; let bracketsCount = 0; - let isLastRightBracketFound = false; + let isFindingBrackets = false; for (let i = definition.length - 1; i >= 0; i--) { const e = definition[i]; - if (e === ')') { - bracketsCount++; - if (!isLastRightBracketFound) { - isLastRightBracketFound = true; - pos[1] = i; - } - } - else if (e === '(') bracketsCount--; - if (isLastRightBracketFound && bracketsCount === 0) { - pos[0] = i; - break; + switch (e) { + case ")": + if (bracketsCount === 0 && isFindingBrackets) pos[1] = i; + bracketsCount ++; + break; + case "(": + bracketsCount --; + if (bracketsCount === 0 && isFindingBrackets) { + pos[0] = i; + isFindingBrackets = false; + } + break; + case ":": + case "=": + if (bracketsCount === 0) + isFindingBrackets = true; + break; + case " ": + break; + default: + if (bracketsCount === 0) isFindingBrackets = false; + break; } } definition = definition.slice(pos[0], pos[1] + 1);