From 41b7eb25a37ff2a7a9bf368438436ffb9bff9a8b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 1 Aug 2014 17:11:41 -0700 Subject: [PATCH] Make goto def jump to labels across function boundries --- src/services/services.ts | 26 ++++--------------- tests/cases/fourslash/goToDefinitionLabels.ts | 5 ++-- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 095d7f7631f..66904711ffb 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1865,28 +1865,12 @@ module ts { /// Goto definition function getDefinitionAtPosition(filename: string, position: number): DefinitionInfo[]{ - function getTargetLabel(statement: BreakOrContinueStatement, labelName: string): Identifier { - var current = statement.parent; - while (current) { - switch (current.kind) { - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.Method: - case SyntaxKind.Constructor: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - case SyntaxKind.FunctionExpression: - case SyntaxKind.ArrowFunction: - case SyntaxKind.ModuleDeclaration: - case SyntaxKind.ClassDeclaration: - // Label targets cannot be across function boundaries, so do not walk any further - return undefined; - case SyntaxKind.LabelledStatement: - if ((current).label.text === labelName) { - return (current).label; - } - break; + function getTargetLabel(node: Node, labelName: string): Identifier { + while (node) { + if (node.kind === SyntaxKind.LabelledStatement && (node).label.text === labelName) { + return (node).label; } - current = current.parent; + node = node.parent; } return undefined; } diff --git a/tests/cases/fourslash/goToDefinitionLabels.ts b/tests/cases/fourslash/goToDefinitionLabels.ts index c9c37077340..fea447a81fb 100644 --- a/tests/cases/fourslash/goToDefinitionLabels.ts +++ b/tests/cases/fourslash/goToDefinitionLabels.ts @@ -17,9 +17,10 @@ goTo.marker('2'); goTo.definition(); verify.caretAtMarker('label2Definition'); -// no labels accross function bounderies +// labels accross function bounderies goTo.marker('3'); -verify.not.definitionLocationExists(); +goTo.definition(); +verify.caretAtMarker('label1Definition'); // undefined label goTo.marker('4');