mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Unwrap parens when checking for JSDocFunctionType in conditional expression (#46962)
This commit is contained in:
parent
4761ba6285
commit
4013271cd8
@ -4539,10 +4539,16 @@ namespace ts {
|
||||
// - "(x,y)" is a comma expression parsed as a signature with two parameters.
|
||||
// - "a ? (b): c" will have "(b):" parsed as a signature with a return type annotation.
|
||||
// - "a ? (b): function() {}" will too, since function() is a valid JSDoc function type.
|
||||
// - "a ? (b): (function() {})" as well, but inside of a parenthesized type.
|
||||
// - "a ? (b): (function() {})" as well, but inside of a parenthesized type with an arbitrary amount of nesting.
|
||||
//
|
||||
// So we need just a bit of lookahead to ensure that it can only be a signature.
|
||||
const hasJSDocFunctionType = type && (isJSDocFunctionType(type) || isParenthesizedTypeNode(type) && isJSDocFunctionType(type.type));
|
||||
|
||||
let unwrappedType = type;
|
||||
while (unwrappedType?.kind === SyntaxKind.ParenthesizedType) {
|
||||
unwrappedType = (unwrappedType as ParenthesizedTypeNode).type; // Skip parens if need be
|
||||
}
|
||||
|
||||
const hasJSDocFunctionType = unwrappedType && isJSDocFunctionType(unwrappedType);
|
||||
if (!allowAmbiguity && token() !== SyntaxKind.EqualsGreaterThanToken && (hasJSDocFunctionType || token() !== SyntaxKind.OpenBraceToken)) {
|
||||
// Returning undefined here will cause our caller to rewind to where we started from.
|
||||
return undefined;
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
//// [parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts]
|
||||
let a: any;
|
||||
const c = true ? (a) : (function() {});
|
||||
const d = true ? (a) : ((function() {}));
|
||||
|
||||
|
||||
//// [parserParenthesizedVariableAndParenthesizedFunctionInTernary.js]
|
||||
var a;
|
||||
var c = true ? (a) : (function () { });
|
||||
var d = true ? (a) : ((function () { }));
|
||||
|
||||
@ -6,3 +6,7 @@ const c = true ? (a) : (function() {});
|
||||
>c : Symbol(c, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 1, 5))
|
||||
>a : Symbol(a, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 0, 3))
|
||||
|
||||
const d = true ? (a) : ((function() {}));
|
||||
>d : Symbol(d, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 2, 5))
|
||||
>a : Symbol(a, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 0, 3))
|
||||
|
||||
|
||||
@ -11,3 +11,13 @@ const c = true ? (a) : (function() {});
|
||||
>(function() {}) : () => void
|
||||
>function() {} : () => void
|
||||
|
||||
const d = true ? (a) : ((function() {}));
|
||||
>d : any
|
||||
>true ? (a) : ((function() {})) : any
|
||||
>true : true
|
||||
>(a) : any
|
||||
>a : any
|
||||
>((function() {})) : () => void
|
||||
>(function() {}) : () => void
|
||||
>function() {} : () => void
|
||||
|
||||
|
||||
@ -1,2 +1,3 @@
|
||||
let a: any;
|
||||
const c = true ? (a) : (function() {});
|
||||
const d = true ? (a) : ((function() {}));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user