Fix show deprecated suggestion for alias (#41128)

* Fix show deprecated suggestion for alias

* Fix failing tests

* Avoid duplicated kind modifiers
This commit is contained in:
Jean Pierre
2020-11-23 18:50:12 -05:00
committed by GitHub
parent 669305b914
commit 71559a5c0c
10 changed files with 57 additions and 19 deletions

View File

@@ -447,7 +447,7 @@ namespace ts.Completions {
return {
name,
kind: SymbolDisplay.getSymbolKind(typeChecker, symbol, location!), // TODO: GH#18217
kindModifiers: SymbolDisplay.getSymbolModifiers(symbol),
kindModifiers: SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
sortText,
source: getSourceFromOrigin(origin),
hasAction: origin && originIsExport(origin) || undefined,
@@ -697,7 +697,7 @@ namespace ts.Completions {
checker.runWithCancellationToken(cancellationToken, checker =>
SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(checker, symbol, sourceFile, location, location, SemanticMeaning.All)
);
return createCompletionDetails(symbol.name, SymbolDisplay.getSymbolModifiers(symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
return createCompletionDetails(symbol.name, SymbolDisplay.getSymbolModifiers(checker, symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
}
export function createCompletionDetails(name: string, kindModifiers: string, kind: ScriptElementKind, displayParts: SymbolDisplayPart[], documentation?: SymbolDisplayPart[], tags?: JSDocTagInfo[], codeActions?: CodeAction[], source?: SymbolDisplayPart[]): CompletionEntryDetails {

View File

@@ -52,7 +52,7 @@ namespace ts.Rename {
: undefined;
const displayName = specifierName || typeChecker.symbolToString(symbol);
const fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(symbol), node, sourceFile);
return getRenameInfoSuccess(displayName, fullDisplayName, kind, SymbolDisplay.getSymbolModifiers(typeChecker,symbol), node, sourceFile);
}
function getRenameInfoForModule(node: StringLiteralLike, sourceFile: SourceFile, moduleSymbol: Symbol): RenameInfo | undefined {

View File

@@ -1607,7 +1607,7 @@ namespace ts {
);
return {
kind: symbolKind,
kindModifiers: SymbolDisplay.getSymbolModifiers(symbol),
kindModifiers: SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
textSpan: createTextSpanFromNode(nodeForQuickInfo, sourceFile),
displayParts,
documentation,

View File

@@ -102,15 +102,32 @@ namespace ts.SymbolDisplay {
return ScriptElementKind.unknown;
}
export function getSymbolModifiers(symbol: Symbol): string {
const nodeModifiers = symbol && symbol.declarations && symbol.declarations.length > 0
? getNodeModifiers(symbol.declarations[0])
: ScriptElementKindModifier.none;
export function getSymbolModifiers(typeChecker: TypeChecker, symbol: Symbol): string {
if (!symbol) {
return ScriptElementKindModifier.none;
}
const symbolModifiers = symbol && symbol.flags & SymbolFlags.Optional ?
ScriptElementKindModifier.optionalModifier
: ScriptElementKindModifier.none;
return nodeModifiers && symbolModifiers ? nodeModifiers + "," + symbolModifiers : nodeModifiers || symbolModifiers;
const modifiers = new Set<string>();
if (symbol.declarations && symbol.declarations.length > 0) {
const kindModifiers = getNodeModifiers(symbol.declarations[0]);
if (kindModifiers !== ScriptElementKindModifier.none) {
kindModifiers.split(",").forEach(m => modifiers.add(m));
}
}
if (symbol.flags & SymbolFlags.Alias) {
const resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
if (resolvedSymbol !== symbol && resolvedSymbol.declarations && resolvedSymbol.declarations.length > 0) {
const kindModifiers = getNodeModifiers(resolvedSymbol.declarations[0]);
if (kindModifiers !== ScriptElementKindModifier.none) {
kindModifiers.split(",").forEach(m => modifiers.add(m));
}
}
}
if (symbol.flags & SymbolFlags.Optional) {
modifiers.add(ScriptElementKindModifier.optionalModifier);
}
return modifiers.size > 0 ? arrayFrom(modifiers.values()).join(",") : ScriptElementKindModifier.none;
}
interface SymbolDisplayPartsDocumentationAndSymbolKind {