Skip to content

Commit 0fe9056

Browse files
committed
support jsx and tagged template functions
1 parent 6253e87 commit 0fe9056

File tree

4 files changed

+127
-16
lines changed

4 files changed

+127
-16
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13285,8 +13285,8 @@ namespace ts {
1328513285
}
1328613286

1328713287
function isUncalledFunctionReference(node: Node, symbol: Symbol) {
13288-
return !(symbol.flags & SymbolFlags.Function)
13289-
|| !isCallExpression(findAncestor(node, n => !isAccessExpression(n)) ?? node.parent)
13288+
return !(symbol.flags & (SymbolFlags.Function | SymbolFlags.Method))
13289+
|| !isCallLikeExpression(findAncestor(node, n => !isAccessExpression(n)) || node.parent)
1329013290
&& every(symbol.declarations, d => !isFunctionLike(d) || !!(d.flags & NodeFlags.Deprecated));
1329113291
}
1329213292

@@ -24609,6 +24609,7 @@ namespace ts {
2460924609
if (isNodeOpeningLikeElement) {
2461024610
const jsxOpeningLikeNode = node as JsxOpeningLikeElement;
2461124611
const sig = getResolvedSignature(jsxOpeningLikeNode);
24612+
checkDeprecatedSignature(sig, node);
2461224613
checkJsxReturnAssignableToAppropriateBound(getJsxReferenceKind(jsxOpeningLikeNode), getReturnTypeOfSignature(sig), jsxOpeningLikeNode);
2461324614
}
2461424615
}
@@ -27429,9 +27430,7 @@ namespace ts {
2742927430
return nonInferrableType;
2743027431
}
2743127432

27432-
if (signature.declaration && signature.declaration.flags & NodeFlags.Deprecated) {
27433-
errorOrSuggestion(/*isError*/ false, node, Diagnostics._0_is_deprecated, signatureToString(signature));
27434-
}
27433+
checkDeprecatedSignature(signature, node);
2743527434

