Releases: jhipster/prettier-java
Releases Β· jhipster/prettier-java
v2.1.0
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
// 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();
}
}
v2.0.0
Breaking changes
- Drop support of Node.js 12
Enhancements
// 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
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
v1.6.2
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 {}
}
// 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) {}
}
v1.6.1
Latest v1.6.1
Fixes
// 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 {}
}
v1.6.0
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
);
}
}
v1.5.0
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]
v1.4.0
v1.3.1
v1.3.0
v1.2.0
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
- Add copy/pastable Checkstyle configuration compatible with Prettier (#477)