Hug object types in function parameters in Flow like in TS (#13396)
This commit is contained in:
1 parent
26ea4c42fd
commit
f5610b8510
7 files changed
+158
-25
No files matched your search
@@ -0,0 +1,21 @@
|
||||
#### An object type in a `declare function` signature now breaks before the return type (#13396 by @thorn0)
|
||||
|
||||
This behavior has been unified with how TypeScript is formatted.
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
```jsx
|
||||
// Input
|
||||
declare function bla (props: { a: boolean, b: string, c: number }): Promise<Array<foo>>
|
||||
|
||||
// Prettier stable
|
||||
declare function bla(props: { a: boolean, b: string, c: number }): Promise<
|
||||
Array<foo>
|
||||
>;
|
||||
|
||||
// Prettier main
|
||||
declare function bla(props: {
|
||||
a: boolean;
|
||||
b: string;
|
||||
c: number;
|
||||
}): Promise<Array<foo>>;
|
||||
```
|
||||
@@ -62,7 +62,7 @@ function printFunctionParameters(
|
||||
|
||||
const parent = path.getParentNode();
|
||||
const isParametersInTestCall = isTestCall(parent);
|
||||
const shouldHugParameters = shouldHugFunctionParameters(functionNode);
|
||||
const shouldHugParameters = shouldHugTheOnlyFunctionParameter(functionNode);
|
||||
const printed = [];
|
||||
iterateFunctionParametersPath(path, (parameterPath, index) => {
|
||||
const isLastParameter = index === parameters.length - 1;
|
||||
@@ -157,7 +157,7 @@ function printFunctionParameters(
|
||||
];
|
||||
}
|
||||
|
||||
function shouldHugFunctionParameters(node) {
|
||||
function shouldHugTheOnlyFunctionParameter(node) {
|
||||
if (!node) {
|
||||
return false;
|
||||
}
|
||||
@@ -176,7 +176,8 @@ function shouldHugFunctionParameters(node) {
|
||||
parameter.typeAnnotation.type === "TSTypeAnnotation") &&
|
||||
isObjectType(parameter.typeAnnotation.typeAnnotation)) ||
|
||||
(parameter.type === "FunctionTypeParam" &&
|
||||
isObjectType(parameter.typeAnnotation)) ||
|
||||
isObjectType(parameter.typeAnnotation) &&
|
||||
parameter !== node.rest) ||
|
||||
(parameter.type === "AssignmentPattern" &&
|
||||
(parameter.left.type === "ObjectPattern" ||
|
||||
parameter.left.type === "ArrayPattern") &&
|
||||
@@ -283,6 +284,6 @@ function isDecoratedFunction(path) {
|
||||
|
||||
export {
|
||||
printFunctionParameters,
|
||||
shouldHugFunctionParameters,
|
||||
shouldHugTheOnlyFunctionParameter,
|
||||
shouldGroupFunctionParameters,
|
||||
};
|
||||
@@ -19,12 +19,12 @@ import {
|
||||
getComments,
|
||||
CommentCheckFlags,
|
||||
isNextLineEmpty,
|
||||
isObjectType,
|
||||
} from "../utils/index.js";
|
||||
import { locStart, locEnd } from "../loc.js";
|
||||
|
||||
import { printOptionalToken, printTypeAnnotation } from "./misc.js";
|
||||
import { shouldHugFunctionParameters } from "./function-parameters.js";
|
||||
import { shouldHugType } from "./type-annotation.js";
|
||||
import { shouldHugTheOnlyFunctionParameter } from "./function-parameters.js";
|
||||
import { printHardlineAfterHeritage } from "./class.js";
|
||||
|
||||
/** @typedef {import("../../document/builders.js").Doc} Doc */
|
||||
@@ -201,26 +201,21 @@ function printObject(path, options, print) {
|
||||
if (
|
||||
path.match(
|
||||
(node) => node.type === "ObjectPattern" && !node.decorators,
|
||||
(node, name, number) =>
|
||||
shouldHugFunctionParameters(node) &&
|
||||
(name === "params" ||
|
||||
name === "parameters" ||
|
||||
name === "this" ||
|
||||
name === "rest") &&
|
||||
number === 0
|
||||
) ||
|
||||
path.match(
|
||||
shouldHugType,
|
||||
(node, name) => name === "typeAnnotation",
|
||||
(node, name) => name === "typeAnnotation",
|
||||
(node, name, number) =>
|
||||
shouldHugFunctionParameters(node) &&
|
||||
(name === "params" ||
|
||||
name === "parameters" ||
|
||||
name === "this" ||
|
||||
name === "rest") &&
|
||||
number === 0
|
||||
shouldHugTheOnlyParameter
|
||||
) ||
|
||||
(isObjectType(node) &&
|
||||
(path.match(
|
||||
undefined,
|
||||
(node, name) => name === "typeAnnotation",
|
||||
(node, name) => name === "typeAnnotation",
|
||||
shouldHugTheOnlyParameter
|
||||
) ||
|
||||
path.match(
|
||||
undefined,
|
||||
(node, name) =>
|
||||
node.type === "FunctionTypeParam" && name === "typeAnnotation",
|
||||
shouldHugTheOnlyParameter
|
||||
))) ||
|
||||
// Assignment printing logic (printAssignment) is responsible
|
||||
// for adding a group if needed
|
||||
(!shouldBreak &&
|
||||
@@ -237,4 +232,14 @@ function printObject(path, options, print) {
|
||||
return group(content, { shouldBreak });
|
||||
}
|
||||
|
||||
function shouldHugTheOnlyParameter(node, name) {
|
||||
return (
|
||||
(name === "params" ||
|
||||
name === "parameters" ||
|
||||
name === "this" ||
|
||||
name === "rest") &&
|
||||
shouldHugTheOnlyFunctionParameter(node)
|
||||
);
|
||||
}
|
||||
|
||||
export { printObject };
|
||||
@@ -133,3 +133,45 @@ const X = (props: { a: boolean }) => <A />;
|
||||
|
||||
================================================================================
|
||||
`;
|
||||
|
||||
exports[`object-type-in-declare-function.js format 1`] = `
|
||||
====================================options=====================================
|
||||
parsers: ["flow", "babel"]
|
||||
printWidth: 80
|
||||
| printWidth
|
||||
=====================================input======================================
|
||||
declare function foo(this: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bazFlip({ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...{ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...x: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
=====================================output=====================================
|
||||
declare function foo(this: {
|
||||
a: boolean,
|
||||
b: string,
|
||||
c: number,
|
||||
}): Promise<Array<foo>>;
|
||||
|
||||
declare function bazFlip({
|
||||
a: boolean,
|
||||
b: string,
|
||||
c: number,
|
||||
}): Promise<Array<foo>>;
|
||||
|
||||
declare function bar(
|
||||
...{ a: boolean, b: string, c: number }
|
||||
): Promise<Array<foo>>;
|
||||
|
||||
declare function bar(
|
||||
...x: { a: boolean, b: string, c: number }
|
||||
): Promise<Array<foo>>;
|
||||
|
||||
================================================================================
|
||||
`;
|
||||
@@ -0,0 +1,11 @@
|
||||
declare function foo(this: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bazFlip({ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...{ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...x: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
@@ -215,3 +215,45 @@ class C {
|
||||
|
||||
================================================================================
|
||||
`;
|
||||
|
||||
exports[`object-type-in-declare-function.ts format 1`] = `
|
||||
====================================options=====================================
|
||||
parsers: ["typescript"]
|
||||
printWidth: 80
|
||||
| printWidth
|
||||
=====================================input======================================
|
||||
declare function foo(this: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bazFlip({ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...{ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...x: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
=====================================output=====================================
|
||||
declare function foo(this: {
|
||||
a: boolean;
|
||||
b: string;
|
||||
c: number;
|
||||
}): Promise<Array<foo>>;
|
||||
|
||||
declare function bazFlip({
|
||||
a: boolean,
|
||||
b: string,
|
||||
c: number,
|
||||
}): Promise<Array<foo>>;
|
||||
|
||||
declare function bar(
|
||||
...{ a: boolean, b: string, c: number }
|
||||
): Promise<Array<foo>>;
|
||||
|
||||
declare function bar(
|
||||
...x: { a: boolean; b: string; c: number }
|
||||
): Promise<Array<foo>>;
|
||||
|
||||
================================================================================
|
||||
`;
|
||||
@@ -0,0 +1,11 @@
|
||||
declare function foo(this: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bazFlip({ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...{ a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
|
||||
declare function bar(...x: { a: boolean, b: string, c: number }):
|
||||
Promise<Array<foo>>
|
||||
Reference in new issue
Block a user