2743627435
if (node.expression.kind === SyntaxKind.SuperKeyword) {
2743727436
return voidType;
@@ -27492,6 +27491,12 @@ namespace ts {
2749227491
return returnType;
2749327492
}
2749427493

27494+
function checkDeprecatedSignature(signature: Signature, node: Node) {
27495+
if (signature.declaration && signature.declaration.flags & NodeFlags.Deprecated) {
27496+
errorOrSuggestion(/*isError*/ false, node, Diagnostics._0_is_deprecated, signatureToString(signature));
27497+
}
27498+
}
27499+
2749527500
function isSymbolOrSymbolForCall(node: Node) {
2749627501
if (!isCallExpression(node)) return false;
2749727502
let left = node.expression;
@@ -27600,7 +27605,9 @@ namespace ts {
2760027605
if (languageVersion < ScriptTarget.ES2015) {
2760127606
checkExternalEmitHelpers(node, ExternalEmitHelpers.MakeTemplateObject);
2760227607
}
27603-
return getReturnTypeOfSignature(getResolvedSignature(node));
27608+
const signature = getResolvedSignature(node)
27609+
checkDeprecatedSignature(signature, node);
27610+
return getReturnTypeOfSignature(signature);
2760427611
}
2760527612

2760627613
function checkAssertion(node: AssertionExpression) {

tests/cases/fourslash/jsdocDeprecated_suggestion1.ts

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,41 @@
2424
//// /** @deprecated */
2525
//// export type QW = [|Foo|][[|"zzz"|]]
2626
//// export type WQ = [|QW|]
27-
27+
//// class C {
28+
//// /** @deprecated */
29+
//// constructor() {
30+
//// }
31+
//// /** @deprecated */
32+
//// m() { }
33+
//// }
34+
//// /** @deprecated */
35+
//// class D {
36+
//// constructor() {
37+
//// }
38+
//// }
39+
//// var c = [|new C()|]
40+
//// [|c.m()|]
41+
//// c.[|m|]
42+
//// new [|D|]()
43+
//// C
44+
//// [|D|]
45+
// @Filename: j.tsx
46+
//// type Props = { someProp?: any }
47+
//// declare var props: Props
48+
//// /** @deprecated */
49+
//// function Compi(_props: Props) {
50+
//// return <div></div>
51+
//// }
52+
//// [|Compi|];
53+
//// [|<Compi />|];
54+
//// [|<Compi {...props}>|]<div></div></[|Compi|]>;
55+
//// /** @deprecated */
56+
//// function ttf(_x: unknown) {
57+
//// }
58+
//// [|ttf``|]
59+
//// [|ttf|]
2860
// @Filename: b.ts
61+
//// // imports and aliases
2962
//// import * as f from './a';
3063
//// import { [|bar|], [|QW|] } from './a';
3164
//// [|f.bar()|];
@@ -113,62 +146,131 @@ verify.getSuggestionDiagnostics([
113146
"reportsDeprecated": true,
114147
"range": ranges[11]
115148
},
149+
{
150+
"code": 6385,
151+
"message": "'(): C' is deprecated",
152+
"reportsDeprecated": true,
153+
"range": ranges[12]
154+
},
155+
{
156+
"code": 6385,
157+
"message": "'(): void' is deprecated",
158+
"reportsDeprecated": true,
159+
"range": ranges[13]
160+
},
161+
{
162+
"code": 6385,
163+
"message": "'m' is deprecated",
164+
"reportsDeprecated": true,
165+
"range": ranges[14]
166+
},
167+
{
168+
"code": 6385,
169+
"message": "'D' is deprecated",
170+
"reportsDeprecated": true,
171+
"range": ranges[15]
172+
},
173+
{
174+
"code": 6385,
175+
"message": "'D' is deprecated",
176+
"reportsDeprecated": true,
177+
"range": ranges[16]
178+
},
116179
]);
117180

181+
goTo.file('j.tsx')
182+
verify.getSuggestionDiagnostics([
183+
{
184+
"code": 6385,
185+
"message": "'Compi' is deprecated",
186+
"reportsDeprecated": true,
187+
"range": ranges[17]
188+
},
189+
{
190+
"code": 6385,
191+
"message": "'(_props: Props): any' is deprecated",
192+
"reportsDeprecated": true,
193+
"range": ranges[18]
194+
},
195+
{
196+
"code": 6385,
197+
"message": "'(_props: Props): any' is deprecated",
198+
"reportsDeprecated": true,
199+
"range": ranges[19]
200+
},
201+
{
202+
"code": 6385,
203+
"message": "'Compi' is deprecated",
204+
"reportsDeprecated": true,
205+
"range": ranges[20]
206+
},
207+
{
208+
"code": 6385,
209+
"message": "'(_x: unknown): void' is deprecated",
210+
"reportsDeprecated": true,
211+
"range": ranges[21]
212+
},
213+
{
214+
"code": 6385,
215+
"message": "'ttf' is deprecated",
216+
"reportsDeprecated": true,
217+
"range": ranges[22]
218+
},
219+
]);
118220
goTo.file('b.ts')
119221
verify.getSuggestionDiagnostics([
120222
{
121223
"code": 6385,
122224
"message": "'bar' is deprecated",
123225
"reportsDeprecated": true,
124-
"range": ranges[12]
226+
"range": ranges[23]
125227
},
126228
{
127229
"code": 6385,
128230
"message": "'QW' is deprecated",
129231
"reportsDeprecated": true,
130-
"range": ranges[13]
232+
"range": ranges[24]
131233
},
132234
{
133235
"code": 6385,
134236
"message": "'(): void' is deprecated",
135237
"reportsDeprecated": true,
136-
"range": ranges[14]
238+
"range": ranges[25]
137239
},
138240
{
139241
"code": 6385,
140242
"message": "'(): void' is deprecated",
141243
"reportsDeprecated": true,
142-
"range": ranges[15]
244+
"range": ranges[26]
143245
},
144246
{
145247
"code": 6385,
146248
"message": "'(): void' is deprecated",
147249
"reportsDeprecated": true,
148-
"range": ranges[16]
250+
"range": ranges[27]
149251
},
150252
{
151253
"code": 6385,
152254
"message": "'QW' is deprecated",
153255
"reportsDeprecated": true,
154-
"range": ranges[17]
256+
"range": ranges[28]
155257
},
156258
{
157259
"code": 6385,
158260
"message": "'Foo' is deprecated",
159261
"reportsDeprecated": true,
160-
"range": ranges[18]
262+
"range": ranges[29]
161263
},
162264
{
163265
"code": 6385,
164266
"message": "'QW' is deprecated",
165267
"reportsDeprecated": true,
166-
"range": ranges[19]
268+
"range": ranges[30]
167269
},
168270
{
169271
"code": 6196,
170272
"message": "'O' is declared but never used.",
171273
"reportsUnnecessary": true,
172-
"range": ranges[20]
274+
"range": ranges[31]
173275
}
174276
])

tests/cases/fourslash/jsdocDeprecated_suggestion2.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
///<reference path="fourslash.ts" />
22

3+
//// // overloads
34
//// declare function foo(a: string): number;
45
//// /** @deprecated */
56
//// declare function foo(): undefined;

tests/cases/fourslash/jsdocDeprecated_suggestion3.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
///<reference path="fourslash.ts" />
22

3+
//// // merges
34
//// /** @deprecated */
45
//// interface a { a: number }
56
//// declare function a(): void

0 commit comments

Comments
 (0)