From 92bd7b565c5154be82ac42b3a30e9e66fe9663cb Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Mon, 12 Aug 2019 16:31:20 -0700 Subject: [PATCH 1/9] fix(eslint-plugin): include exported functions in overloads --- .../src/rules/unified-signatures.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 04695fcc302..0e7bcb28f4d 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -35,6 +35,9 @@ type ScopeNode = | TSESTree.TSTypeLiteral; type OverloadNode = MethodDefinition | SignatureDefinition; +type ContainingNode = + | TSESTree.ExportNamedDeclaration + | TSESTree.ExportDefaultDeclaration; type SignatureDefinition = | TSESTree.FunctionExpression @@ -494,9 +497,17 @@ export default util.createRule({ currentScope = scopes.pop()!; } - function addOverload(signature: OverloadNode, key?: string) { + function addOverload( + signature: OverloadNode, + key?: string, + containingNode?: ContainingNode, + ) { key = key || getOverloadKey(signature); - if (currentScope && signature.parent === currentScope.parent && key) { + if ( + currentScope && + (containingNode || signature).parent === currentScope.parent && + key + ) { const overloads = currentScope.overloads.get(key); if (overloads !== undefined) { overloads.push(signature); @@ -520,10 +531,11 @@ export default util.createRule({ createScope(node.body, node.typeParameters); }, TSTypeLiteral: createScope, + // collect overloads TSDeclareFunction(node) { if (node.id && !node.body) { - addOverload(node, node.id.name); + addOverload(node, node.id.name, getExportingNode(node)); } }, TSCallSignatureDeclaration: addOverload, @@ -539,6 +551,7 @@ export default util.createRule({ addOverload(node); } }, + // validate scopes 'Program:exit': checkScope, 'TSModuleBlock:exit': checkScope, @@ -549,6 +562,14 @@ export default util.createRule({ }, }); +function getExportingNode(node: TSESTree.TSDeclareFunction) { + return node.parent && + (node.parent.type === AST_NODE_TYPES.ExportNamedDeclaration || + node.parent.type === AST_NODE_TYPES.ExportDefaultDeclaration) + ? node.parent + : undefined; +} + function getOverloadKey(node: OverloadNode): string | undefined { const info = getOverloadInfo(node); From f8a59755516c56877f1eecd23266a4752fbb4644 Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Mon, 12 Aug 2019 16:43:40 -0700 Subject: [PATCH 2/9] test(eslint-plugin): add tests for unified-signatures --- .../tests/rules/unified-signatures.test.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts index 5d65e2f1801..c5767384d91 100644 --- a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts +++ b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts @@ -591,5 +591,39 @@ class Foo { }, ], }, + { + code: ` +export function foo(line: number): number; +export function foo(line: number, character?: number): number; +`, + errors: [ + { + messageId: 'omittingSingleParameter', + data: { + failureStringStart: + 'These overloads can be combined into one signature', + }, + line: 3, + column: 35, + }, + ], + }, + { + code: ` +declare function foo(line: number): number; +export function foo(line: number, character?: number): number; +`, + errors: [ + { + messageId: 'omittingSingleParameter', + data: { + failureStringStart: + 'These overloads can be combined into one signature', + }, + line: 3, + column: 35, + }, + ], + }, ], }); From 24a4688b0f97d055de260d995b6e42bfd405b7d1 Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Mon, 12 Aug 2019 16:50:16 -0700 Subject: [PATCH 3/9] style: fix format in base config --- packages/eslint-plugin/src/configs/base.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/configs/base.json b/packages/eslint-plugin/src/configs/base.json index 6f56100a6ae..9b6931ad616 100644 --- a/packages/eslint-plugin/src/configs/base.json +++ b/packages/eslint-plugin/src/configs/base.json @@ -3,7 +3,5 @@ "parserOptions": { "sourceType": "module" }, - "plugins": [ - "@typescript-eslint" - ] + "plugins": ["@typescript-eslint"] } From b0fe42fceb03f2b54bc707d5c7ddd2199d07cfdd Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Tue, 13 Aug 2019 11:27:03 -0700 Subject: [PATCH 4/9] refactor: remove unneeded condition --- packages/eslint-plugin/src/rules/unified-signatures.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 0848f7a456e..d6c5112dfe8 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -535,9 +535,7 @@ export default util.createRule({ // collect overloads TSDeclareFunction(node): void { - if (node.id && !node.body) { - addOverload(node, node.id.name, getExportingNode(node)); - } + addOverload(node, node.id!.name, getExportingNode(node)); }, TSCallSignatureDeclaration: addOverload, TSConstructSignatureDeclaration: addOverload, From fd90121ab2e679b94416749b7cce94626e9c5c3d Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Tue, 13 Aug 2019 17:02:05 -0700 Subject: [PATCH 5/9] chore: add .vs to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 55599f0c184..3a06baccf6f 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ jspm_packages/ .DS_Store .idea dist + +# Editor-specific metadata folders +.vs From 2dd00f1081e2ae13c3d7ef8f968aaabafa76d306 Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Tue, 13 Aug 2019 17:03:14 -0700 Subject: [PATCH 6/9] fix: stop unifying based on type property --- packages/eslint-plugin/src/rules/unified-signatures.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index d6c5112dfe8..73a294587f5 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -427,7 +427,8 @@ export default util.createRule({ a === b || (a !== undefined && b !== undefined && - a.typeAnnotation.type === b.typeAnnotation.type) + sourceCode.getText(a.typeAnnotation) === + sourceCode.getText(b.typeAnnotation)) ); } @@ -506,8 +507,7 @@ export default util.createRule({ key = key || getOverloadKey(signature); if ( currentScope && - (containingNode || signature).parent === currentScope.parent && - key + (containingNode || signature).parent === currentScope.parent ) { const overloads = currentScope.overloads.get(key); if (overloads !== undefined) { @@ -569,7 +569,7 @@ function getExportingNode(node: TSESTree.TSDeclareFunction) { : undefined; } -function getOverloadKey(node: OverloadNode): string | undefined { +function getOverloadKey(node: OverloadNode): string { const info = getOverloadInfo(node); return ( From e2b21b142f0f805f1f13dd4b5bfb84e9eb4b2c5a Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Tue, 13 Aug 2019 17:06:32 -0700 Subject: [PATCH 7/9] test: add test for return type change --- .../tests/rules/unified-signatures.test.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts index c5767384d91..c8f9740662d 100644 --- a/packages/eslint-plugin/tests/rules/unified-signatures.test.ts +++ b/packages/eslint-plugin/tests/rules/unified-signatures.test.ts @@ -105,6 +105,30 @@ interface I { function f(x: T[]): void; function f(x: T): void; `, + // Same name, different scopes + ` +declare function foo(n: number): number; + +declare module "hello" { + function foo(n: number, s: string): number; +} +`, + // children of block not checked to match TSLint + ` +{ + function block(): number; + function block(n: number): number; + function block(n?: number): number { + return 3; + } +} +`, + ` +export interface Foo { + bar(baz: string): number[]; + bar(): string[]; +} +`, ], invalid: [ { From 70b2cc2ee46a13073413f1e7b66d3dc31a6ea9fd Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Wed, 14 Aug 2019 11:02:04 -0700 Subject: [PATCH 8/9] fix: update type for TSDeclareFunction --- packages/eslint-plugin/src/rules/unified-signatures.ts | 2 +- packages/typescript-estree/src/ts-estree/ts-estree.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index 73a294587f5..fe6befad12e 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -535,7 +535,7 @@ export default util.createRule({ // collect overloads TSDeclareFunction(node): void { - addOverload(node, node.id!.name, getExportingNode(node)); + addOverload(node, node.id.name, getExportingNode(node)); }, TSCallSignatureDeclaration: addOverload, TSConstructSignatureDeclaration: addOverload, diff --git a/packages/typescript-estree/src/ts-estree/ts-estree.ts b/packages/typescript-estree/src/ts-estree/ts-estree.ts index f079fd68d47..7276f8d93e3 100644 --- a/packages/typescript-estree/src/ts-estree/ts-estree.ts +++ b/packages/typescript-estree/src/ts-estree/ts-estree.ts @@ -1040,6 +1040,7 @@ export interface TSConstructSignatureDeclaration extends FunctionSignatureBase { } export interface TSDeclareFunction extends FunctionDeclarationBase { + id: Identifier; type: AST_NODE_TYPES.TSDeclareFunction; } From c912e3f1aa0122c36dc51b28bd0001588f4fb8a2 Mon Sep 17 00:00:00 2001 From: Ben Lichtman Date: Wed, 14 Aug 2019 11:17:39 -0700 Subject: [PATCH 9/9] style: add required return type annotation --- packages/eslint-plugin/src/rules/unified-signatures.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/unified-signatures.ts b/packages/eslint-plugin/src/rules/unified-signatures.ts index fe6befad12e..c4c7f9bf427 100644 --- a/packages/eslint-plugin/src/rules/unified-signatures.ts +++ b/packages/eslint-plugin/src/rules/unified-signatures.ts @@ -561,7 +561,12 @@ export default util.createRule({ }, }); -function getExportingNode(node: TSESTree.TSDeclareFunction) { +function getExportingNode( + node: TSESTree.TSDeclareFunction, +): + | TSESTree.ExportNamedDeclaration + | TSESTree.ExportDefaultDeclaration + | undefined { return node.parent && (node.parent.type === AST_NODE_TYPES.ExportNamedDeclaration || node.parent.type === AST_NODE_TYPES.ExportDefaultDeclaration)