diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts index 9051ee80399..423ee5e58a6 100644 --- a/src/services/navigationBar.ts +++ b/src/services/navigationBar.ts @@ -50,8 +50,9 @@ module ts.NavigationBar { case SyntaxKind.ArrayBindingPattern: forEach((node).elements, visit); break; + case SyntaxKind.BindingElement: case SyntaxKind.VariableDeclaration: - if (isBindingPattern(node)) { + if (isBindingPattern((node).name)) { visit((node).name); break; } @@ -262,17 +263,34 @@ module ts.NavigationBar { return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.functionElement); case SyntaxKind.VariableDeclaration: - if (isBindingPattern((node).name)) { - break; - } - if (isConst(node)) { - return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.constElement); - } - else if (isLet(node)) { - return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.letElement); + case SyntaxKind.BindingElement: + var variableDeclarationNode: Node; + var name: Node; + + if (node.kind === SyntaxKind.BindingElement) { + name = (node).name; + variableDeclarationNode = node; + // binding elements are added only for variable declarations + // bubble up to the containing variable declaration + while (variableDeclarationNode && variableDeclarationNode.kind !== SyntaxKind.VariableDeclaration) { + variableDeclarationNode = variableDeclarationNode.parent; + } + Debug.assert(variableDeclarationNode !== undefined); } else { - return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.variableElement); + Debug.assert(!isBindingPattern((node).name)); + variableDeclarationNode = node; + name = (node).name; + } + + if (isConst(variableDeclarationNode)) { + return createItem(node, getTextOfNode(name), ts.ScriptElementKind.constElement); + } + else if (isLet(variableDeclarationNode)) { + return createItem(node, getTextOfNode(name), ts.ScriptElementKind.letElement); + } + else { + return createItem(node, getTextOfNode(name), ts.ScriptElementKind.variableElement); } case SyntaxKind.Constructor: diff --git a/tests/cases/fourslash/scriptLexicalStructureBindingPatterns.ts b/tests/cases/fourslash/scriptLexicalStructureBindingPatterns.ts new file mode 100644 index 00000000000..2b363bfad3b --- /dev/null +++ b/tests/cases/fourslash/scriptLexicalStructureBindingPatterns.ts @@ -0,0 +1,21 @@ +/// +////'use strict' +////var foo, {} +////var bar, [] +////let foo1, {a, b} +////const bar1, [c, d] +////var {e, x: [f, g]} = {a:1, x:[]}; + +verify.getScriptLexicalStructureListCount(12); // global (1) + variable declarations (4) + binding patterns (7) +verify.getScriptLexicalStructureListContains("foo", "var"); +verify.getScriptLexicalStructureListContains("bar", "var"); +verify.getScriptLexicalStructureListContains("foo1", "let") +verify.getScriptLexicalStructureListContains("a", "let"); +verify.getScriptLexicalStructureListContains("b", "let"); +verify.getScriptLexicalStructureListContains("bar1", "const"); +verify.getScriptLexicalStructureListContains("c", "const"); +verify.getScriptLexicalStructureListContains("d", "const"); +verify.getScriptLexicalStructureListContains("e", "var"); +verify.getScriptLexicalStructureListContains("f", "var"); +verify.getScriptLexicalStructureListContains("g", "var"); +