From 9ba08006460cd4e03ac2ea1b3f75a6775147dc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sat, 6 Apr 2024 00:38:53 +0200 Subject: [PATCH] Fixed braceless type tags with types starting with an open parenthesis (#57167) Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> --- src/compiler/scanner.ts | 4 ++ src/compiler/types.ts | 2 + tests/baselines/reference/api/typescript.d.ts | 2 +- .../jsdocBracelessTypeTag1.errors.txt | 31 +++++++++ .../reference/jsdocBracelessTypeTag1.symbols | 38 +++++++++++ .../reference/jsdocBracelessTypeTag1.types | 65 +++++++++++++++++++ .../cases/compiler/jsdocBracelessTypeTag1.ts | 26 ++++++++ 7 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/jsdocBracelessTypeTag1.errors.txt create mode 100644 tests/baselines/reference/jsdocBracelessTypeTag1.symbols create mode 100644 tests/baselines/reference/jsdocBracelessTypeTag1.types create mode 100644 tests/cases/compiler/jsdocBracelessTypeTag1.ts diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 9a3331badd3..6f9703d9f55 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -2656,6 +2656,10 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean return token = SyntaxKind.OpenBracketToken; case CharacterCodes.closeBracket: return token = SyntaxKind.CloseBracketToken; + case CharacterCodes.openParen: + return token = SyntaxKind.OpenParenToken; + case CharacterCodes.closeParen: + return token = SyntaxKind.CloseParenToken; case CharacterCodes.lessThan: return token = SyntaxKind.LessThanToken; case CharacterCodes.greaterThan: diff --git a/src/compiler/types.ts b/src/compiler/types.ts index de8c11600da..412686d00f4 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -764,6 +764,8 @@ export type JSDocSyntaxKind = | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken + | SyntaxKind.OpenParenToken + | SyntaxKind.CloseParenToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 3adacffaa8f..fba4ecc14fb 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4134,7 +4134,7 @@ declare namespace ts { type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword; type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | KeywordSyntaxKind; type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken; - type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.Unknown | KeywordSyntaxKind; + type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.Unknown | KeywordSyntaxKind; enum NodeFlags { None = 0, Let = 1, diff --git a/tests/baselines/reference/jsdocBracelessTypeTag1.errors.txt b/tests/baselines/reference/jsdocBracelessTypeTag1.errors.txt new file mode 100644 index 00000000000..dcff555f1a4 --- /dev/null +++ b/tests/baselines/reference/jsdocBracelessTypeTag1.errors.txt @@ -0,0 +1,31 @@ +index.js(3,3): error TS2322: Type 'number' is not assignable to type 'string'. +index.js(20,16): error TS2322: Type '"other"' is not assignable to type '"foo" | "bar"'. + + +==== index.js (2 errors) ==== + /** @type () => string */ + function fn1() { + return 42; + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + } + + /** @type () => string */ + function fn2() { + return "foo"; + } + + /** @type (arg: string) => string */ + function fn3(arg) { + return arg; + } + + /** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ + const obj1 = { type: "foo", prop: 10 }; + + /** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ + const obj2 = { type: "other", prop: 10 }; + ~~~~ +!!! error TS2322: Type '"other"' is not assignable to type '"foo" | "bar"'. +!!! related TS6500 index.js:19:14: The expected type comes from property 'type' which is declared here on type '({ type: "foo"; } | { type: "bar"; }) & { prop: number; }' + \ No newline at end of file diff --git a/tests/baselines/reference/jsdocBracelessTypeTag1.symbols b/tests/baselines/reference/jsdocBracelessTypeTag1.symbols new file mode 100644 index 00000000000..605a7908e53 --- /dev/null +++ b/tests/baselines/reference/jsdocBracelessTypeTag1.symbols @@ -0,0 +1,38 @@ +//// [tests/cases/compiler/jsdocBracelessTypeTag1.ts] //// + +=== index.js === +/** @type () => string */ +function fn1() { +>fn1 : Symbol(fn1, Decl(index.js, 0, 0)) + + return 42; +} + +/** @type () => string */ +function fn2() { +>fn2 : Symbol(fn2, Decl(index.js, 3, 1)) + + return "foo"; +} + +/** @type (arg: string) => string */ +function fn3(arg) { +>fn3 : Symbol(fn3, Decl(index.js, 8, 1)) +>arg : Symbol(arg, Decl(index.js, 11, 13)) + + return arg; +>arg : Symbol(arg, Decl(index.js, 11, 13)) +} + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj1 = { type: "foo", prop: 10 }; +>obj1 : Symbol(obj1, Decl(index.js, 16, 5)) +>type : Symbol(type, Decl(index.js, 16, 14)) +>prop : Symbol(prop, Decl(index.js, 16, 27)) + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj2 = { type: "other", prop: 10 }; +>obj2 : Symbol(obj2, Decl(index.js, 19, 5)) +>type : Symbol(type, Decl(index.js, 19, 14)) +>prop : Symbol(prop, Decl(index.js, 19, 29)) + diff --git a/tests/baselines/reference/jsdocBracelessTypeTag1.types b/tests/baselines/reference/jsdocBracelessTypeTag1.types new file mode 100644 index 00000000000..bb655974cf0 --- /dev/null +++ b/tests/baselines/reference/jsdocBracelessTypeTag1.types @@ -0,0 +1,65 @@ +//// [tests/cases/compiler/jsdocBracelessTypeTag1.ts] //// + +=== index.js === +/** @type () => string */ +function fn1() { +>fn1 : () => string +> : ^^^^^^ + + return 42; +>42 : 42 +> : ^^ +} + +/** @type () => string */ +function fn2() { +>fn2 : () => string +> : ^^^^^^ + + return "foo"; +>"foo" : "foo" +> : ^^^^^ +} + +/** @type (arg: string) => string */ +function fn3(arg) { +>fn3 : (arg: string) => string +> : ^ ^^ ^^^^^ +>arg : string +> : ^^^^^^ + + return arg; +>arg : string +> : ^^^^^^ +} + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj1 = { type: "foo", prop: 10 }; +>obj1 : ({ type: "foo"; } | { type: "bar"; }) & { prop: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ type: "foo", prop: 10 } : { type: "foo"; prop: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>type : "foo" +> : ^^^^^ +>"foo" : "foo" +> : ^^^^^ +>prop : number +> : ^^^^^^ +>10 : 10 +> : ^^ + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj2 = { type: "other", prop: 10 }; +>obj2 : ({ type: "foo"; } | { type: "bar"; }) & { prop: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ type: "other", prop: 10 } : { type: "other"; prop: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>type : "other" +> : ^^^^^^^ +>"other" : "other" +> : ^^^^^^^ +>prop : number +> : ^^^^^^ +>10 : 10 +> : ^^ + diff --git a/tests/cases/compiler/jsdocBracelessTypeTag1.ts b/tests/cases/compiler/jsdocBracelessTypeTag1.ts new file mode 100644 index 00000000000..ec6f2e63bdc --- /dev/null +++ b/tests/cases/compiler/jsdocBracelessTypeTag1.ts @@ -0,0 +1,26 @@ +// @strict: true +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @filename: index.js + +/** @type () => string */ +function fn1() { + return 42; +} + +/** @type () => string */ +function fn2() { + return "foo"; +} + +/** @type (arg: string) => string */ +function fn3(arg) { + return arg; +} + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj1 = { type: "foo", prop: 10 }; + +/** @type ({ type: 'foo' } | { type: 'bar' }) & { prop: number } */ +const obj2 = { type: "other", prop: 10 };