diff --git a/src/printer.js b/src/printer.js index 9b4f7f7d0..ca1df1026 100644 --- a/src/printer.js +++ b/src/printer.js @@ -429,8 +429,6 @@ function genericPrintNoParens(path, options, print, args) { parts.push("async "); } - parts.push(printFunctionTypeParameters(path, options, print)); - if (canPrintParamsWithoutParens(n)) { parts.push(path.call(print, "params", 0)); } else { @@ -441,7 +439,9 @@ function genericPrintNoParens(path, options, print, args) { path, print, options, - args && (args.expandLastArg || args.expandFirstArg) + /* expandLast */ args && + (args.expandLastArg || args.expandFirstArg), + /* printTypeParams */ true ), printReturnType(path, print) ]) @@ -1966,8 +1966,13 @@ function genericPrintNoParens(path, options, print, args) { } parts.push( - printFunctionTypeParameters(path, options, print), - printFunctionParams(path, print, options) + printFunctionParams( + path, + print, + options, + /* expandArg */ false, + /* printTypeParams */ true + ) ); // The returnType is not wrapped in a TypeAnnotation, so the colon @@ -2459,8 +2464,13 @@ function genericPrintNoParens(path, options, print, args) { path.call(print, "key"), n.computed ? "]" : "", n.optional ? "?" : "", - printFunctionTypeParameters(path, options, print), - printFunctionParams(path, print, options) + printFunctionParams( + path, + print, + options, + /* expandArg */ false, + /* printTypeParams */ true + ) ); if (n.typeAnnotation) { @@ -2889,10 +2899,14 @@ function printFunctionTypeParameters(path, options, print) { return ""; } -function printFunctionParams(path, print, options, expandArg) { +function printFunctionParams(path, print, options, expandArg, printTypeParams) { const fun = path.getValue(); const paramsField = fun.parameters ? "parameters" : "params"; + const typeParams = printTypeParams + ? printFunctionTypeParameters(path, options, print) + : ""; + let printed = []; if (fun[paramsField]) { printed = path.map(print, paramsField); @@ -2915,6 +2929,7 @@ function printFunctionParams(path, print, options, expandArg) { if (printed.length === 0) { return concat([ + typeParams, "(", comments.printDanglingComments(path, options, /* sameIndent */ true), ")" @@ -2934,7 +2949,14 @@ function printFunctionParams(path, print, options, expandArg) { // }) ) => { // }) if (expandArg) { - return group(concat(["(", join(", ", printed.map(removeLines)), ")"])); + return group( + concat([ + removeLines(typeParams), + "(", + join(", ", printed.map(removeLines)), + ")" + ]) + ); } // Single object destructuring should hug @@ -2945,7 +2967,7 @@ function printFunctionParams(path, print, options, expandArg) { // c // }) {} if (shouldHugArguments(fun)) { - return concat(["(", join(", ", printed), ")"]); + return concat([typeParams, "(", join(", ", printed), ")"]); } const parent = path.getParentNode(); @@ -2993,6 +3015,7 @@ function printFunctionParams(path, print, options, expandArg) { !(lastParam && lastParam.type === "RestElement") && !fun.rest; return concat([ + typeParams, "(", indent(concat([softline, join(concat([",", line]), printed)])), ifBreak( diff --git a/tests/typescript_typeparams/__snapshots__/jsfmt.spec.js.snap b/tests/typescript_typeparams/__snapshots__/jsfmt.spec.js.snap new file mode 100644 index 000000000..19ab32067 --- /dev/null +++ b/tests/typescript_typeparams/__snapshots__/jsfmt.spec.js.snap @@ -0,0 +1,36 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`long-function-arg.ts 1`] = ` +export const forwardS = R.curry( + (prop: string, reducer: ReducerFunction, value: V, state: {[name: string]: T}) => + R.assoc(prop, reducer(value, state[prop]), state) +) + +export const forwardS = R.curry( + (prop: string, reducer: ReducerFunction, value: V, state: {[name: string]: T}) => + R.assoc(prop, reducer(value, state[prop]), state) +) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +export const forwardS = R.curry( + ( + prop: string, + reducer: ReducerFunction, + value: V, + state: { [name: string]: T } + ) => R.assoc(prop, reducer(value, state[prop]), state) +); + +export const forwardS = R.curry( + < + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV, + TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT + >( + prop: string, + reducer: ReducerFunction, + value: V, + state: { [name: string]: T } + ) => R.assoc(prop, reducer(value, state[prop]), state) +); + +`; diff --git a/tests/typescript_typeparams/jsfmt.spec.js b/tests/typescript_typeparams/jsfmt.spec.js new file mode 100644 index 000000000..bc085c48c --- /dev/null +++ b/tests/typescript_typeparams/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, { parser: "typescript" }); diff --git a/tests/typescript_typeparams/long-function-arg.ts b/tests/typescript_typeparams/long-function-arg.ts new file mode 100644 index 000000000..f5625fbf6 --- /dev/null +++ b/tests/typescript_typeparams/long-function-arg.ts @@ -0,0 +1,10 @@ +export const forwardS = R.curry( + (prop: string, reducer: ReducerFunction, value: V, state: {[name: string]: T}) => + R.assoc(prop, reducer(value, state[prop]), state) +) + +export const forwardS = R.curry( + (prop: string, reducer: ReducerFunction, value: V, state: {[name: string]: T}) => + R.assoc(prop, reducer(value, state[prop]), state) +) +