From 172db13306dec523f63423d4ca2cdd7396b19766 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 14 Jul 2017 14:34:32 -0700 Subject: [PATCH] Parse more types in JSDoc function() syntax Also some cleanup from PR comments --- src/compiler/checker.ts | 4 +++ src/compiler/parser.ts | 6 +++- src/compiler/utilities.ts | 4 --- .../reference/jsdocFunctionType.symbols | 6 ++++ .../reference/jsdocFunctionType.types | 12 ++++++++ .../jsdocTypesInTypeAnnotations.errors.txt | 29 ------------------- tests/baselines/reference/jsweird.symbols | 14 --------- tests/baselines/reference/jsweird.types | 16 ---------- .../conformance/jsdoc/jsdocFunctionType.ts | 3 ++ .../jsdoc/jsdocTypesInTypeAnnotations.ts | 22 -------------- 10 files changed, 30 insertions(+), 86 deletions(-) delete mode 100644 tests/baselines/reference/jsdocTypesInTypeAnnotations.errors.txt delete mode 100644 tests/baselines/reference/jsweird.symbols delete mode 100644 tests/baselines/reference/jsweird.types delete mode 100644 tests/cases/conformance/jsdoc/jsdocTypesInTypeAnnotations.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7b1fa6203a6..5d3300ba19b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6866,6 +6866,10 @@ namespace ts { } } + function isJSDocTypeReference(node: TypeReferenceType): node is TypeReferenceNode { + return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference; + } + function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { if (isIdentifier(node.typeName)) { switch (node.typeName.text) { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 086c121b173..20c9559a8f4 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2199,7 +2199,11 @@ namespace ts { } function isStartOfParameter(): boolean { - return token() === SyntaxKind.DotDotDotToken || isIdentifierOrPattern() || isModifierKind(token()) || token() === SyntaxKind.AtToken || token() === SyntaxKind.ThisKeyword || token() === SyntaxKind.NewKeyword; + return token() === SyntaxKind.DotDotDotToken || + isIdentifierOrPattern() || + isModifierKind(token()) || + token() === SyntaxKind.AtToken || token() === SyntaxKind.ThisKeyword || token() === SyntaxKind.NewKeyword || + token() === SyntaxKind.StringLiteral || token() === SyntaxKind.NumericLiteral; } function parseParameter(): ParameterDeclaration { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5ae1d835e46..591baaab706 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -3302,10 +3302,6 @@ namespace ts { return false; } - export function isJSDocTypeReference(node: TypeReferenceType): node is TypeReferenceNode { - return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference; - } - /** * Formats an enum value as a string for debugging and debug assertions. */ diff --git a/tests/baselines/reference/jsdocFunctionType.symbols b/tests/baselines/reference/jsdocFunctionType.symbols index 18592bf2cdc..2c13315feb4 100644 --- a/tests/baselines/reference/jsdocFunctionType.symbols +++ b/tests/baselines/reference/jsdocFunctionType.symbols @@ -61,3 +61,9 @@ z.length; >z : Symbol(z, Decl(functions.js, 26, 3)) >length : Symbol(length, Decl(functions.js, 12, 27)) +/** @type {function ("a" | "b"): 1 | 2} */ +var f = function (s) { return s === "a" ? 1 : 2; } +>f : Symbol(f, Decl(functions.js, 30, 3)) +>s : Symbol(s, Decl(functions.js, 30, 18)) +>s : Symbol(s, Decl(functions.js, 30, 18)) + diff --git a/tests/baselines/reference/jsdocFunctionType.types b/tests/baselines/reference/jsdocFunctionType.types index 65f3f929a5c..c954cbfed7c 100644 --- a/tests/baselines/reference/jsdocFunctionType.types +++ b/tests/baselines/reference/jsdocFunctionType.types @@ -68,3 +68,15 @@ z.length; >z : { length: number; } >length : number +/** @type {function ("a" | "b"): 1 | 2} */ +var f = function (s) { return s === "a" ? 1 : 2; } +>f : (arg0: "a" | "b") => 1 | 2 +>function (s) { return s === "a" ? 1 : 2; } : (s: "a" | "b") => 1 | 2 +>s : "a" | "b" +>s === "a" ? 1 : 2 : 1 | 2 +>s === "a" : boolean +>s : "a" | "b" +>"a" : "a" +>1 : 1 +>2 : 2 + diff --git a/tests/baselines/reference/jsdocTypesInTypeAnnotations.errors.txt b/tests/baselines/reference/jsdocTypesInTypeAnnotations.errors.txt deleted file mode 100644 index 72f74609078..00000000000 --- a/tests/baselines/reference/jsdocTypesInTypeAnnotations.errors.txt +++ /dev/null @@ -1,29 +0,0 @@ -tests/cases/conformance/jsdoc/f.js(5,15): error TS2304: Cannot find name 'F'. -tests/cases/conformance/jsdoc/f.js(5,15): error TS8010: 'types' can only be used in a .ts file. -tests/cases/conformance/jsdoc/normal.ts(4,12): error TS7006: Parameter 'c' implicitly has an 'any' type. - - -==== tests/cases/conformance/jsdoc/node.d.ts (0 errors) ==== - declare function require(id: string): any; - declare var module: any, exports: any; - -==== tests/cases/conformance/jsdoc/f.js (2 errors) ==== - var F = function () { - this.x = 1; - }; - - function f(p: F) { p.x; } - ~ -!!! error TS2304: Cannot find name 'F'. - ~ -!!! error TS8010: 'types' can only be used in a .ts file. - -==== tests/cases/conformance/jsdoc/normal.ts (1 errors) ==== - class C { p: number } - - /** @param {C} p */ - function g(c) { return c.p } - ~ -!!! error TS7006: Parameter 'c' implicitly has an 'any' type. - - \ No newline at end of file diff --git a/tests/baselines/reference/jsweird.symbols b/tests/baselines/reference/jsweird.symbols deleted file mode 100644 index 8bed15c4468..00000000000 --- a/tests/baselines/reference/jsweird.symbols +++ /dev/null @@ -1,14 +0,0 @@ -=== tests/cases/conformance/jsdoc/crash.js === -/** - * @param {function(new:number, string)} c crashes with correct syntax too - * @return {number} - */ -function sub4(c) { ->sub4 : Symbol(sub4, Decl(crash.js, 0, 0)) ->c : Symbol(c, Decl(crash.js, 4, 14)) - - return new c('hi') ->c : Symbol(c, Decl(crash.js, 4, 14)) -} - - diff --git a/tests/baselines/reference/jsweird.types b/tests/baselines/reference/jsweird.types deleted file mode 100644 index f77bb369570..00000000000 --- a/tests/baselines/reference/jsweird.types +++ /dev/null @@ -1,16 +0,0 @@ -=== tests/cases/conformance/jsdoc/crash.js === -/** - * @param {function(new:number, string)} c crashes with correct syntax too - * @return {number} - */ -function sub4(c) { ->sub4 : (c: new (arg1: string) => number) => number ->c : new (arg1: string) => number - - return new c('hi') ->new c('hi') : number ->c : new (arg1: string) => number ->'hi' : "hi" -} - - diff --git a/tests/cases/conformance/jsdoc/jsdocFunctionType.ts b/tests/cases/conformance/jsdoc/jsdocFunctionType.ts index 0be247a9494..69a1ebcff87 100644 --- a/tests/cases/conformance/jsdoc/jsdocFunctionType.ts +++ b/tests/cases/conformance/jsdoc/jsdocFunctionType.ts @@ -33,3 +33,6 @@ class C { var y = id2(C); var z = new y(12); z.length; + +/** @type {function ("a" | "b"): 1 | 2} */ +var f = function (s) { return s === "a" ? 1 : 2; } diff --git a/tests/cases/conformance/jsdoc/jsdocTypesInTypeAnnotations.ts b/tests/cases/conformance/jsdoc/jsdocTypesInTypeAnnotations.ts deleted file mode 100644 index b2e7d122199..00000000000 --- a/tests/cases/conformance/jsdoc/jsdocTypesInTypeAnnotations.ts +++ /dev/null @@ -1,22 +0,0 @@ -// @allowJs: true -// @checkJs: true -// @noEmit: true -// @module: commonjs -// @filename: node.d.ts -// @noImplicitAny: true -declare function require(id: string): any; -declare var module: any, exports: any; - -// @filename: f.js -var F = function () { - this.x = 1; -}; - -function f(p: F) { p.x; } - -// @filename: normal.ts -class C { p: number } - -/** @param {C} p */ -function g(c) { return c.p } -