Option to format brace struct initializers one field per line
When doing struct initialization, dfmt will try to wrap fields to match the line length, like this:
void main()
{
MyStruct foo = {
long_field_name_a: 1, long_field_name_b: 2, long_field_name_c: 3, long_field_name_d: "hello world",
long_field_name_e: 123456, longfieldname_asdf: "longfield"
};
}
It'd be nice to have a config option to abandon wrapping and just put each field on a separate line. :
void main()
{
MyStruct foo = {
long_field_name_a: 1,
long_field_name_b: 2,
long_field_name_c: 3,
long_field_name_d: "hello world",
long_field_name_e: 123456,
longfieldname_asdf: "longfield"
};
}
It results in a cleaner look, especially when nesting struct initializers.
big +1
Here's a particularly egregious example:
VkInstanceCreateInfo createInfo = {
pApplicationInfo: &appInfo, enabledExtensionCount: cast(uint) extensions.length, ppEnabledExtensionNames: extensions
.map!toStringz.array.ptr, enabledLayerCount: cast(uint) desiredValidationLayers.length, ppEnabledLayerNames: desiredValidationLayers
.map!toStringz.array.ptr, pNext: cast(VkDebugUtilsMessengerCreateInfoEXT*)&debugInfo
};
I think other opinionated formatters (thinking of Prettier for JS and Black for Python) tend to format as a single line for very small declarations, but switch to one-field-per-line when they would be forced to wrap (or perhaps its a smarter heuristic that looks at a combination of line length and number of fields, I'm not sure).
This would really be nice for larger blocks. I would even suggest making it configurable to be staggered. Currently looking at:
Scene scene = {
camera: camera, lights: [Light(Vec!3(2, 2, -2), Vec!3(1, 1, 1))], indices: mesh.index.attr.getContent!3()
.dup, positions: (cast(Vec!3*) mesh.attributeSet.position.content.ptr)[0
.. mesh.attributeSet.position.elementCount].dup, normals: (
cast(Vec!3*) mesh.attributeSet.normal.content.ptr)[0 .. mesh.attributeSet.normal.elementCount].dup,
colors: (cast(Vec!4*) mesh.attributeSet.color[0].content.ptr)[0 .. mesh.attributeSet.color[0].elementCount]
.dup, backgroundColor: Vec!4(0, 0.8, 0, 1),
};
Before formatting this was:
Scene scene = {
camera: camera,
lights: [Light(Vec!3(2, 2, -2), Vec!3(1, 1, 1))],
indices: mesh.index.attr.getContent!3().dup,
positions: (cast(Vec!3*) mesh.attributeSet.position.content.ptr)[0
.. mesh.attributeSet.position.elementCount].dup,
normals: (cast(Vec!3*) mesh.attributeSet.normal.content.ptr)[0 .. mesh.attributeSet.normal.elementCount].dup,
colors: (cast(Vec!4*) mesh.attributeSet.color[0].content.ptr)[0 .. mesh.attributeSet.color[0].elementCount].dup,
backgroundColor: Vec!4(0, 0.8, 0, 1),
};
If done staggered, this would even looks a tidy as:
Scene scene = {
camera:
camera,
lights:
[Light(Vec!3(2, 2, -2), Vec!3(1, 1, 1))],
indices:
mesh.index.attr.getContent!3().dup,
positions:
(cast(Vec!3*) mesh.attributeSet.position.content.ptr)[0.. mesh.attributeSet.position.elementCount].dup,
normals:
(cast(Vec!3*) mesh.attributeSet.normal.content.ptr)[0 .. mesh.attributeSet.normal.elementCount].dup,
colors:
(cast(Vec!4*) mesh.attributeSet.color[0].content.ptr)[0 .. mesh.attributeSet.color[0].elementCount].dup,
backgroundColor:
Vec!4(0, 0.8, 0, 1),
};