diffplug / spotless

Keep your code spotless
Apache License 2.0
4.46k stars 449 forks source link

Enforce `var` vs `FullTypeName` in java 11 #1532

Open nedtwigg opened 1 year ago

nedtwigg commented 1 year ago

The informal Spotless styleguide has been "any style that matters is enforced by spotlessApply". Now that we're compiling against Java 11 world, there's a big new degree of freedom, which is when to use var or not.

I'd like to adopt a style which is "you must always use var, unless the line has a comment".

// before spotlessApply
String example = "blah";

// after spotlessApply
var example = "blah";
// before spotlessApply
String example = "blah"; // keep type

// after spotlessApply
String example = "blah"; // keep type

I'd like it to be a discrete step, ala

spotless { java {
  gjf() // or whatever the user is currently using
  alwaysUseVarUnlessCommented()
} }

But if there's a way to configure an existing formatter, GJF, palantir-java-format, or eclipse, that would work too.

Suggestions and PRs welcome!

jbduncan commented 1 year ago

This sounds like a job for Refaster or OpenRewrite. If either of those could be integrated, then this issue should be easier to implement.

jbduncan commented 1 year ago

Alternatively, on seeing comment https://github.com/diffplug/spotless/issues/1379#issuecomment-1406192077, I wonder if Eclipse has a reusable method we could use. 🤔

nedtwigg commented 1 year ago

Awesome! That jdt.ls action should be easy to integrate once #1524 gets merged.

nedtwigg commented 1 year ago

Thanks to @blacelle, we can now use cleanthat to enforce var usage. You can see how that changes the code here.

My initial thought was that it was important to have an easy way to keep the var, I liked the idea that if the line or any line of the statement had a // or /* then the var would not happen automatically. Seemed like an intuitive thing that would be easy for end-users to understand, and it was easy to "self-document" with alwaysUseVarUnlessCommented().

After seeing @blacelle's PR, I'm wondering if it's maybe not necessary to have a way to opt-out, and maybe making a specific alwaysUseVar rule is unnecessary - users can get it as part of an Eclipse step or a CleanThat step. Thoughts?