palantir / palantir-java-format

A modern, lambda-friendly, 120 character Java formatter.
Apache License 2.0
403 stars 43 forks source link

Non-deterministic indentation when 2nd, 4th, etc arguments of methods are long #1061

Open marquiswang opened 3 months ago

marquiswang commented 3 months ago

What happened?

Both of the following indentation levels are allowed, and depending on what the state of the code was before running the formatter, it is non-deterministic which one is output.

    Object object = foo(
            foo,
                    veryVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVeryyyyyyyyyyyyyVeryVeryLongVariableName,
            foo,
                    veryVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVeryyyyyyyyyyyyyVeryVeryLongVariableName);
    Object object = foo(
            foo,
            veryVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVeryyyyyyyyyyyyyVeryVeryLongVariableName,
            foo,
            veryVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVerVeryVeryyyyyyyyyyyyyVeryVeryLongVariableName);

What did you want to happen?

We should be deterministic/consistent about which indentation level is output by the formatter. I think the latter makes the most sense. In our case, we discovered this while using Map.of(), where the former indentation level does make some sense, but I don't think it makes sense to allow that just for Map.of().