Skip to content

Commit f4ca318

Browse files
committed
add binding elements from variable declaration into script lexical structure
1 parent b05f2bf commit f4ca318

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

src/services/navigationBar.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ module ts.NavigationBar {
5050
case SyntaxKind.ArrayBindingPattern:
5151
forEach((<BindingPattern>node).elements, visit);
5252
break;
53+
case SyntaxKind.BindingElement:
5354
case SyntaxKind.VariableDeclaration:
5455
if (isBindingPattern((<VariableDeclaration>node).name)) {
5556
visit((<VariableDeclaration>node).name);
@@ -262,17 +263,34 @@ module ts.NavigationBar {
262263
return createItem(node, getTextOfNode((<FunctionLikeDeclaration>node).name), ts.ScriptElementKind.functionElement);
263264

264265
case SyntaxKind.VariableDeclaration:
265-
if (isBindingPattern((<VariableDeclaration>node).name)) {
266-
break;
266+
case SyntaxKind.BindingElement:
267+
var variableDeclarationNode: Node;
268+
var name: Node;
269+
270+
if (node.kind === SyntaxKind.BindingElement) {
271+
name = (<BindingElement>node).name;
272+
variableDeclarationNode = node;
273+
// binding elements are added only for variable declarations
274+
// bubble up to the containing variable declaration
275+
while (variableDeclarationNode && variableDeclarationNode.kind !== SyntaxKind.VariableDeclaration) {
276+
variableDeclarationNode = variableDeclarationNode.parent;
277+
}
278+
Debug.assert(variableDeclarationNode !== undefined);
267279
}
268-
if (isConst(node)) {
269-
return createItem(node, getTextOfNode((<VariableDeclaration>node).name), ts.ScriptElementKind.constElement);
280+
else {
281+
Debug.assert(!isBindingPattern((<VariableDeclaration>node).name));
282+
variableDeclarationNode = node;
283+
name = (<VariableDeclaration>node).name;
284+
}
285+
286+
if (isConst(variableDeclarationNode)) {
287+
return createItem(node, getTextOfNode(name), ts.ScriptElementKind.constElement);
270288
}
271-
else if (isLet(node)) {
272-
return createItem(node, getTextOfNode((<VariableDeclaration>node).name), ts.ScriptElementKind.letElement);
289+
else if (isLet(variableDeclarationNode)) {
290+
return createItem(node, getTextOfNode(name), ts.ScriptElementKind.letElement);
273291
}
274292
else {
275-
return createItem(node, getTextOfNode((<VariableDeclaration>node).name), ts.ScriptElementKind.variableElement);
293+
return createItem(node, getTextOfNode(name), ts.ScriptElementKind.variableElement);
276294
}
277295

278296
case SyntaxKind.Constructor:
Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
11
/// <reference path='fourslash.ts'/>
2+
////'use strict'
23
////var foo, {}
34
////var bar, []
4-
verify.getScriptLexicalStructureListCount(3); // global (1) + variable declarations (2)
5+
////let foo1, {a, b}
6+
////const bar1, [c, d]
7+
////var {e, x: [f, g]} = {a:1, x:[]};
8+
9+
verify.getScriptLexicalStructureListCount(12); // global (1) + variable declarations (4) + binding patterns (7)
10+
verify.getScriptLexicalStructureListContains("foo", "var");
11+
verify.getScriptLexicalStructureListContains("bar", "var");
12+
verify.getScriptLexicalStructureListContains("foo1", "let")
13+
verify.getScriptLexicalStructureListContains("a", "let");
14+
verify.getScriptLexicalStructureListContains("b", "let");
15+
verify.getScriptLexicalStructureListContains("bar1", "const");
16+
verify.getScriptLexicalStructureListContains("c", "const");
17+
verify.getScriptLexicalStructureListContains("d", "const");
18+
verify.getScriptLexicalStructureListContains("e", "var");
19+
verify.getScriptLexicalStructureListContains("f", "var");
20+
verify.getScriptLexicalStructureListContains("g", "var");
21+

0 commit comments

Comments
 (0)