From b37221142c9fcda90998fe66bfe71e9ea0d8545c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 16 Dec 2014 16:38:28 -0800 Subject: [PATCH 01/10] Moved helpers to bottom of 'getDefinitionAtPosition'. --- src/services/services.ts | 112 +++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index f8070fa0531..c84cb48090c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3097,62 +3097,6 @@ module ts { /// Goto definition function getDefinitionAtPosition(filename: string, position: number): DefinitionInfo[] { - function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { - return { - fileName: node.getSourceFile().filename, - textSpan: createTextSpanFromBounds(node.getStart(), node.getEnd()), - kind: symbolKind, - name: symbolName, - containerKind: undefined, - containerName - }; - } - - function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - var declarations: Declaration[] = []; - var definition: Declaration; - - forEach(signatureDeclarations, d => { - if ((selectConstructors && d.kind === SyntaxKind.Constructor) || - (!selectConstructors && (d.kind === SyntaxKind.FunctionDeclaration || d.kind === SyntaxKind.MethodDeclaration || d.kind === SyntaxKind.MethodSignature))) { - declarations.push(d); - if ((d).body) definition = d; - } - }); - - if (definition) { - result.push(getDefinitionInfo(definition, symbolKind, symbolName, containerName)); - return true; - } - else if (declarations.length) { - result.push(getDefinitionInfo(declarations[declarations.length - 1], symbolKind, symbolName, containerName)); - return true; - } - - return false; - } - - function tryAddConstructSignature(symbol: Symbol, location: Node, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - // Applicable only if we are in a new expression, or we are on a constructor declaration - // and in either case the symbol has a construct signature definition, i.e. class - if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { - if (symbol.flags & SymbolFlags.Class) { - var classDeclaration = symbol.getDeclarations()[0]; - Debug.assert(classDeclaration && classDeclaration.kind === SyntaxKind.ClassDeclaration); - - return tryAddSignature(classDeclaration.members, /*selectConstructors*/ true, symbolKind, symbolName, containerName, result); - } - } - return false; - } - - function tryAddCallSignature(symbol: Symbol, location: Node, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - if (isCallExpressionTarget(location) || isNewExpressionTarget(location) || isNameOfFunctionDeclaration(location)) { - return tryAddSignature(symbol.declarations, /*selectConstructors*/ false, symbolKind, symbolName, containerName, result); - } - return false; - } - synchronizeHostData(); filename = normalizeSlashes(filename); @@ -3229,6 +3173,62 @@ module ts { } return result; + + function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { + return { + fileName: node.getSourceFile().filename, + textSpan: createTextSpanFromBounds(node.getStart(), node.getEnd()), + kind: symbolKind, + name: symbolName, + containerKind: undefined, + containerName + }; + } + + function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { + var declarations: Declaration[] = []; + var definition: Declaration; + + forEach(signatureDeclarations, d => { + if ((selectConstructors && d.kind === SyntaxKind.Constructor) || + (!selectConstructors && (d.kind === SyntaxKind.FunctionDeclaration || d.kind === SyntaxKind.MethodDeclaration || d.kind === SyntaxKind.MethodSignature))) { + declarations.push(d); + if ((d).body) definition = d; + } + }); + + if (definition) { + result.push(getDefinitionInfo(definition, symbolKind, symbolName, containerName)); + return true; + } + else if (declarations.length) { + result.push(getDefinitionInfo(declarations[declarations.length - 1], symbolKind, symbolName, containerName)); + return true; + } + + return false; + } + + function tryAddConstructSignature(symbol: Symbol, location: Node, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { + // Applicable only if we are in a new expression, or we are on a constructor declaration + // and in either case the symbol has a construct signature definition, i.e. class + if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { + if (symbol.flags & SymbolFlags.Class) { + var classDeclaration = symbol.getDeclarations()[0]; + Debug.assert(classDeclaration && classDeclaration.kind === SyntaxKind.ClassDeclaration); + + return tryAddSignature(classDeclaration.members, /*selectConstructors*/ true, symbolKind, symbolName, containerName, result); + } + } + return false; + } + + function tryAddCallSignature(symbol: Symbol, location: Node, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { + if (isCallExpressionTarget(location) || isNewExpressionTarget(location) || isNameOfFunctionDeclaration(location)) { + return tryAddSignature(symbol.declarations, /*selectConstructors*/ false, symbolKind, symbolName, containerName, result); + } + return false; + } } /// References and Occurrences From 017486b1193dcd14b242f2190ab2c34d219e8a04 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 16 Dec 2014 16:55:52 -0800 Subject: [PATCH 02/10] Made 'location' non-optional in 'getSymbolKind'. --- src/services/services.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index c84cb48090c..e488e6ea402 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2598,7 +2598,7 @@ module ts { } // TODO(drosen): use contextual SemanticMeaning. - function getSymbolKind(symbol: Symbol, typeResolver: TypeChecker, location?: Node): string { + function getSymbolKind(symbol: Symbol, typeResolver: TypeChecker, location: Node): string { var flags = symbol.getFlags(); if (flags & SymbolFlags.Class) return ScriptElementKind.classElement; @@ -3149,7 +3149,7 @@ module ts { if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { var shorthandSymbol = typeInfoResolver.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); var shorthandDeclarations = shorthandSymbol.getDeclarations(); - var shorthandSymbolKind = getSymbolKind(shorthandSymbol, typeInfoResolver); + var shorthandSymbolKind = getSymbolKind(shorthandSymbol, typeInfoResolver, node); var shorthandSymbolName = typeInfoResolver.symbolToString(shorthandSymbol); var shorthandContainerName = typeInfoResolver.symbolToString(symbol.parent, node); forEach(shorthandDeclarations, declaration => { @@ -3160,7 +3160,7 @@ module ts { var declarations = symbol.getDeclarations(); var symbolName = typeInfoResolver.symbolToString(symbol); // Do not get scoped name, just the name of the symbol - var symbolKind = getSymbolKind(symbol, typeInfoResolver); + var symbolKind = getSymbolKind(symbol, typeInfoResolver, node); var containerSymbol = symbol.parent; var containerName = containerSymbol ? typeInfoResolver.symbolToString(containerSymbol, node) : ""; @@ -3174,7 +3174,7 @@ module ts { return result; - function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { + function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { return { fileName: node.getSourceFile().filename, textSpan: createTextSpanFromBounds(node.getStart(), node.getEnd()), @@ -5273,7 +5273,7 @@ module ts { // Only allow a symbol to be renamed if it actually has at least one declaration. if (symbol && symbol.getDeclarations() && symbol.getDeclarations().length > 0) { - var kind = getSymbolKind(symbol, typeInfoResolver); + var kind = getSymbolKind(symbol, typeInfoResolver, node); if (kind) { return getRenameInfo(symbol.name, typeInfoResolver.getFullyQualifiedName(symbol), kind, getSymbolModifiers(symbol), From 90a32ad2b0d961091606853f3d8c1f1ad33100fe Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 16 Dec 2014 16:59:16 -0800 Subject: [PATCH 03/10] Fixed messed-up formatting from moving around code. --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index e488e6ea402..249270f187c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3174,7 +3174,7 @@ module ts { return result; - function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { + function getDefinitionInfo(node: Node, symbolKind: string, symbolName: string, containerName: string): DefinitionInfo { return { fileName: node.getSourceFile().filename, textSpan: createTextSpanFromBounds(node.getStart(), node.getEnd()), From eaaf7ad4684ae70c07f12ebcc0e2ec30edb10607 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 16 Dec 2014 17:45:12 -0800 Subject: [PATCH 04/10] Normalize a few fourslash line endings. --- .../goToDefinitionExternamModuleName4.ts | 2 +- .../goToDefinitionFunctionOverloads.ts | 34 +++++++-------- .../goToDefinitionFunctionOverloadsInClass.ts | 42 +++++++++---------- .../goToDefinitionUnionTypeProperty.ts | 22 +++++----- .../goToDefinitionUnionTypeProperty2.ts | 28 ++++++------- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/tests/cases/fourslash/goToDefinitionExternamModuleName4.ts b/tests/cases/fourslash/goToDefinitionExternamModuleName4.ts index 1a0fa46c072..c8bbaa458e4 100644 --- a/tests/cases/fourslash/goToDefinitionExternamModuleName4.ts +++ b/tests/cases/fourslash/goToDefinitionExternamModuleName4.ts @@ -1,4 +1,4 @@ -/// +/// // @Filename: b.ts ////import n = require('unknown/*1*/'); diff --git a/tests/cases/fourslash/goToDefinitionFunctionOverloads.ts b/tests/cases/fourslash/goToDefinitionFunctionOverloads.ts index 6dd4cc91f1f..488d788073a 100644 --- a/tests/cases/fourslash/goToDefinitionFunctionOverloads.ts +++ b/tests/cases/fourslash/goToDefinitionFunctionOverloads.ts @@ -1,20 +1,20 @@ -/// - -/////*functionOverload1*/function /*functionOverload*/functionOverload(); -/////*functionOverload2*/function functionOverload(value: string); -/////*functionOverloadDefinition*/function functionOverload() {} -//// +/// + +/////*functionOverload1*/function /*functionOverload*/functionOverload(); +/////*functionOverload2*/function functionOverload(value: string); +/////*functionOverloadDefinition*/function functionOverload() {} +//// /////*functionOverloadReference1*/functionOverload(); /////*functionOverloadReference2*/functionOverload("123"); -goTo.marker('functionOverloadReference1'); -goTo.definition(); -verify.caretAtMarker('functionOverloadDefinition'); - -goTo.marker('functionOverloadReference2'); -goTo.definition(); -verify.caretAtMarker('functionOverloadDefinition'); - -goTo.marker('functionOverload'); -goTo.definition(); -verify.caretAtMarker('functionOverloadDefinition'); +goTo.marker('functionOverloadReference1'); +goTo.definition(); +verify.caretAtMarker('functionOverloadDefinition'); + +goTo.marker('functionOverloadReference2'); +goTo.definition(); +verify.caretAtMarker('functionOverloadDefinition'); + +goTo.marker('functionOverload'); +goTo.definition(); +verify.caretAtMarker('functionOverloadDefinition'); diff --git a/tests/cases/fourslash/goToDefinitionFunctionOverloadsInClass.ts b/tests/cases/fourslash/goToDefinitionFunctionOverloadsInClass.ts index 1db506f9686..f368120922d 100644 --- a/tests/cases/fourslash/goToDefinitionFunctionOverloadsInClass.ts +++ b/tests/cases/fourslash/goToDefinitionFunctionOverloadsInClass.ts @@ -1,23 +1,23 @@ -/// - -////class clsInOverload { -//// static fnOverload(); -//// static /*staticFunctionOverload*/fnOverload(foo: string); -//// /*staticFunctionOverloadDefinition*/static fnOverload(foo: any) { } -//// public /*functionOverload*/fnOverload(): any; -//// public fnOverload(foo: string); -//// /*functionOverloadDefinition*/public fnOverload(foo: any) { return "foo" } -//// -//// constructor() { } -////} - +/// + +////class clsInOverload { +//// static fnOverload(); +//// static /*staticFunctionOverload*/fnOverload(foo: string); +//// /*staticFunctionOverloadDefinition*/static fnOverload(foo: any) { } +//// public /*functionOverload*/fnOverload(): any; +//// public fnOverload(foo: string); +//// /*functionOverloadDefinition*/public fnOverload(foo: any) { return "foo" } +//// +//// constructor() { } +////} + // this line triggers a semantic/syntactic error check, remove line when 788570 is fixed -edit.insert(''); - -goTo.marker('staticFunctionOverload'); -goTo.definition(); -verify.caretAtMarker('staticFunctionOverloadDefinition'); - -goTo.marker('functionOverload'); -goTo.definition(); +edit.insert(''); + +goTo.marker('staticFunctionOverload'); +goTo.definition(); +verify.caretAtMarker('staticFunctionOverloadDefinition'); + +goTo.marker('functionOverload'); +goTo.definition(); verify.caretAtMarker('functionOverloadDefinition'); \ No newline at end of file diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts index 74b5e2aad8a..cefb1205b02 100644 --- a/tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts @@ -1,5 +1,5 @@ -/// - +/// + ////interface One { //// /*propertyDefinition1*/commonProperty: number; //// commonFunction(): number; @@ -13,12 +13,12 @@ ////var x : One | Two; //// ////x./*propertyReference*/commonProperty; -////x./*3*/commonFunction; - -goTo.marker("propertyReference"); -goTo.definition(0); -verify.caretAtMarker("propertyDefinition1"); - -goTo.marker("propertyReference"); -goTo.definition(1); -verify.caretAtMarker("propertyDefinition2"); +////x./*3*/commonFunction; + +goTo.marker("propertyReference"); +goTo.definition(0); +verify.caretAtMarker("propertyDefinition1"); + +goTo.marker("propertyReference"); +goTo.definition(1); +verify.caretAtMarker("propertyDefinition2"); diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts index 960a6b7a86e..eea8bf89a4b 100644 --- a/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts @@ -1,9 +1,9 @@ -/// -////interface HasAOrB { -//// /*propertyDefinition1*/a: string; -//// b: string; -////} -//// +/// +////interface HasAOrB { +//// /*propertyDefinition1*/a: string; +//// b: string; +////} +//// ////interface One { //// common: { /*propertyDefinition2*/a : number; }; ////} @@ -15,11 +15,11 @@ ////var x : One | Two; //// ////x.common./*propertyReference*/a; - -goTo.marker("propertyReference"); -goTo.definition(0); -verify.caretAtMarker("propertyDefinition2"); - -goTo.marker("propertyReference"); -goTo.definition(1); -verify.caretAtMarker("propertyDefinition1"); + +goTo.marker("propertyReference"); +goTo.definition(0); +verify.caretAtMarker("propertyDefinition2"); + +goTo.marker("propertyReference"); +goTo.definition(1); +verify.caretAtMarker("propertyDefinition1"); From af4d7d3ff426902e13f780899746fc9346dd1910 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:21:35 -0800 Subject: [PATCH 05/10] Added goToDef count verification in fourslash facilities. --- src/harness/fourslash.ts | 8 ++++++++ tests/cases/fourslash/fourslash.ts | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 3659d8844a9..26e21f07c15 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1515,6 +1515,14 @@ module FourSlash { } } + public verifyDefinitionsCount(negative: boolean, expectedCount: number) { + var assertFn = negative ? assert.notEqual : assert.equal; + + var definitions = this.languageService.getDefinitionAtPosition(this.activeFile.fileName, this.currentCaretPosition); + + assertFn(definitions.length, expectedCount, this.messageAtLastKnownMarker("Definitions Count")); + } + public verifyDefinitionsName(negative: boolean, expectedName: string, expectedContainerName: string) { this.taoInvalidReason = 'verifyDefinititionsInfo NYI'; diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index f5a582868e5..fcf7ae7e3b1 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -217,6 +217,10 @@ module FourSlashInterface { FourSlash.currentTestState.verifyQuickInfoExists(this.negative); } + public definitionCountIs(expectedCount: number) { + FourSlash.currentTestState.verifyDefinitionsCount(this.negative, expectedCount); + } + public definitionLocationExists() { FourSlash.currentTestState.verifyDefinitionLocationExists(this.negative); } From ec64c0f929b2eab7676efc6885073ec1fcb680e3 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:23:56 -0800 Subject: [PATCH 06/10] Fixed 'verifyDefinitionsName' to check the container name properly. --- src/harness/fourslash.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 26e21f07c15..4f9e6a3f0e9 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1531,10 +1531,10 @@ module FourSlash { var actualDefinitionContainerName = definitions && definitions.length ? definitions[0].containerName : ""; if (negative) { assert.notEqual(actualDefinitionName, expectedName, this.messageAtLastKnownMarker("Definition Info Name")); - assert.notEqual(actualDefinitionName, expectedName, this.messageAtLastKnownMarker("Definition Info Container Name")); + assert.notEqual(actualDefinitionContainerName, expectedContainerName, this.messageAtLastKnownMarker("Definition Info Container Name")); } else { assert.equal(actualDefinitionName, expectedName, this.messageAtLastKnownMarker("Definition Info Name")); - assert.equal(actualDefinitionName, expectedName, this.messageAtLastKnownMarker("Definition Info Container Name")); + assert.equal(actualDefinitionContainerName, expectedContainerName, this.messageAtLastKnownMarker("Definition Info Container Name")); } } From 7a1be3cc0400bd52416908673767db48ed38dd1c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:25:16 -0800 Subject: [PATCH 07/10] Added test using code from original issue. --- .../fourslash/goToDefinitionUnionTypeProperty3.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/cases/fourslash/goToDefinitionUnionTypeProperty3.ts diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty3.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty3.ts new file mode 100644 index 00000000000..337bae7d520 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty3.ts @@ -0,0 +1,15 @@ +/// + +////interface Array { +//// /*definition*/specialPop(): T +////} +//// +////var strings: string[]; +////var numbers: number[]; +//// +////var x = (strings || numbers)./*usage*/specialPop() + +goTo.marker("usage"); +verify.definitionCountIs(1); +goTo.definition(); +verify.caretAtMarker("definition"); From 6c753496e760a0e17923333d7b80b2f226c4c8e1 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:41:12 -0800 Subject: [PATCH 08/10] Rename file. --- ...onUnionTypeProperty.ts => goToDefinitionUnionTypeProperty1.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/cases/fourslash/{goToDefinitionUnionTypeProperty.ts => goToDefinitionUnionTypeProperty1.ts} (100%) diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts similarity index 100% rename from tests/cases/fourslash/goToDefinitionUnionTypeProperty.ts rename to tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts From 42babc52d387c9dd9cb44cc1f3bff69f570d5ea8 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:46:04 -0800 Subject: [PATCH 09/10] Use 'definitionCountIs' in union property tests. --- tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts | 2 ++ tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts index cefb1205b02..65d7201aecf 100644 --- a/tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty1.ts @@ -15,7 +15,9 @@ ////x./*propertyReference*/commonProperty; ////x./*3*/commonFunction; + goTo.marker("propertyReference"); +verify.definitionCountIs(2); goTo.definition(0); verify.caretAtMarker("propertyDefinition1"); diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts index eea8bf89a4b..674d5f4b623 100644 --- a/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty2.ts @@ -17,6 +17,7 @@ ////x.common./*propertyReference*/a; goTo.marker("propertyReference"); +verify.definitionCountIs(2); goTo.definition(0); verify.caretAtMarker("propertyDefinition2"); From b3ccb562fb64e4849b1a2f50d852d526e9b4e086 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 14:57:24 -0800 Subject: [PATCH 10/10] Added test for goToDef on union types. --- .../goToDefinitionUnionTypeProperty4.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/cases/fourslash/goToDefinitionUnionTypeProperty4.ts diff --git a/tests/cases/fourslash/goToDefinitionUnionTypeProperty4.ts b/tests/cases/fourslash/goToDefinitionUnionTypeProperty4.ts new file mode 100644 index 00000000000..eb17f9570c2 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionUnionTypeProperty4.ts @@ -0,0 +1,32 @@ +/// + +////interface SnapCrackle { +//// /*def1*/pop(): string; +////} +//// +////interface Magnitude { +//// /*def2*/pop(): number; +////} +//// +////interface Art { +//// /*def3*/pop(): boolean; +////} +//// +////var art: Art; +////var magnitude: Magnitude; +////var snapcrackle: SnapCrackle; +//// +////var x = (snapcrackle || magnitude || art)./*usage*/pop; + +goTo.marker("usage"); +verify.definitionCountIs(3); +goTo.definition(0); +verify.caretAtMarker("def1"); + +goTo.marker("usage"); +goTo.definition(1); +verify.caretAtMarker("def2"); + +goTo.marker("usage"); +goTo.definition(2); +verify.caretAtMarker("def3"); \ No newline at end of file