Skip to content

Commit dfe2342

Browse files
authored
fix(41867): completions - omit the deprecated flag if some declarations are not deprecated (#41941)
1 parent 3b222fe commit dfe2342

File tree

5 files changed

+58
-15
lines changed

5 files changed

+58
-15
lines changed

src/services/symbolDisplay.ts

+24-13
Original file line numberDiff line numberDiff line change
@@ -100,31 +100,42 @@ namespace ts.SymbolDisplay {
100100
return ScriptElementKind.unknown;
101101
}
102102

103+
function isDeprecatedDeclaration(decl: Declaration) {
104+
return !!(getCombinedNodeFlagsAlwaysIncludeJSDoc(decl) & ModifierFlags.Deprecated);
105+
}
106+
107+
function getNormalizedSymbolModifiers(symbol: Symbol) {
108+
if (symbol.declarations && symbol.declarations.length) {
109+
const [declaration, ...declarations] = symbol.declarations;
110+
// omit deprecated flag if some declarations are not deprecated
111+
const excludeFlags = length(declarations) && isDeprecatedDeclaration(declaration) && some(declarations, d => !isDeprecatedDeclaration(d))
112+
? ModifierFlags.Deprecated
113+
: ModifierFlags.None;
114+
const modifiers = getNodeModifiers(declaration, excludeFlags);
115+
if (modifiers) {
116+
return modifiers.split(",");
117+
}
118+
}
119+
return [];
120+
}
121+
103122
export function getSymbolModifiers(typeChecker: TypeChecker, symbol: Symbol): string {
104123
if (!symbol) {
105124
return ScriptElementKindModifier.none;
106125
}
107126

108-
const modifiers = new Set<string>();
109-
if (symbol.declarations && symbol.declarations.length > 0) {
110-
const kindModifiers = getNodeModifiers(symbol.declarations[0]);
111-
if (kindModifiers !== ScriptElementKindModifier.none) {
112-
kindModifiers.split(",").forEach(m => modifiers.add(m));
113-
}
114-
}
127+
const modifiers = new Set(getNormalizedSymbolModifiers(symbol));
115128
if (symbol.flags & SymbolFlags.Alias) {
116129
const resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
117-
if (resolvedSymbol !== symbol && resolvedSymbol.declarations && resolvedSymbol.declarations.length > 0) {
118-
const kindModifiers = getNodeModifiers(resolvedSymbol.declarations[0]);
119-
if (kindModifiers !== ScriptElementKindModifier.none) {
120-
kindModifiers.split(",").forEach(m => modifiers.add(m));
121-
}
130+
if (resolvedSymbol !== symbol) {
131+
forEach(getNormalizedSymbolModifiers(resolvedSymbol), modifier => {
132+
modifiers.add(modifier);
133+
});
122134
}
123135
}
124136
if (symbol.flags & SymbolFlags.Optional) {
125137
modifiers.add(ScriptElementKindModifier.optionalModifier);
126138
}
127-
128139
return modifiers.size > 0 ? arrayFrom(modifiers.values()).join(",") : ScriptElementKindModifier.none;
129140
}
130141

src/services/utilities.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1588,9 +1588,11 @@ namespace ts {
15881588
return n.kind === SyntaxKind.EndOfFileToken ? !!(n as EndOfFileToken).jsDoc : n.getWidth(sourceFile) !== 0;
15891589
}
15901590

1591-
export function getNodeModifiers(node: Node): string {
1592-
const flags = isDeclaration(node) ? getCombinedNodeFlagsAlwaysIncludeJSDoc(node) : ModifierFlags.None;
1591+
export function getNodeModifiers(node: Node, excludeFlags = ModifierFlags.None): string {
15931592
const result: string[] = [];
1593+
const flags = isDeclaration(node)
1594+
? getCombinedNodeFlagsAlwaysIncludeJSDoc(node) & ~excludeFlags
1595+
: ModifierFlags.None;
15941596

15951597
if (flags & ModifierFlags.Private) result.push(ScriptElementKindModifier.privateMemberModifier);
15961598
if (flags & ModifierFlags.Protected) result.push(ScriptElementKindModifier.protectedMemberModifier);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
/////** @deprecated foo */
4+
////declare function foo<T>();
5+
/////** @deprecated foo<T> */
6+
////declare function foo<T>(x);
7+
////
8+
////foo/**/
9+
10+
verify.completions({
11+
marker: "",
12+
includes: [
13+
{ name: "foo", kind: "function", kindModifiers: "deprecated,declare" }
14+
]
15+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
/////** @deprecated foo */
4+
////declare function foo<T>();
5+
/////** ok */
6+
////declare function foo<T>(x);
7+
////
8+
////foo/**/
9+
10+
verify.completions({
11+
marker: "",
12+
includes: [
13+
{ name: "foo", kind: "function", kindModifiers: "declare" }
14+
]
15+
});

0 commit comments

Comments
 (0)