From c219fdae08607e07ec875d2137fcba7c2d93792c Mon Sep 17 00:00:00 2001 From: Alexander T Date: Tue, 5 May 2020 20:29:17 +0300 Subject: [PATCH] fix(37703): forbid required parameter after optional (#38155) --- src/compiler/checker.ts | 5 ++--- .../checkJsdocOptionalParamOrder.errors.txt | 14 +++++++++++++ .../reference/checkJsdocOptionalParamOrder.js | 18 +++++++++++++++++ .../checkJsdocOptionalParamOrder.symbols | 13 ++++++++++++ .../checkJsdocOptionalParamOrder.types | 13 ++++++++++++ .../jsdocParseBackquotedParamName.errors.txt | 20 +++++++++++++++++++ .../jsdoc/checkJsdocOptionalParamOrder.ts | 11 ++++++++++ 7 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/checkJsdocOptionalParamOrder.errors.txt create mode 100644 tests/baselines/reference/checkJsdocOptionalParamOrder.js create mode 100644 tests/baselines/reference/checkJsdocOptionalParamOrder.symbols create mode 100644 tests/baselines/reference/checkJsdocOptionalParamOrder.types create mode 100644 tests/baselines/reference/jsdocParseBackquotedParamName.errors.txt create mode 100644 tests/cases/conformance/jsdoc/checkJsdocOptionalParamOrder.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c9287634789..7a70426aae8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37048,10 +37048,9 @@ namespace ts { return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_cannot_have_an_initializer); } } - else if (parameter.questionToken) { + else if (isOptionalParameter(parameter)) { seenOptionalParameter = true; - - if (parameter.initializer) { + if (parameter.questionToken && parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer); } } diff --git a/tests/baselines/reference/checkJsdocOptionalParamOrder.errors.txt b/tests/baselines/reference/checkJsdocOptionalParamOrder.errors.txt new file mode 100644 index 00000000000..82e6f5c5d15 --- /dev/null +++ b/tests/baselines/reference/checkJsdocOptionalParamOrder.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/jsdoc/0.js(7,20): error TS1016: A required parameter cannot follow an optional parameter. + + +==== tests/cases/conformance/jsdoc/0.js (1 errors) ==== + // @ts-check + /** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ + function foo(a, b, c) {} + ~ +!!! error TS1016: A required parameter cannot follow an optional parameter. + \ No newline at end of file diff --git a/tests/baselines/reference/checkJsdocOptionalParamOrder.js b/tests/baselines/reference/checkJsdocOptionalParamOrder.js new file mode 100644 index 00000000000..69b999fb2bd --- /dev/null +++ b/tests/baselines/reference/checkJsdocOptionalParamOrder.js @@ -0,0 +1,18 @@ +//// [0.js] +// @ts-check +/** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ +function foo(a, b, c) {} + + +//// [0.js] +// @ts-check +/** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ +function foo(a, b, c) { } diff --git a/tests/baselines/reference/checkJsdocOptionalParamOrder.symbols b/tests/baselines/reference/checkJsdocOptionalParamOrder.symbols new file mode 100644 index 00000000000..786f7a1bcf5 --- /dev/null +++ b/tests/baselines/reference/checkJsdocOptionalParamOrder.symbols @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/0.js === +// @ts-check +/** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ +function foo(a, b, c) {} +>foo : Symbol(foo, Decl(0.js, 0, 0)) +>a : Symbol(a, Decl(0.js, 6, 13)) +>b : Symbol(b, Decl(0.js, 6, 15)) +>c : Symbol(c, Decl(0.js, 6, 18)) + diff --git a/tests/baselines/reference/checkJsdocOptionalParamOrder.types b/tests/baselines/reference/checkJsdocOptionalParamOrder.types new file mode 100644 index 00000000000..1636462c8a9 --- /dev/null +++ b/tests/baselines/reference/checkJsdocOptionalParamOrder.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/0.js === +// @ts-check +/** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ +function foo(a, b, c) {} +>foo : (a: number, b?: number, c: number) => void +>a : number +>b : number +>c : number + diff --git a/tests/baselines/reference/jsdocParseBackquotedParamName.errors.txt b/tests/baselines/reference/jsdocParseBackquotedParamName.errors.txt new file mode 100644 index 00000000000..60ba155b1f9 --- /dev/null +++ b/tests/baselines/reference/jsdocParseBackquotedParamName.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/jsdoc/a.js(5,18): error TS1016: A required parameter cannot follow an optional parameter. + + +==== tests/cases/conformance/jsdoc/a.js (1 errors) ==== + /** + * @param {string=} `args` + * @param `bwarg` {?number?} + */ + function f(args, bwarg) { + ~~~~~ +!!! error TS1016: A required parameter cannot follow an optional parameter. + } + +==== tests/cases/conformance/jsdoc/ts.ts (0 errors) ==== + /** + * @param `arg` - this is fine + */ + function g(arg: string) { + } + \ No newline at end of file diff --git a/tests/cases/conformance/jsdoc/checkJsdocOptionalParamOrder.ts b/tests/cases/conformance/jsdoc/checkJsdocOptionalParamOrder.ts new file mode 100644 index 00000000000..c498720c133 --- /dev/null +++ b/tests/cases/conformance/jsdoc/checkJsdocOptionalParamOrder.ts @@ -0,0 +1,11 @@ +// @allowJS: true +// @suppressOutputPathCheck: true + +// @filename: 0.js +// @ts-check +/** + * @param {number} a + * @param {number} [b] + * @param {number} c + */ +function foo(a, b, c) {}