From 7541c705bfe9fd3247f5a3471b45c727d5484bca Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 7 Sep 2017 07:45:11 -0700 Subject: [PATCH] Support navTo for special assignment kinds (#18154) * Support navTo for special assignment kinds * Return ScriptElementKind.unknown --- src/compiler/core.ts | 2 ++ src/services/services.ts | 6 +++++ src/services/utilities.ts | 22 +++++++++++++++++++ ...avigationItemsSpecialPropertyAssignment.ts | 20 +++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 tests/cases/fourslash/navigationItemsSpecialPropertyAssignment.ts diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 20f757c3df..f7ff8c27bf 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -2628,4 +2628,6 @@ namespace ts { export function and(f: (arg: T) => boolean, g: (arg: T) => boolean) { return (arg: T) => f(arg) && g(arg); } + + export function assertTypeIsNever(_: never): void {} } diff --git a/src/services/services.ts b/src/services/services.ts index c22229fd08..e0e3bea79f 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -722,6 +722,12 @@ namespace ts { } break; + case SyntaxKind.BinaryExpression: + if (getSpecialPropertyAssignmentKind(node as BinaryExpression) !== SpecialPropertyAssignmentKind.None) { + addDeclaration(node as BinaryExpression); + } + // falls through + default: forEachChild(node, visit); } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index c7f5b5909f..c3a1d5d571 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -343,6 +343,28 @@ namespace ts { return ScriptElementKind.alias; case SyntaxKind.JSDocTypedefTag: return ScriptElementKind.typeElement; + case SyntaxKind.BinaryExpression: + const kind = getSpecialPropertyAssignmentKind(node as BinaryExpression); + const { right } = node as BinaryExpression; + switch (kind) { + case SpecialPropertyAssignmentKind.None: + return ScriptElementKind.unknown; + case SpecialPropertyAssignmentKind.ExportsProperty: + case SpecialPropertyAssignmentKind.ModuleExports: + const rightKind = getNodeKind(right); + return rightKind === ScriptElementKind.unknown ? ScriptElementKind.constElement : rightKind; + case SpecialPropertyAssignmentKind.PrototypeProperty: + return ScriptElementKind.memberFunctionElement; // instance method + case SpecialPropertyAssignmentKind.ThisProperty: + return ScriptElementKind.memberVariableElement; // property + case SpecialPropertyAssignmentKind.Property: + // static method / property + return isFunctionExpression(right) ? ScriptElementKind.memberFunctionElement : ScriptElementKind.memberVariableElement; + default: { + assertTypeIsNever(kind); + return ScriptElementKind.unknown; + } + } default: return ScriptElementKind.unknown; } diff --git a/tests/cases/fourslash/navigationItemsSpecialPropertyAssignment.ts b/tests/cases/fourslash/navigationItemsSpecialPropertyAssignment.ts new file mode 100644 index 0000000000..4618d34b95 --- /dev/null +++ b/tests/cases/fourslash/navigationItemsSpecialPropertyAssignment.ts @@ -0,0 +1,20 @@ +/// + +// @allowJs: true +// @Filename: /a.js +////exports.{| "name": "x", "kind": "const" |}x = 0; +////exports.{| "name": "y", "kind": "function" |}y = function() {}; +////function Cls() { +//// this.{| "name": "prop", "kind": "property" |}prop = 0; +////} +////Cls.{| "name": "staticMethod", "kind": "method" |}staticMethod = function() {}; +////Cls.{| "name": "staticProperty", "kind": "property" |}staticProperty = 0; +////Cls.prototype.{| "name": "instance", "kind": "method" |}instance = function() {}; + +for (const marker of test.markers()) { + verify.navigationItemsListContains( + marker.data.name, + marker.data.kind, + marker.data.name, + "exact"); +}