Hug on single object destructuring function (#1022)

This is very common for stateful react functional components. It also matches last object expansion. I think that we should only do that for a single argument in function definitions though, unlike the last for function calls.

Fixes #1019
This commit is contained in:
Christopher Chedeau authored and GitHub committed 2017-03-22 09:58:33 -07:00
1 parent d8a64dec6c
commit 04eba07aab
4 files changed
+204 -1

No files matched your search

+17 -1
View File
@@ -2189,9 +2189,25 @@ function printFunctionParams(path, print, options) {
return concat(["(", join(", ", printed), ")"]);
}
// Single object destructuring should hug
//
// function({
// a,
// b,
// c
// }) {}
if (fun.params.length === 1 &&
!fun.params[0].comments &&
(fun.params[0].type === "ObjectPattern" ||
fun.params[0].type === "FunctionTypeParam" &&
fun.params[0].typeAnnotation.type === "ObjectTypeAnnotation") &&
!fun.rest) {
return concat(["(", join(", ", printed), ")"]);
}
const isFlowShorthandWithOneArg = (isObjectTypePropertyAFunction(parent) ||
isTypeAnnotationAFunction(parent) || parent.type === "TypeAlias") &&
fun[paramsField].length === 1 && fun[paramsField][0].name === null && fun.rest === null;
fun[paramsField].length === 1 && fun[paramsField][0].name === null && !fun.rest;
return concat([
isFlowShorthandWithOneArg ? "" : "(",
@@ -0,0 +1,126 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`test.js 1`] = `
"function StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}) {
return <div />
}
const StatelessFunctionalComponent = ({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}: {
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number,
}) => {
return <div />
};
class C {
StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}) {
return <div />
}
}
type T = ({
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number,
}) => void;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items
}) {
return <div />;
}
const StatelessFunctionalComponent = ({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items
}: {
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number
}) => {
return <div />;
};
class C {
StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items
}) {
return <div />;
}
}
type T = ({
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number
}) => void;
"
`;
@@ -0,0 +1 @@
run_spec(__dirname);
@@ -0,0 +1,60 @@
function StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}) {
return <div />
}
const StatelessFunctionalComponent = ({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}: {
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number,
}) => {
return <div />
};
class C {
StatelessFunctionalComponent({
isActive,
onFiltersUpdated,
onSelect,
onSubmitAndDeselect,
onCancel,
searchFilters,
title,
items,
}) {
return <div />
}
}
type T = ({
isActive: number,
onFiltersUpdated: number,
onSelect: number,
onSubmitAndDeselect: number,
onCancel: number,
searchFilters: number,
title: number,
items: number,
}) => void;