diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts index ca06d40fa88..b8106fc18d4 100644 --- a/src/services/navigationBar.ts +++ b/src/services/navigationBar.ts @@ -238,6 +238,9 @@ module ts.NavigationBar { if (node.flags & NodeFlags.Const) { return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.constantElement); } + else if (node.flags & NodeFlags.Let) { + return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.letElement); + } else { return createItem(node, getTextOfNode((node).name), ts.ScriptElementKind.variableElement); } diff --git a/src/services/services.ts b/src/services/services.ts index 800d63738f0..4cf65d820c7 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1225,6 +1225,8 @@ module ts { static alias = "alias"; static constantElement = "constant"; + + static letElement = "let"; } export class ScriptElementKindModifier { @@ -2857,9 +2859,12 @@ module ts { if (isFirstDeclarationOfSymbolParameter(symbol)) { return ScriptElementKind.parameterElement; } - else if(symbol.valueDeclaration && symbol.valueDeclaration.flags & NodeFlags.Const) { + else if (symbol.valueDeclaration && symbol.valueDeclaration.flags & NodeFlags.Const) { return ScriptElementKind.constantElement; } + else if (forEach(symbol.declarations, declaration => declaration.flags & NodeFlags.Let)) { + return ScriptElementKind.letElement; + } return isLocalVariableOrFunction(symbol) ? ScriptElementKind.localVariableElement : ScriptElementKind.variableElement; } if (flags & SymbolFlags.Function) return isLocalVariableOrFunction(symbol) ? ScriptElementKind.localFunctionElement : ScriptElementKind.functionElement; @@ -2915,7 +2920,11 @@ module ts { case SyntaxKind.InterfaceDeclaration: return ScriptElementKind.interfaceElement; case SyntaxKind.TypeAliasDeclaration: return ScriptElementKind.typeElement; case SyntaxKind.EnumDeclaration: return ScriptElementKind.enumElement; - case SyntaxKind.VariableDeclaration: return node.flags & NodeFlags.Const ? ScriptElementKind.constantElement: ScriptElementKind.variableElement; + case SyntaxKind.VariableDeclaration: return node.flags & NodeFlags.Const ? + ScriptElementKind.constantElement : + node.flags & NodeFlags.Let ? + ScriptElementKind.letElement : + ScriptElementKind.variableElement; case SyntaxKind.FunctionDeclaration: return ScriptElementKind.functionElement; case SyntaxKind.GetAccessor: return ScriptElementKind.memberGetAccessorElement; case SyntaxKind.SetAccessor: return ScriptElementKind.memberSetAccessorElement; diff --git a/tests/cases/fourslash/constQuickInfoAndCompletionList.ts b/tests/cases/fourslash/constQuickInfoAndCompletionList.ts new file mode 100644 index 00000000000..421a9819d44 --- /dev/null +++ b/tests/cases/fourslash/constQuickInfoAndCompletionList.ts @@ -0,0 +1,37 @@ +/// + +////const /*1*/a = 10; +////var x = /*2*/a; +/////*3*/ +////function foo() { +//// const /*4*/b = 20; +//// var y = /*5*/b; +//// var z = /*6*/a; +//// /*7*/ +////} +goTo.marker('1'); +verify.quickInfoIs("(constant) a: number"); + +goTo.marker('2'); +verify.completionListContains("a", "(constant) a: number"); +verify.quickInfoIs("(constant) a: number"); + +goTo.marker('3'); +verify.completionListContains("a", "(constant) a: number"); + +goTo.marker('4'); +verify.quickInfoIs("(constant) b: number"); + +goTo.marker('5'); +verify.completionListContains("a", "(constant) a: number"); +verify.completionListContains("b", "(constant) b: number"); +verify.quickInfoIs("(constant) b: number"); + +goTo.marker('6'); +verify.completionListContains("a", "(constant) a: number"); +verify.completionListContains("b", "(constant) b: number"); +verify.quickInfoIs("(constant) a: number"); + +goTo.marker('7'); +verify.completionListContains("a", "(constant) a: number"); +verify.completionListContains("b", "(constant) b: number"); \ No newline at end of file diff --git a/tests/cases/fourslash/letQuickInfoAndCompletionList.ts b/tests/cases/fourslash/letQuickInfoAndCompletionList.ts new file mode 100644 index 00000000000..127b4d626fd --- /dev/null +++ b/tests/cases/fourslash/letQuickInfoAndCompletionList.ts @@ -0,0 +1,28 @@ +/// + +////let /*1*/a = 10; +/////*2*/a = 30; +////function foo() { +//// let /*3*/b = 20; +//// /*4*/b = /*5*/a; +////} + +goTo.marker('1'); +verify.quickInfoIs("(let) a: number"); + +goTo.marker('2'); +verify.completionListContains("a", "(let) a: number"); +verify.quickInfoIs("(let) a: number"); + +goTo.marker('3'); +verify.quickInfoIs("(let) b: number"); + +goTo.marker('4'); +verify.completionListContains("a", "(let) a: number"); +verify.completionListContains("b", "(let) b: number"); +verify.quickInfoIs("(let) b: number"); + +goTo.marker('5'); +verify.completionListContains("a", "(let) a: number"); +verify.completionListContains("b", "(let) b: number"); +verify.quickInfoIs("(let) a: number"); \ No newline at end of file diff --git a/tests/cases/fourslash/navbar_let.ts b/tests/cases/fourslash/navbar_let.ts new file mode 100644 index 00000000000..841382abc53 --- /dev/null +++ b/tests/cases/fourslash/navbar_let.ts @@ -0,0 +1,13 @@ +/// + +//// {| "itemName": "c", "kind": "let", "parentName": "" |}let c = 0; + +test.markers().forEach(marker => { + verify.getScriptLexicalStructureListContains( + marker.data.itemName, + marker.data.kind, + marker.fileName, + marker.data.parentName, + marker.data.isAdditionalRange, + marker.position); +}); \ No newline at end of file diff --git a/tests/cases/fourslash/navigateItemsConst.ts b/tests/cases/fourslash/navigateItemsConst.ts new file mode 100644 index 00000000000..6f0fdf717ff --- /dev/null +++ b/tests/cases/fourslash/navigateItemsConst.ts @@ -0,0 +1,16 @@ +/// + +////{| "itemName": "c", "kind": "constant", "parentName": "" |}const c = 10; +////function foo() { +//// {| "itemName": "d", "kind": "constant", "parentName": "foo" |}const d = 10; +////} + +test.markers().forEach(marker => { + verify.navigationItemsListContains( + marker.data.itemName, + marker.data.kind, + marker.data.itemName, + "exact", + marker.fileName, + marker.data.parentName); +}); \ No newline at end of file diff --git a/tests/cases/fourslash/navigateItemsLet.ts b/tests/cases/fourslash/navigateItemsLet.ts new file mode 100644 index 00000000000..dc399522703 --- /dev/null +++ b/tests/cases/fourslash/navigateItemsLet.ts @@ -0,0 +1,16 @@ +/// + +////{| "itemName": "c", "kind": "let", "parentName": "" |}let c = 10; +////function foo() { +//// {| "itemName": "d", "kind": "let", "parentName": "foo" |}let d = 10; +////} + +test.markers().forEach(marker => { + verify.navigationItemsListContains( + marker.data.itemName, + marker.data.kind, + marker.data.itemName, + "exact", + marker.fileName, + marker.data.parentName); +}); \ No newline at end of file