From 6cc0305a5d3210c406d088f8e73d647fe8844e08 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 9 Sep 2014 14:54:19 -0700 Subject: [PATCH] Implemented getOccurrences for 'constructor' keywords. --- src/services/services.ts | 23 +++++++++++-- .../fourslash/getOccurrencesConstructor.ts | 32 +++++++++++++++++++ .../fourslash/getOccurrencesConstructor2.ts | 32 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/getOccurrencesConstructor.ts create mode 100644 tests/cases/fourslash/getOccurrencesConstructor2.ts diff --git a/src/services/services.ts b/src/services/services.ts index c8e73f657a..d51eeee97c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2185,6 +2185,11 @@ module ts { return getBreakStatementOccurences(node.parent); } break; + case SyntaxKind.ConstructorKeyword: + if (hasKind(node.parent, SyntaxKind.Constructor)) { + return getConstructorOccurrences(node.parent); + } + break; } return undefined; @@ -2249,7 +2254,7 @@ module ts { return result; } - function getReturnOccurrences(returnStatement: ReturnStatement): ReferenceEntry[]{ + function getReturnOccurrences(returnStatement: ReturnStatement): ReferenceEntry[] { var func = getContainingFunction(returnStatement); // If we didn't find a containing function with a block body, bail out. @@ -2317,7 +2322,7 @@ module ts { return map(keywords, getReferenceEntryFromNode); } - function getBreakStatementOccurences(breakStatement: BreakOrContinueStatement): ReferenceEntry[]{ + function getBreakStatementOccurences(breakStatement: BreakOrContinueStatement): ReferenceEntry[] { // TODO (drosen): Deal with labeled statements. if (breakStatement.label) { return undefined; @@ -2345,6 +2350,20 @@ module ts { return undefined; } + function getConstructorOccurrences(constructorDeclaration: ConstructorDeclaration): ReferenceEntry[] { + var declarations = constructorDeclaration.symbol.getDeclarations() + + var keywords: Node[] = []; + + forEach(declarations, declaration => { + forEach(declaration.getChildren(), token => { + return pushKeywordIf(keywords, token, SyntaxKind.ConstructorKeyword); + }); + }); + + return map(keywords, getReferenceEntryFromNode); + } + // returns true if 'node' is defined and has a matching 'kind'. function hasKind(node: Node, kind: SyntaxKind) { return !!(node && node.kind === kind); diff --git a/tests/cases/fourslash/getOccurrencesConstructor.ts b/tests/cases/fourslash/getOccurrencesConstructor.ts new file mode 100644 index 0000000000..0a6b84a577 --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesConstructor.ts @@ -0,0 +1,32 @@ +/// + +////class C { +//// [|const/**/ructor|](); +//// [|constructor|](x: number); +//// [|constructor|](y: string, x: number); +//// [|constructor|](a?: any, ...r: any[]) { +//// if (a === undefined && r.length === 0) { +//// return; +//// } +//// +//// return; +//// } +////} +//// +////class D { +//// constructor(public x: number, public y: number) { +//// } +////} + +test.ranges().forEach(r => { + goTo.position(r.start); + + test.ranges().forEach(range => { + verify.occurrencesAtPositionContains(range, false); + }); +}); + +goTo.marker(); +test.ranges().forEach(range => { + verify.occurrencesAtPositionContains(range, false); +}); \ No newline at end of file diff --git a/tests/cases/fourslash/getOccurrencesConstructor2.ts b/tests/cases/fourslash/getOccurrencesConstructor2.ts new file mode 100644 index 0000000000..049c25b7f5 --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesConstructor2.ts @@ -0,0 +1,32 @@ +/// + +////class C { +//// constructor(); +//// constructor(x: number); +//// constructor(y: string, x: number); +//// constructor(a?: any, ...r: any[]) { +//// if (a === undefined && r.length === 0) { +//// return; +//// } +//// +//// return; +//// } +////} +//// +////class D { +//// [|con/**/structor|](public x: number, public y: number) { +//// } +////} + +test.ranges().forEach(r => { + goTo.position(r.start); + + test.ranges().forEach(range => { + verify.occurrencesAtPositionContains(range, false); + }); +}); + +goTo.marker(); +test.ranges().forEach(range => { + verify.occurrencesAtPositionContains(range, false); +}); \ No newline at end of file