Skip to content

Commit 71559a5

Browse files
authored
Fix show deprecated suggestion for alias (#41128)
* Fix show deprecated suggestion for alias * Fix failing tests * Avoid duplicated kind modifiers
1 parent 669305b commit 71559a5

10 files changed

+58
-20
lines changed

src/services/completions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ namespace ts.Completions {
447447
return {
448448
name,
449449
kind: SymbolDisplay.getSymbolKind(typeChecker, symbol, location!), // TODO: GH#18217
450-
kindModifiers: SymbolDisplay.getSymbolModifiers(symbol),
450+
kindModifiers: SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
451451
sortText,
452452
source: getSourceFromOrigin(origin),
453453
hasAction: origin && originIsExport(origin) || undefined,
@@ -697,7 +697,7 @@ namespace ts.Completions {
697697
checker.runWithCancellationToken(cancellationToken, checker =>
698698
SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(checker, symbol, sourceFile, location, location, SemanticMeaning.All)
699699
);
700-
return createCompletionDetails(symbol.name, SymbolDisplay.getSymbolModifiers(symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
700+
return createCompletionDetails(symbol.name, SymbolDisplay.getSymbolModifiers(checker, symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
701701
}
702702

703703
export function createCompletionDetails(name: string, kindModifiers: string, kind: ScriptElementKind, displayParts: SymbolDisplayPart[], documentation?: SymbolDisplayPart[], tags?: JSDocTagInfo[], codeActions?: CodeAction[], source?: SymbolDisplayPart[]): CompletionEntryDetails {

src/services/rename.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ namespace ts.Rename {
5252
: undefined;
5353
const displayName = specifierName || typeChecker.symbolToString(symbol);
5454
const fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
55-
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(symbol), node, sourceFile);
55+
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(typeChecker,symbol), node, sourceFile);
5656
}
5757

5858
function getRenameInfoForModule(node: StringLiteralLike, sourceFile: SourceFile, moduleSymbol: Symbol): RenameInfo | undefined {

src/services/services.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1607,7 +1607,7 @@ namespace ts {
16071607
);
16081608
return {
16091609
kind: symbolKind,
1610-
kindModifiers: SymbolDisplay.getSymbolModifiers(symbol),
1610+
kindModifiers: SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
16111611
textSpan: createTextSpanFromNode(nodeForQuickInfo, sourceFile),
16121612
displayParts,
16131613
documentation,

src/services/symbolDisplay.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,32 @@ namespace ts.SymbolDisplay {
102102
return ScriptElementKind.unknown;
103103
}
104104

105-
export function getSymbolModifiers(symbol: Symbol): string {
106-
const nodeModifiers = symbol && symbol.declarations && symbol.declarations.length > 0
107-
? getNodeModifiers(symbol.declarations[0])
108-
: ScriptElementKindModifier.none;
109-
110-
const symbolModifiers = symbol && symbol.flags & SymbolFlags.Optional ?
111-
ScriptElementKindModifier.optionalModifier
112-
: ScriptElementKindModifier.none;
113-
return nodeModifiers && symbolModifiers ? nodeModifiers + "," + symbolModifiers : nodeModifiers || symbolModifiers;
105+
export function getSymbolModifiers(typeChecker: TypeChecker, symbol: Symbol): string {
106+
if (!symbol) {
107+
return ScriptElementKindModifier.none;
108+
}
109+
110+
const modifiers = new Set<string>();
111+
if (symbol.declarations && symbol.declarations.length > 0) {
112+
const kindModifiers = getNodeModifiers(symbol.declarations[0]);
113+
if (kindModifiers !== ScriptElementKindModifier.none) {
114+
kindModifiers.split(",").forEach(m => modifiers.add(m));
115+
}
116+
}
117+
if (symbol.flags & SymbolFlags.Alias) {
118+
const resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
119+
if (resolvedSymbol !== symbol && resolvedSymbol.declarations && resolvedSymbol.declarations.length > 0) {
120+
const kindModifiers = getNodeModifiers(resolvedSymbol.declarations[0]);
121+
if (kindModifiers !== ScriptElementKindModifier.none) {
122+
kindModifiers.split(",").forEach(m => modifiers.add(m));
123+
}
124+
}
125+
}
126+
if (symbol.flags & SymbolFlags.Optional) {
127+
modifiers.add(ScriptElementKindModifier.optionalModifier);
128+
}
129+
130+
return modifiers.size > 0 ? arrayFrom(modifiers.values()).join(",") : ScriptElementKindModifier.none;
114131
}
115132

116133
interface SymbolDisplayPartsDocumentationAndSymbolKind {

tests/baselines/reference/quickInfoDisplayPartsInternalModuleAlias.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
},
161161
"quickInfo": {
162162
"kind": "alias",
163-
"kindModifiers": "",
163+
"kindModifiers": "export",
164164
"textSpan": {
165165
"start": 104,
166166
"length": 2
@@ -245,7 +245,7 @@
245245
},
246246
"quickInfo": {
247247
"kind": "alias",
248-
"kindModifiers": "",
248+
"kindModifiers": "export",
249249
"textSpan": {
250250
"start": 123,
251251
"length": 2

tests/cases/fourslash/completionsExportImport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
verify.completions({
1212
marker: "",
1313
exact: [
14-
{ name: "foo", kind: "alias", kindModifiers: "export", text: "(alias) const foo: number\nimport foo = N.foo" },
14+
{ name: "foo", kind: "alias", kindModifiers: "export,declare", text: "(alias) const foo: number\nimport foo = N.foo" },
1515
...completion.globalsPlus([{ name: "N", kind: "module", kindModifiers: "declare", text: "namespace N" }]),
1616
],
1717
});

tests/cases/fourslash/completionsImport_named_didNotExistBefore.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ verify.completions({
1616
{
1717
name: "Test2",
1818
text: "(alias) function Test2(): void\nimport Test2",
19-
kind: "alias"
19+
kind: "alias",
20+
kindModifiers: "export"
2021
},
2122
completion.globalThisEntry,
2223
completion.undefinedVarEntry,

tests/cases/fourslash/completionsImport_reExportDefault.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ verify.completions({
3434
sourceDisplay: "./a",
3535
text: "(alias) function foo(): void\nexport foo",
3636
kind: "alias",
37+
kindModifiers: "export",
3738
hasAction: true,
3839
sortText: completion.SortText.AutoImportSuggestions
3940
},

tests/cases/fourslash/completionsWithDeprecatedTag.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
/// <reference path="fourslash.ts" />
22
// @strict: true
33

4+
// @filename: /foobar.ts
5+
//// /** @deprecated */
6+
//// export function foobar() {}
7+
8+
// @filename: /foo.ts
9+
//// import { foobar/*4*/ } from "./foobar";
10+
////
411
//// /** @deprecated */
512
//// interface Foo {
613
//// /** @deprecated */
@@ -12,6 +19,8 @@
1219
//// declare const foooo: Fo/*1*/;
1320
//// foo.ba/*2*/;
1421
//// foo.pro/*3*/;
22+
////
23+
//// fooba/*5*/;
1524

1625
verify.completions({
1726
marker: "1",
@@ -28,5 +37,15 @@ verify.completions({
2837
includes: [
2938
{ name: "prop", kind: "property", kindModifiers: "deprecated" }
3039
]
31-
});
32-
40+
}, {
41+
marker: "4",
42+
includes: [
43+
{ name: "foobar", kind: "function", kindModifiers: "export,deprecated" }
44+
]
45+
}, {
46+
marker: "5",
47+
includes: [
48+
{ name: "foobar", kind: "alias", kindModifiers: "export,deprecated" }
49+
]
50+
}
51+
);

tests/cases/fourslash/quickInfoAlias.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
goTo.eachMarker((_, index) => {
2929
verify.verifyQuickInfoDisplayParts(
3030
"alias",
31-
"",
31+
"export",
3232
{ start: index === 0 ? 25 : 117, length: 1 },
3333
[
3434
{ text:"(",kind:"punctuation" },

0 commit comments

Comments
 (0)