mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-10 10:58:20 -05:00
Merge pull request #804 from Microsoft/overwhelmedByOverloads
Only show first overload in a series of consecutive overload signatures
This commit is contained in:
@@ -504,27 +504,47 @@ module ts {
|
||||
if (!this.namedDeclarations) {
|
||||
var sourceFile = this;
|
||||
var namedDeclarations: Declaration[] = [];
|
||||
var isExternalModule = ts.isExternalModule(sourceFile);
|
||||
|
||||
forEachChild(sourceFile, function visit(node: Node): boolean {
|
||||
forEachChild(sourceFile, function visit(node: Node): void {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
case SyntaxKind.Method:
|
||||
var functionDeclaration = <FunctionDeclaration>node;
|
||||
|
||||
if (functionDeclaration.name && functionDeclaration.name.kind !== SyntaxKind.Missing) {
|
||||
var lastDeclaration = namedDeclarations.length > 0 ?
|
||||
namedDeclarations[namedDeclarations.length - 1] :
|
||||
undefined;
|
||||
|
||||
// Check whether this declaration belongs to an "overload group".
|
||||
if (lastDeclaration && functionDeclaration.symbol === lastDeclaration.symbol) {
|
||||
// Overwrite the last declaration if it was an overload
|
||||
// and this one is an implementation.
|
||||
if (functionDeclaration.body && !(<FunctionDeclaration>lastDeclaration).body) {
|
||||
namedDeclarations[namedDeclarations.length - 1] = functionDeclaration;
|
||||
}
|
||||
}
|
||||
else {
|
||||
namedDeclarations.push(node);
|
||||
}
|
||||
|
||||
forEachChild(node, visit);
|
||||
}
|
||||
break;
|
||||
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
case SyntaxKind.EnumDeclaration:
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
case SyntaxKind.ImportDeclaration:
|
||||
case SyntaxKind.Method:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
case SyntaxKind.Constructor:
|
||||
case SyntaxKind.GetAccessor:
|
||||
case SyntaxKind.SetAccessor:
|
||||
case SyntaxKind.TypeLiteral:
|
||||
if ((<Declaration>node).name) {
|
||||
namedDeclarations.push(<Declaration>node);
|
||||
}
|
||||
forEachChild(node, visit);
|
||||
break;
|
||||
|
||||
// fall through
|
||||
case SyntaxKind.Constructor:
|
||||
case SyntaxKind.VariableStatement:
|
||||
case SyntaxKind.ModuleBlock:
|
||||
case SyntaxKind.FunctionBlock:
|
||||
@@ -532,19 +552,17 @@ module ts {
|
||||
break;
|
||||
|
||||
case SyntaxKind.Parameter:
|
||||
// Only consider properties defined as constructor parameters
|
||||
if (!(node.flags & NodeFlags.AccessibilityModifier)) {
|
||||
// Only consider properties defined as constructor parameters
|
||||
break;
|
||||
}
|
||||
// fall through
|
||||
case SyntaxKind.VariableDeclaration:
|
||||
case SyntaxKind.EnumMember:
|
||||
case SyntaxKind.Property:
|
||||
namedDeclarations.push(<Declaration>node);
|
||||
break;
|
||||
}
|
||||
|
||||
// do not go any deeper
|
||||
return undefined;
|
||||
});
|
||||
|
||||
this.namedDeclarations = namedDeclarations;
|
||||
|
||||
30
tests/cases/fourslash/navigationItemsOverloads1.ts
Normal file
30
tests/cases/fourslash/navigationItemsOverloads1.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////function overload(a: string): boolean;
|
||||
////function overload(b: boolean): boolean;
|
||||
////function overload(b: number): boolean;
|
||||
////function overload(f: typeof overload): boolean;
|
||||
////function overload(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw overload;
|
||||
////}
|
||||
////
|
||||
////interface I {
|
||||
//// interfaceMethodSignature(a: string): boolean;
|
||||
//// interfaceMethodSignature(b: boolean): boolean;
|
||||
//// interfaceMethodSignature(b: number): boolean;
|
||||
//// interfaceMethodSignature(f: I): boolean;
|
||||
////}
|
||||
////
|
||||
////class C {
|
||||
//// methodOverload(a: string): boolean;
|
||||
//// methodOverload(b: boolean): boolean;
|
||||
//// methodOverload(b: number): boolean;
|
||||
//// methodOverload(f: I): boolean;
|
||||
//// methodOverload(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw C;
|
||||
//// }
|
||||
////}
|
||||
|
||||
verify.navigationItemsListCount(1, "overload", "exact");
|
||||
verify.navigationItemsListCount(1, "interfaceMethodSignature", "exact");
|
||||
verify.navigationItemsListCount(1, "methodOverload", "exact");
|
||||
12
tests/cases/fourslash/navigationItemsOverloads2.ts
Normal file
12
tests/cases/fourslash/navigationItemsOverloads2.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////interface I {
|
||||
//// interfaceMethodSignature(a: string): boolean;
|
||||
//// interfaceMethodSignature(b: number): boolean;
|
||||
//// interfaceMethodSignature(f: I): boolean;
|
||||
////}
|
||||
////interface I {
|
||||
//// interfaceMethodSignature(b: boolean): boolean;
|
||||
////}
|
||||
|
||||
verify.navigationItemsListCount(2, "interfaceMethodSignature", "exact");
|
||||
29
tests/cases/fourslash/navigationItemsOverloadsBroken1.ts
Normal file
29
tests/cases/fourslash/navigationItemsOverloadsBroken1.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////function overload1(a: string): boolean;
|
||||
////function overload1(b: boolean): boolean;
|
||||
////function overload1(b: number): boolean;
|
||||
////
|
||||
////var heyImNotInterruptingAnythingAmI = '?';
|
||||
////
|
||||
////function overload1(f: typeof overload): boolean;
|
||||
////function overload1(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw overload;
|
||||
////}
|
||||
|
||||
////function overload2(a: string): boolean;
|
||||
////function overload2(b: boolean): boolean;
|
||||
////function overload2(b: number): boolean;
|
||||
////
|
||||
////function iJustRuinEverything(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw overload;
|
||||
////}
|
||||
////
|
||||
////function overload2(f: typeof overload): boolean;
|
||||
////function overload2(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw overload;
|
||||
////}
|
||||
|
||||
verify.navigationItemsListCount(2, "overload1", "exact");
|
||||
verify.navigationItemsListCount(2, "overload2", "exact");
|
||||
verify.navigationItemsListCount(4, "overload", "prefix");
|
||||
23
tests/cases/fourslash/navigationItemsOverloadsBroken2.ts
Normal file
23
tests/cases/fourslash/navigationItemsOverloadsBroken2.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////function overload1(a: string): boolean;
|
||||
////function overload1(b: boolean): boolean;
|
||||
////function overload1(x: any, b = (function overload() { return false })): boolean {
|
||||
//// throw overload1;
|
||||
////}
|
||||
////function overload1(b: number): boolean;
|
||||
////function overload1(f: typeof overload): boolean;
|
||||
|
||||
////function overload2(a: string): boolean;
|
||||
////function overload2(b: boolean): boolean;
|
||||
////function overload2(x: any, b = (function overload() { return false })): boolean {
|
||||
//// function overload2(): boolean;
|
||||
//// function overload2(x: any): boolean;
|
||||
//// throw overload2;
|
||||
////}
|
||||
////function overload2(b: number): boolean;
|
||||
////function overload2(f: typeof overload): boolean;
|
||||
|
||||
verify.navigationItemsListCount(1, "overload1", "exact");
|
||||
verify.navigationItemsListCount(3, "overload2", "exact");
|
||||
verify.navigationItemsListCount(4, "overload", "prefix");
|
||||
Reference in New Issue
Block a user