From 84bad5e676d6d29831c76dd7893f64fc9270ccb7 Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 3 Jul 2020 01:20:53 +0800 Subject: [PATCH] Use combined node flags --- src/compiler/checker.ts | 16 +++---- .../fourslash/jsdocDeprecated_suggestion5.ts | 46 +++++++++++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 tests/cases/fourslash/jsdocDeprecated_suggestion5.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7c8a38f62125e..6b04d4f955c38 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13287,7 +13287,7 @@ namespace ts { function isUncalledFunctionReference(node: Node, symbol: Symbol) { return !(symbol.flags & (SymbolFlags.Function | SymbolFlags.Method)) || !isCallLikeExpression(findAncestor(node, n => !isAccessExpression(n)) || node.parent) - && every(symbol.declarations, d => !isFunctionLike(d) || !!(d.flags & NodeFlags.Deprecated)); + && every(symbol.declarations, d => !isFunctionLike(d) || !!(getCombinedNodeFlags(d) & NodeFlags.Deprecated)); } function getPropertyTypeForIndexType(originalObjectType: Type, objectType: Type, indexType: Type, fullIndexType: Type, suppressNoImplicitAnyError: boolean, accessNode: ElementAccessExpression | IndexedAccessTypeNode | PropertyName | BindingName | SyntheticExpression | undefined, accessFlags: AccessFlags) { @@ -13296,7 +13296,7 @@ namespace ts { if (propName !== undefined) { const prop = getPropertyOfType(objectType, propName); if (prop) { - if (accessNode && prop.valueDeclaration?.flags & NodeFlags.Deprecated && isUncalledFunctionReference(accessNode, prop)) { + if (accessNode && prop.valueDeclaration && getCombinedNodeFlags(prop.valueDeclaration) & NodeFlags.Deprecated && isUncalledFunctionReference(accessNode, prop)) { const deprecatedNode = accessExpression?.argumentExpression ?? (isIndexedAccessTypeNode(accessNode) ? accessNode.indexType : accessNode); errorOrSuggestion(/* isError */ false, deprecatedNode, Diagnostics._0_is_deprecated, propName as string); } @@ -22061,7 +22061,7 @@ namespace ts { const localOrExportSymbol = getExportSymbolOfValueSymbolIfExported(symbol); let declaration: Declaration | undefined = localOrExportSymbol.valueDeclaration; - if (declaration?.flags & NodeFlags.Deprecated && isUncalledFunctionReference(node.parent, localOrExportSymbol)) { + if (declaration && getCombinedNodeFlags(declaration) & NodeFlags.Deprecated && isUncalledFunctionReference(node.parent, localOrExportSymbol)) { errorOrSuggestion(/* isError */ false, node, Diagnostics._0_is_deprecated, node.escapedText as string);; } if (localOrExportSymbol.flags & SymbolFlags.Class) { @@ -25038,7 +25038,7 @@ namespace ts { propType = indexInfo.type; } else { - if (prop.valueDeclaration?.flags & NodeFlags.Deprecated && isUncalledFunctionReference(node, prop)) { + if (prop.valueDeclaration && getCombinedNodeFlags(prop.valueDeclaration) & NodeFlags.Deprecated && isUncalledFunctionReference(node, prop)) { errorOrSuggestion(/* isError */ false, right, Diagnostics._0_is_deprecated, right.escapedText as string); } @@ -27492,7 +27492,7 @@ namespace ts { } function checkDeprecatedSignature(signature: Signature, node: Node) { - if (signature.declaration && signature.declaration.flags & NodeFlags.Deprecated) { + if (signature.declaration && getCombinedNodeFlags(signature.declaration) & NodeFlags.Deprecated) { errorOrSuggestion(/*isError*/ false, node, Diagnostics._0_is_deprecated, signatureToString(signature)); } } @@ -30883,7 +30883,7 @@ namespace ts { } const symbol = getNodeLinks(node).resolvedSymbol; if (symbol) { - if (every(symbol.declarations, d => !isTypeDeclaration(d) || !!(d.flags & NodeFlags.Deprecated))) { + if (every(symbol.declarations, d => !isTypeDeclaration(d) || !!(getCombinedNodeFlags(d) & NodeFlags.Deprecated))) { const diagLocation = isTypeReferenceNode(node) && isQualifiedName(node.typeName) ? node.typeName.right : node; errorOrSuggestion(/* isError */ false, diagLocation, Diagnostics._0_is_deprecated, symbol.escapedName as string); } @@ -35230,8 +35230,8 @@ namespace ts { } if (isImportSpecifier(node) && - (target.valueDeclaration && target.valueDeclaration.flags & NodeFlags.Deprecated - || every(target.declarations, d => !!(d.flags & NodeFlags.Deprecated)))) { + (target.valueDeclaration && getCombinedNodeFlags(target.valueDeclaration) & NodeFlags.Deprecated + || every(target.declarations, d => !!(getCombinedNodeFlags(d) & NodeFlags.Deprecated)))) { errorOrSuggestion(/* isError */ false, node.name, Diagnostics._0_is_deprecated, symbol.escapedName as string); } } diff --git a/tests/cases/fourslash/jsdocDeprecated_suggestion5.ts b/tests/cases/fourslash/jsdocDeprecated_suggestion5.ts new file mode 100644 index 0000000000000..21f3e946b2af8 --- /dev/null +++ b/tests/cases/fourslash/jsdocDeprecated_suggestion5.ts @@ -0,0 +1,46 @@ +// @Filename: a.tsx +//// /** @deprecated */ +//// type Props = {} + +//// /** @deprecated */ +//// const Component = (props: [|Props|]) => props &&
; + +//// <[|Component|] old="old" new="new" /> + +//// /** @deprecated */ +//// type Options = {} + +//// /** @deprecated */ +//// const deprecatedFunction = (options: [|Options|]) => { options } + +//// [|deprecatedFunction|]({}); + +goTo.file('a.tsx') +const ranges = test.ranges(); + +verify.getSuggestionDiagnostics([ + { + message: "'Props' is deprecated", + code: 6385, + range: ranges[0], + reportsDeprecated: true, + }, + { + message: "'Component' is deprecated", + code: 6385, + range: ranges[1], + reportsDeprecated: true + }, + { + message: "'Options' is deprecated", + code: 6385, + range: ranges[2], + reportsDeprecated: true, + }, + { + message: "'deprecatedFunction' is deprecated", + code: 6385, + range: ranges[3], + reportsDeprecated: true, + } +])