prettier-java

Prettier Java Plugin

APACHE-2.0 License

Downloads
1.3M
Stars
1K
Committers
33

Bot releases are visible (Hide)

prettier-java - 2.6.0 Latest Release

Published by clementdessoude 8 months ago

Enhancements

Fixes

  • Consistent break after equals (Issue #638 fixed by #641 by @jtkiesel)
  • Properly break and indent lambda with comments (Issue #581 fixed by #604 by @jtkiesel)
  • Do not fail on constructor and method receiver parameter (Issue #607 fixed by #642 by @jtkiesel)
  • No break in single-block switch case (Issue #635 fixed by #636 by @jtkiesel)
  • Non-block if/else statements are now kept on their own lines (Issue #631 fixed by #633 by @jtkiesel)

Misc

prettier-java - v2.5.0

Published by clementdessoude 11 months ago

Latest v2.5.0

Enhancements

Fixes

  • No longer ignore whole block when prettier-ignore at start (#603 by @jtkiesel)

Miscellaneous

prettier-java - v2.4.0

Published by clementdessoude 11 months ago

Latest v2.4.0

Enhancements

  • Supports Java 21 record pattern (#611 by @jtkiesel)
  • Supports Java 21 preview feature: unnamed class compilation unit (JEP 445) (#615)
prettier-java - v2.3.1

Published by clementdessoude about 1 year ago

Fixes

  • Correct indentation of assignment operations (#602 by @jtkiesel)
prettier-java - v2.3.0

Published by clementdessoude about 1 year ago

Latest v2.3.0

Enhancements

  • Break long lines on type arguments (#584)
  • Break and indent binary expression with cast properly (#587)
  • Adjust indentation of multiline string (Issue #593 fixed with #596)
  • Improves binary expression formatting (#594)
  • Supports JLS annotation style (#586

Thanks to @jtkiesel for all of these contributions !

Fixes

  • Fix browser compatibility issue when run in browser (Issue #597 fixed with #598)
    Thanks to @magic-akari for the contribution
prettier-java - v2.2.0

Published by clementdessoude over 1 year ago

Enhancements

  • Upgrade prettier version to Prettier v3
prettier-java - v2.1.0

Published by clementdessoude over 1 year ago

Latest v2.1.0

Enhancements

  • Support for require-pragma option (Issue #573 closed with #574)
    Thanks to @yannick-paz for the contribution !
// Input
/**
 * @prettier
 */
public class Example { private int test=-1;}

// Output with require-pragma option activated
/**
 * @prettier
 */
public class Example {
  private int test = -1;
}

// Input
public class Example { private int test=-1;}

// Output with require-pragma option activated
public class Example { private int test=-1;}

Fixes

  • Break long assignments after equals (Issue #527 closed with #564)
    Thanks to @jtkiesel for the fix !
// Input
class Example {

  void example() {
    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes = new Object()
      .someMethod();

    Object[] aParticularlyLongAndObnoxiousNameForIllustrativePurposes2 = new Object[] {
      new Object(),
      new Object()
    };

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes3 = SomeClass.someStaticMethod();

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes = someMethod()
      .anotherMethod();

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes = anotherValue !=
      null
      ? anotherValue
      : new Object();
  }
}

// Output
class Example {

  void example() {
    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes =
      new Object().someMethod();

    Object[] aParticularlyLongAndObnoxiousNameForIllustrativePurposes2 =
      new Object[] { new Object(), new Object() };

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes3 =
      SomeClass.someStaticMethod();

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes =
      someMethod().anotherMethod();

    Object aParticularlyLongAndObnoxiousNameForIllustrativePurposes =
      anotherValue != null ? anotherValue : new Object();
  }
}
prettier-java - v2.0.0

Published by clementdessoude almost 2 years ago

Breaking changes

  • Drop support of Node.js 12

Enhancements

  • Support pattern matching guards (Issue #535 closed with #559)
// Input
class T {

    void test(Buyer other) {
        return switch (other) {
            case null -> true;
            case Buyer b && this.bestPrice > b.bestPrice -> true;
            case Buyer b && this.bestPrice > b.bestPrice -> {
                return true;
            }
            case (Buyer b && this.bestPrice > b.bestPrice) -> true;
            case Buyer b && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice -> true;
            case Buyer b && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice -> {
                return true;
            }
            case (Buyer b && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice) -> true;
            case (Buyer b && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice && this.bestPrice > b.bestPrice) -> {
                return true;
            }
            default -> false;
        };
    }
}

// Output
class T {
  void test(Buyer other) {
    return switch (other) {
      case null -> true;
      case Buyer b && this.bestPrice > b.bestPrice -> true;
      case Buyer b && this.bestPrice > b.bestPrice -> {
        return true;
      }
      case (Buyer b && this.bestPrice > b.bestPrice) -> true;
      case Buyer b &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice -> true;
      case Buyer b &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice &&
        this.bestPrice > b.bestPrice -> {
        return true;
      }
      case (
          Buyer b &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice
        ) -> true;
      case (
          Buyer b &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice &&
          this.bestPrice > b.bestPrice
        ) -> {
        return true;
      }
      default -> false;
    };
  }
}

Fixes

  • Fix parsing of escaped spaces in strings (Issue #541 closed with #543)
public class Test {

  public static final String REGEX = "^\s$";

}
  • Fix unwanted space in "exports"-statement in module-info.java (Issue #550 closed with #551)
    Thanks to @BjornJaspers for the fix
// Input
open module org.myorg.module {
  requires some.required.module;

  exports org.myorg.module.exportpackage1;
  exports org.myorg.module.exportpackage2;
}
// Prettier 1.6.2
open module org.myorg.module {
  requires some.required.module;

  exports org.myorg.module.exportpackage1 ;
  exports org.myorg.module.exportpackage2 ;
}
// Prettier 1.6.3
open module org.myorg.module {
  requires some.required.module;

  exports org.myorg.module.exportpackage1;
  exports org.myorg.module.exportpackage2;
}

Misc

  • doc: add VSCode Java import order configuration (#546)
    Thanks to @derkoe for the contribution
prettier-java - v1.6.2

Published by clementdessoude over 2 years ago

Latest v1.6.2

Fixes

  • Fix parsing of nested sealed and non-sealed classes & interfaces inside interfaces (Issue #533 closed with #538)

public interface Test {
    sealed interface Inner {}

    public static sealed abstract class SealedParent {}

    non-sealed interface Inner {}

    public static non-sealed abstract class SealedParent {}

    final static class SealedChild extends SealedParent {}
}

  • Fix incorrect reformating of type bounds in a generic extends clause (Issue #536 closed with #537)
// Input
public class Foo<T> {

  public <U extends @NotNull T> void example(U u) {}

  public <U extends com.java.Any.@NotNull T> void example(U u) {}
}

// Prettier 1.6.1
public class Foo<T> {

  public <U extends @NotNullT> void example(U u) {}

  public <U extends com.java.Any.@NotNullT> void example(U u) {}
}

// Prettier 1.6.2
public class Foo<T> {

  public <U extends @NotNull T> void example(U u) {}

  public <U extends com.java.Any.@NotNull T> void example(U u) {}
}
prettier-java - v1.6.1

Published by clementdessoude almost 3 years ago

Latest v1.6.1

Fixes

  • Fix parsing of nested sealed and non-sealed classes (Issue #522 closed with #523)

// Input
public class SealedClasses {
  public static sealed abstract class SealedParent permits SealedChild {}

  final static class SealedChild extends SealedParent {}
}

// Output
public class NestedSealedClasses {

  public abstract static sealed class SealedParent permits SealedChild {}

  static final class SealedChild extends SealedParent {}
}

prettier-java - v1.6.0

Published by clementdessoude almost 3 years ago

Latest v1.6.0

Enhancements

  • Improve formatting of records parameters with annotations
// Input
public record Record(
    @JsonSerialize(using = StatusSerializer.class, nullsUsing = NullSerializer.class)
    @Schema(type = "integer", description = "Some fancy description")
    Status status,

    @NotNull
    Integer number
) {}

public record Record(
    @JsonSerialize(using = StatusSerializer.class, nullsUsing = NullSerializer.class)
    @Schema(type = "integer", description = "Some fancy description")
    // comment
    Status status,


    // another comment
    @NotNull
    Integer number
) {}

// Prettier v1.5.0
public record Record(
  @JsonSerialize(
    using = StatusSerializer.class,
    nullsUsing = NullSerializer.class
  ) @Schema(
    type = "integer",
    description = "Some fancy description"
  ) Status status,
  @NotNull Integer number
) {}

public record Record(
  @JsonSerialize(
    using = StatusSerializer.class,
    nullsUsing = NullSerializer.class
  ) @Schema(type = "integer", description = "Some fancy description") // comment
  Status status,
  // another comment
  @NotNull Integer number
) {}

// Prettier v1.6.0
public record Record(
  @JsonSerialize(
    using = StatusSerializer.class,
    nullsUsing = NullSerializer.class
  )
  @Schema(type = "integer", description = "Some fancy description")
  Status status,

  @NotNull Integer number
) {}

public record Record(
  @JsonSerialize(
    using = StatusSerializer.class,
    nullsUsing = NullSerializer.class
  )
  @Schema(type = "integer", description = "Some fancy description")
  // comment
  Status status,

  // another comment
  @NotNull Integer number
) {}

Fixes

  • Fix casting with additional bounds

// Input
class Example {
  void should_cast_with_single_element() {
    var myElem = (int) othrElement;
    var myElem = (A) othrElement;
    var myElem = (A) (othrElement, value) -> othrElement + value;
    var myElem = (Aaeaozeaonzeoazneaozenazonelkadndpndpazdpazdpazdpazdpazeazpeaazdpazdpazpdazdpa) othrElement;
  }

  void should_cast_with_additional_bounds() {
    foo((A & B) obj);
    foo((A & B & C) obj);
    foo((Aaeaozeaonzeoazneaozenazone & Bazoieoainzeonaozenoazne & Cjneazeanezoanezoanzeoaneonazeono) obj);
    foo((Aaeaozeaonzeoazneaozenazone & Bazoieoainzeonaozenoazne & Cjneazeanezoanezoanzeoaneonazeono) (othrElement, value) -> othrElement + value);
  }
}

// Prettier v1.5.0
class Example {

  void should_cast_with_single_element() {
    var myElem = (int) othrElement;
    var myElem = (A) othrElement;
    var myElem = (A) (othrElement, value) -> othrElement + value;
    var myElem = (Aaeaozeaonzeoazneaozenazonelkadndpndpazdpazdpazdpazdpazeazpeaazdpazdpazpdazdpa) othrElement;
  }

  void should_cast_with_additional_bounds() {
    foo((A) & B obj);
    foo((A) & B& C obj);
    foo(
      (Aaeaozeaonzeoazneaozenazone) & Bazoieoainzeonaozenoazne& Cjneazeanezoanezoanzeoaneonazeono obj
    );
    foo(
      (Aaeaozeaonzeoazneaozenazone) & Bazoieoainzeonaozenoazne& Cjneazeanezoanezoanzeoaneonazeono (
          othrElement,
          value
        ) ->
        othrElement + value
    );
  }
}

// Prettier v1.6.0
class Example {

  void should_cast_with_single_element() {
    var myElem = (int) othrElement;
    var myElem = (A) othrElement;
    var myElem = (A) (othrElement, value) -> othrElement + value;
    var myElem = (Aaeaozeaonzeoazneaozenazonelkadndpndpazdpazdpazdpazdpazeazpeaazdpazdpazpdazdpa) othrElement;
  }

  void should_cast_with_additional_bounds() {
    foo((A & B) obj);
    foo((A & B & C) obj);
    foo(
      (
        Aaeaozeaonzeoazneaozenazone
        & Bazoieoainzeonaozenoazne
        & Cjneazeanezoanezoanzeoaneonazeono
      ) obj
    );
    foo(
      (
        Aaeaozeaonzeoazneaozenazone
        & Bazoieoainzeonaozenoazne
        & Cjneazeanezoanezoanzeoaneonazeono
      ) (othrElement, value) -> othrElement + value
    );
  }
}

prettier-java - v1.5.0

Published by clementdessoude about 3 years ago

Latest v1.5.0

Enhancements

  • Split record parameters on several lines if thez do not fit on a single line (#509)

    
    // Input
    public record Person(
        String firstName, String lastName, String email,
        String phoneNumber,
        String streetAddress,
        String city,
        String state,
        String zipCode
    ) {}
    
    // Prettier 1.4.0
    public record Person(
      String firstName, String lastName, String email, String phoneNumber, String streetAddress, String city, String state, String zipCode
    ) {}
    
    // Prettier 1.5.0
    public record Person(
      String firstName,
      String lastName,
      String email,
      String phoneNumber,
      String streetAddress,
      String city,
      String state,
      String zipCode
    ) {}
    
  • Support pattern matching in switch statements preview feature (#511)

    // Input
    class T {
      static String formatterPatternSwitch(Object o) {
        return switch (o) {
          case
    
            Integer i ->
    
    
            String.format("int %d", i);
          case Long l    -> String.format("long %d", l);
          case Double d  -> String.format("double %f", d);
          case String s  -> String.format("String %s", s);
          case TOTO  -> String.format("TOTO %s", o);
          case null -> String.format("Null !");
          case default -> String.format("Default !");
          default        -> o.toString();
        };
      }
    }
    
    // Output
    class T {
      static String formatterPatternSwitch(Object o) {
        return switch (o) {
          case Integer i -> String.format("int %d", i);
          case Long l -> String.format("long %d", l);
          case Double d -> String.format("double %f", d);
          case String s -> String.format("String %s", s);
          case TOTO -> String.format("TOTO %s", o);
          case null -> String.format("Null !");
          case default -> String.format("Default !");
          default -> o.toString();
        };
      }
    }
    
  • Improve printing of class with long typeParameterList (#512)

    // Input
    public class ComplexGenericClass<BEAN extends AbstractBean & BeanItemSelect<BEANTYPE>, BEANTYPE, CONFIG extends BeanConfig<BEAN, BEANTYPE, CONFIG>> {}
    
    // Prettier 1.4.0
    public class ComplexGenericClass<BEAN extends AbstractBean & BeanItemSelect<BEANTYPE>, BEANTYPE, CONFIG extends BeanConfig<BEAN, BEANTYPE, CONFIG>> {}
    
    // Prettier 1.5.0
    public class ComplexGenericClass<
      BEAN extends AbstractBean & BeanItemSelect<BEANTYPE>,
      BEANTYPE,
      CONFIG extends BeanConfig<BEAN, BEANTYPE, CONFIG>
    > {}
    

Full Changelog: https://github.com/jhipster/prettier-java/compare/[email protected]

prettier-java -

Published by clementdessoude about 3 years ago

Enhancements

  • Improve method invocation with lambda parameters (#497)

Fixes

  • Fix parsing of static imports of yield methods (#499)
  • Improve java-parser types signatures (#496)
prettier-java -

Published by clementdessoude about 3 years ago

Fixes

  • Fix interface member detection to support inner records
    (From @rnorth: #492)
  • Remove yarn-error.log file from releases
prettier-java - v1.3.0

Published by clementdessoude over 3 years ago

Enhancements

  • Add a space after generic constructor type parameters (#485)
// Input
public <T> GenericConstructor(T genericParameter) {}

// Prettier 1.2.0
public <T>GenericConstructor(T genericParameter) {}

// Prettier 1.2.1
public <T> GenericConstructor(T genericParameter) {}
prettier-java -

Published by clementdessoude over 3 years ago

Enhancements

  • Supports of instance of pattern matching (#476)
// Input
if (o instanceof Integer i || p instanceof Point || q instanceof Circle c || r instanceof Square) {
  formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
  formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
  formatted = String.format("double %f", d);
} else if (o instanceof String s) {
  formatted = String.format("String %s", s);
}

// Output
if (
  o instanceof Integer i ||
  p instanceof Point ||
  q instanceof Circle c ||
  r instanceof Square
) {
  formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
  formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
  formatted = String.format("double %f", d);
} else if (o instanceof String s) {
  formatted = String.format("String %s", s);
}
  • Supports of sealed classes and interfaces (#478)
// Input
public sealed class Rectangle
  implements Shape
  permits Square {

  private final double length;
  private final double height;

  public Rectangle(double length, double height) {
    this.length = length;
    this.height = height;
  }

  @Override
  public double area() {
    return length * height;
  }
}

// Output
public sealed class Rectangle implements Shape permits Square {

  private final double length;
  private final double height;

  public Rectangle(double length, double height) {
    this.length = length;
    this.height = height;
  }

  @Override
  public double area() {
    return length * height;
  }
}

Miscallenous

prettier-java - v1.1.1

Published by pascalgrimaud over 3 years ago

Fixes

  • Fix parsing records inside class declarations
    and records with simplified constructors
    (#470)

Miscallenous

  • Update links to Chevrotain library (From @Austin-Scott: #472)
prettier-java - v1.1.0

Published by pascalgrimaud over 3 years ago

Enhancements

  • Supports of Records (#460)
// Input
public record Pet(
    @NotNull String name, int age, String... others, Object @Nullable... errorMessageArgs
  ) {
  public Pet {
    if (age < 0) {
      throw new IllegalArgumentException("Age cannot be negative");
    }

    if (name == null || name.isBlank()) {
      throw new IllegalArgumentException("Name cannot be blank");
    }
  }

  public void test() {}
}

// Output
public record Pet(
  @NotNull String name, int age, String... others, Object @Nullable... errorMessageArgs
) {
  public Pet {
    if (age < 0) {
      throw new IllegalArgumentException("Age cannot be negative");
    }

    if (name == null || name.isBlank()) {
      throw new IllegalArgumentException("Name cannot be blank");
    }
  }

  public void test() {}
}

prettier-java - v1.0.2

Published by clementdessoude over 3 years ago

v1.0.2

Fixes

  • Keep space between annotation and type identifiers in unannClassType expressions (#455)
// Input
class T {
  SomeClass.@Valid SomeInnerClass someInnerClass = someClass.getInteractions().get(0);

  void process(
    Map.@NonNull Entry<String, SkeletonConfiguration> entry,
    @NonNull Map<String, Object> context
  ) {}
}

// Prettier 1.0.1
class T {
  SomeClass.@ValidSomeInnerClass someInnerClass = someClass
    .getInteractions()
    .get(0);

  void process(
    Map.@NonNullEntry<String, SkeletonConfiguration> entry,
    @NonNull Map<String, Object> context
  ) {}
}

// Prettier 1.0.2
class T {

  SomeClass.@Valid SomeInnerClass someInnerClass = someClass
    .getInteractions()
    .get(0);

  void process(
    Map.@NonNull Entry<String, SkeletonConfiguration> entry,
    @NonNull Map<String, Object> context
  ) {}
}
  • Fix inconsistent indentation between chained method on method and new object (#456)
// Input
class T {
  public void method() {
    new Foo(stuff, thing, "auaaaaaaaaa some very long stuff", "some more").bar(10);
    foo(stuff, thing, "some very longuuuuuuuuuuuuuu stuff", "some more").bar(10);
  }
}

// Prettier 1.0.1
class T {
  public void method() {
    new Foo(stuff, thing, "auaaaaaaaaa some very long stuff", "some more")
    .bar(10);
    foo(stuff, thing, "some very longuuuuuuuuuuuuuu stuff", "some more")
      .bar(10);
  }
}

// Prettier 1.0.2
class T {

  public void method() {
    new Foo(stuff, thing, "auaaaaaaaaa some very long stuff", "some more")
      .bar(10);
    foo(stuff, thing, "some very longuuuuuuuuuuuuuu stuff", "some more")
      .bar(10);
  }
}
  • Fix unstable formatting for method invocations with only comments (#457)
// Input
class T {
  public void method() {
    Arrays.asList(// a
                  // b
                  // c
                  // d
    );
  }
}

// Prettier 1.0.1
class T {
  public void method() {
    Arrays.asList(// b // a
    // c
    // d
    );
  }
}

// Prettier 1.0.2
class T {

  public void method() {
    Arrays.asList( // a
      // b
      // c
      // d
    );
  }
}

Miscellaneous

  • Update lodash dependency to 4.17.21 (#458)
prettier-java -

Published by clementdessoude almost 4 years ago

v1.0.1

Fixes

  • Correct spaces emplacement in multi-value switch expression case label (#440)
// Input

public class Test {

  public void test(TestEnum testEnum) {
    switch (testEnum) {
      case FOO -> System.out.println("Foo!");
      case BAR, BAZ -> System.out.println("Not Foo!");
    }
  }
}

// Prettier 1.0.0

public class Test {

  public void test(TestEnum testEnum) {
    switch (testEnum) {
      case FOO -> System.out.println("Foo!");
      case BAR ,BAZ -> System.out.println("Not Foo!");
    }
  }
}

// Prettier 1.0.1

public class Test {

  public void test(TestEnum testEnum) {
    switch (testEnum) {
      case FOO -> System.out.println("Foo!");
      case BAR, BAZ -> System.out.println("Not Foo!");
    }
  }
}

Miscellaneous

  • Update prettier dependency to 2.2.1
Package Rankings
Top 1.1% on Npmjs.org
Top 8.17% on Proxy.golang.org
Badges
Extracted from project README
npm-prettier-plugin-java npm-java-parser