diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 2e6a58c..8da6c23 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -7,6 +7,7 @@ configure { } dependencies { + implementation(libs.crankcase.checkstyle) implementation(libs.crankcase.java) implementation(libs.crankcase.javaLibrary) } diff --git a/build-logic/src/main/kotlin/org.enginehub.lin-bus.java-conventions.gradle.kts b/build-logic/src/main/kotlin/org.enginehub.lin-bus.java-conventions.gradle.kts index 4334028..112b22a 100644 --- a/build-logic/src/main/kotlin/org.enginehub.lin-bus.java-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/org.enginehub.lin-bus.java-conventions.gradle.kts @@ -1,8 +1,10 @@ +import org.gradle.api.plugins.quality.Checkstyle import org.gradle.api.tasks.SourceSetContainer import org.gradle.testing.jacoco.tasks.JacocoCoverageVerification plugins { id("org.enginehub.crankcase.java") + id("org.enginehub.crankcase.checkstyle") jacoco } @@ -11,6 +13,15 @@ crankcaseJava { disabledLints.add("module") } +crankcaseCheckstyle { + suppressionsFile = isolated.rootProject.projectDirectory.file("config/checkstyle/suppressions.xml") +} + +tasks.withType().configureEach { + // Checkstyle has no grammar for module declarations: checkstyle/checkstyle#8240 + exclude("**/module-info.java") +} + jacoco { toolVersion = "0.8.15" } diff --git a/common/src/test/java/org/enginehub/linbus/common/internal/AbstractIteratorTest.java b/common/src/test/java/org/enginehub/linbus/common/internal/AbstractIteratorTest.java index c4eda0a..de53661 100644 --- a/common/src/test/java/org/enginehub/linbus/common/internal/AbstractIteratorTest.java +++ b/common/src/test/java/org/enginehub/linbus/common/internal/AbstractIteratorTest.java @@ -123,18 +123,18 @@ private static final class CountToTen extends AbstractIterator { * Ensures that computeNext is only called until it returns end(). */ private boolean tripwire = false; - private int i = 0; + private int index = 0; @Override protected String computeNext() { - if (i >= 10) { + if (index >= 10) { if (tripwire) { throw new IllegalStateException("Should not have called this!"); } tripwire = true; return end(); } - i++; + index++; return "A simple test!"; } } diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000..f9d8044 --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/Elusion.java b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/Elusion.java index 9910c18..4738bf4 100644 --- a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/Elusion.java +++ b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/Elusion.java @@ -23,7 +23,7 @@ */ public final class Elusion { /** - * Is {@code c} a character than can be emitted without quotes? + * Checks if {@code c} is a character that can be emitted without quotes. * * @param c character to check * @return {@code true} if {@code c} is a safe character @@ -56,6 +56,7 @@ public static CharSequence escapeIfNeeded(String s) { case '\'' -> singleCharCount++; case '"' -> doubleCharCount++; case '\\' -> backslashCount++; + default -> { } } } if (totallySafe) { diff --git a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/LinSnbtWriter.java b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/LinSnbtWriter.java index ad9d76e..41cf36c 100644 --- a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/LinSnbtWriter.java +++ b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/LinSnbtWriter.java @@ -37,7 +37,7 @@ * Implementation of {@link LinStringIO#write(Appendable, LinStreamable)}. */ public class LinSnbtWriter { - private sealed interface WriteState { + private sealed interface WriteState permits WriteState.List, WriteState.Compound, WriteState.WritingArray { record List(int remainingValues) implements WriteState { } @@ -78,7 +78,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { break; } switch (token) { - case LinToken.Name(String name, Optional id) -> { + case LinToken.Name(String name, Optional _) -> { if (!(state instanceof WriteState.Compound)) { throw new NbtWriteException("Names can only appear inside compounds"); } @@ -90,7 +90,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { } output.append(Elusion.escapeIfNeeded(name)).append(':'); } - case LinToken.ByteArrayStart byteArrayStart -> output.append("[B;"); + case LinToken.ByteArrayStart _ -> output.append("[B;"); case LinToken.ByteArrayContent(ByteBuffer buffer) -> { if (state instanceof WriteState.WritingArray) { output.append(','); @@ -104,7 +104,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { } } } - case LinToken.ByteArrayEnd byteArrayEnd -> { + case LinToken.ByteArrayEnd _ -> { if (state instanceof WriteState.WritingArray) { stateStack.removeLast(); } @@ -117,12 +117,12 @@ public void write(Appendable output, LinStream tokens) throws IOException { handleValueEnd(output); } - case LinToken.CompoundStart compoundStart -> { + case LinToken.CompoundStart _ -> { output.append('{'); stateStack.addLast(WriteState.Compound.DEFAULT); } - case LinToken.CompoundEnd compoundEnd -> { + case LinToken.CompoundEnd _ -> { output.append('}'); stateStack.removeLast(); @@ -138,7 +138,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { handleValueEnd(output); } - case LinToken.IntArrayStart intArrayStart -> output.append("[I;"); + case LinToken.IntArrayStart _ -> output.append("[I;"); case LinToken.IntArrayContent(IntBuffer buffer) -> { if (state instanceof WriteState.WritingArray) { output.append(','); @@ -152,7 +152,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { } } } - case LinToken.IntArrayEnd intArrayEnd -> { + case LinToken.IntArrayEnd _ -> { if (state instanceof WriteState.WritingArray) { stateStack.removeLast(); } @@ -165,18 +165,18 @@ public void write(Appendable output, LinStream tokens) throws IOException { handleValueEnd(output); } - case LinToken.ListStart(OptionalInt size, Optional elementId) -> { + case LinToken.ListStart(OptionalInt size, Optional _) -> { output.append('['); stateStack.addLast(new WriteState.List(size.orElseThrow())); } - case LinToken.ListEnd listEnd -> { + case LinToken.ListEnd _ -> { output.append(']'); stateStack.removeLast(); handleValueEnd(output); } - case LinToken.LongArrayStart longArrayStart -> output.append("[L;"); + case LinToken.LongArrayStart _ -> output.append("[L;"); case LinToken.LongArrayContent(LongBuffer buffer) -> { if (state instanceof WriteState.WritingArray) { output.append(','); @@ -190,7 +190,7 @@ public void write(Appendable output, LinStream tokens) throws IOException { } } } - case LinToken.LongArrayEnd longArrayEnd -> { + case LinToken.LongArrayEnd _ -> { if (state instanceof WriteState.WritingArray) { stateStack.removeLast(); } @@ -229,7 +229,7 @@ private void handleValueEnd(Appendable output) throws IOException { output.append(','); } } - case WriteState.Compound compound -> stateStack.addLast(WriteState.Compound.HAS_PREVIOUS_ENTRY); + case WriteState.Compound _ -> stateStack.addLast(WriteState.Compound.HAS_PREVIOUS_ENTRY); default -> throw new NbtWriteException("Unexpected state: " + state); } } diff --git a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/LinSnbtReader.java b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/LinSnbtReader.java index 4605570..fec197d 100644 --- a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/LinSnbtReader.java +++ b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/LinSnbtReader.java @@ -42,7 +42,9 @@ */ public class LinSnbtReader implements LinStream { - private sealed interface State { + private sealed interface State permits + State.InCompound, State.CompoundEntryName, State.InList, State.InByteArray, State.InIntArray, + State.InLongArray, State.ReadValue { /** * We're inside a compound right now. * @@ -191,24 +193,24 @@ private NbtParseException unexpectedTokenSpecificError(SnbtToken token, String e private void fillTokenStack(State state) { switch (state) { case State.ReadValue readValue -> readValue(readValue); - case State.InCompound inCompound -> advanceCompound(); - case State.CompoundEntryName compoundEntryName -> readName(); - case State.InList inList -> advanceList(); - case State.InByteArray inByteArray -> advanceArray( + case State.InCompound _ -> advanceCompound(); + case State.CompoundEntryName _ -> readName(); + case State.InList _ -> advanceList(); + case State.InByteArray _ -> advanceArray( LinToken.Byte.class, ByteBuffer::allocate, (buffer, t) -> buffer.put(t.value()), buffer -> new LinToken.ByteArrayContent(buffer.flip().asReadOnlyBuffer()), LinToken.ByteArrayEnd::new ); - case State.InIntArray inIntArray -> advanceArray( + case State.InIntArray _ -> advanceArray( LinToken.Int.class, IntBuffer::allocate, (buffer, t) -> buffer.put(t.value()), buffer -> new LinToken.IntArrayContent(buffer.flip().asReadOnlyBuffer()), LinToken.IntArrayEnd::new ); - case State.InLongArray inLongArray -> advanceArray( + case State.InLongArray _ -> advanceArray( LinToken.Long.class, LongBuffer::allocate, (buffer, t) -> buffer.put(t.value()), @@ -234,7 +236,7 @@ private void readValue(State.ReadValue readValue) { } switch (token) { - case SnbtToken.ListLikeStart listLikeStart -> prepareListLike(); + case SnbtToken.ListLikeStart _ -> prepareListLike(); case SnbtToken.Text(boolean quoted, String content) -> { var linToken = quoted ? new LinToken.String(content) : getTokenFor(content); tokenQueue.addLast(linToken); @@ -247,15 +249,15 @@ private void advanceCompound() { var typing = read(); var token = typing.token(); switch (token) { - case SnbtToken.Text text -> { + case SnbtToken.Text _ -> { readAgainStack.addLast(typing); stateStack.addLast(State.CompoundEntryName.INSTANCE); } - case SnbtToken.CompoundEnd compoundEnd -> { + case SnbtToken.CompoundEnd _ -> { stateStack.removeLast(); tokenQueue.addLast(new LinToken.CompoundEnd()); } - case SnbtToken.Separator separator -> stateStack.addLast(State.CompoundEntryName.INSTANCE); + case SnbtToken.Separator _ -> stateStack.addLast(State.CompoundEntryName.INSTANCE); default -> throw unexpectedTokenError(token); } } @@ -278,11 +280,11 @@ private void readName() { private void advanceList() { var token = read().token(); switch (token) { - case SnbtToken.ListLikeEnd listLikeEnd -> { + case SnbtToken.ListLikeEnd _ -> { stateStack.removeLast(); tokenQueue.addLast(new LinToken.ListEnd()); } - case SnbtToken.Separator separator -> stateStack.addLast(State.ReadValue.ANY); + case SnbtToken.Separator _ -> stateStack.addLast(State.ReadValue.ANY); default -> throw unexpectedTokenError(token); } } @@ -361,21 +363,21 @@ private LinToken getTokenFor(String valueString) { case 'B', 'b' -> { try { yield new LinToken.Byte(Byte.parseByte(valueString.substring(0, valueString.length() - 1))); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { yield new LinToken.String(valueString); } } case 'L', 'l' -> { try { yield new LinToken.Long(Long.parseLong(valueString.substring(0, valueString.length() - 1))); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { yield new LinToken.String(valueString); } } case 'S', 's' -> { try { yield new LinToken.Short(Short.parseShort(valueString.substring(0, valueString.length() - 1))); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { yield new LinToken.String(valueString); } } @@ -384,14 +386,14 @@ private LinToken getTokenFor(String valueString) { case 'F', 'f' -> { try { yield new LinToken.Float(Float.parseFloat(valueString.substring(0, valueString.length() - 1))); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { yield new LinToken.String(valueString); } } case 'D', 'd' -> { try { yield new LinToken.Double(Double.parseDouble(valueString.substring(0, valueString.length() - 1))); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { yield new LinToken.String(valueString); } } @@ -399,13 +401,13 @@ private LinToken getTokenFor(String valueString) { // Might be an integer. try { yield new LinToken.Int(Integer.parseInt(valueString)); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { // Nope. } // Might be a double. try { yield new LinToken.Double(Double.parseDouble(valueString)); - } catch (NumberFormatException e) { + } catch (NumberFormatException _) { // Nope. } // Might be a boolean. diff --git a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/SnbtToken.java b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/SnbtToken.java index d80831f..262dcde 100644 --- a/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/SnbtToken.java +++ b/format-snbt/src/main/java/org/enginehub/linbus/format/snbt/impl/reader/SnbtToken.java @@ -23,7 +23,9 @@ /** * Not to be confused with {@link LinToken}. */ -public sealed interface SnbtToken { +public sealed interface SnbtToken permits + SnbtToken.CompoundStart, SnbtToken.CompoundEnd, SnbtToken.ListLikeStart, SnbtToken.ListLikeEnd, + SnbtToken.EntrySeparator, SnbtToken.ListTypeSeparator, SnbtToken.Separator, SnbtToken.Text { /** * '{'. */ @@ -55,7 +57,7 @@ public String toString() { } /** - * '[' + * '['. */ enum ListLikeStart implements SnbtToken { /** @@ -70,7 +72,7 @@ public String toString() { } /** - * ']' + * ']'. */ enum ListLikeEnd implements SnbtToken { /** @@ -85,7 +87,7 @@ public String toString() { } /** - * ':' + * ':'. */ enum EntrySeparator implements SnbtToken { /** @@ -100,7 +102,7 @@ public String toString() { } /** - * ';' + * ';'. */ enum ListTypeSeparator implements SnbtToken { /** @@ -115,7 +117,7 @@ public String toString() { } /** - * ',' + * ','. */ enum Separator implements SnbtToken { /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33493fd..3fee9a2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] javafx = "22.0.2" tinylog = "2.7.0" -crankcase = "0.1.0" +crankcase = "0.1.1" [plugins] crankcase-java = { id = "org.enginehub.crankcase.java", version.ref = "crankcase" } @@ -12,6 +12,7 @@ crankcase-release = { id = "org.enginehub.crankcase.release", version.ref = "cra osdetector = { id = "com.google.osdetector", version = "1.7.3" } [libraries] +crankcase-checkstyle = { module = "org.enginehub.crankcase:checkstyle", version.ref = "crankcase" } crankcase-java = { module = "org.enginehub.crankcase:java", version.ref = "crankcase" } crankcase-javaLibrary = { module = "org.enginehub.crankcase:java-library", version.ref = "crankcase" } diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/ArrayEditSetup.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/ArrayEditSetup.java index 8eaffaf..26e820b 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/ArrayEditSetup.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/ArrayEditSetup.java @@ -32,7 +32,7 @@ public class ArrayEditSetup { private static ListView createListView(BufferObservableList backingList) { ListView listView = new ListView<>(backingList); - listView.setCellFactory(lv -> new SpinnerListCell<>()); + listView.setCellFactory(_ -> new SpinnerListCell<>()); listView.setEditable(true); return listView; } @@ -56,7 +56,7 @@ public CompletableFuture showForUpdate() { dialog.show(); - return MoreFutures.create((resolve, reject) -> dialog.setOnHidden(event -> + return MoreFutures.create((resolve, _) -> dialog.setOnHidden(_ -> resolve.accept(dialog.getResult() == ButtonType.APPLY) )); } diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/BufferObservableList.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/BufferObservableList.java index c85efac..039f725 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/BufferObservableList.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/BufferObservableList.java @@ -24,7 +24,8 @@ import java.nio.IntBuffer; import java.nio.LongBuffer; -public sealed abstract class BufferObservableList extends ModifiableObservableListBase { +public abstract sealed class BufferObservableList extends ModifiableObservableListBase + permits BufferObservableList.OfByte, BufferObservableList.OfInt, BufferObservableList.OfLong { @Override protected void doAdd(int index, T element) { throw new UnsupportedOperationException(); diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/FxSS.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/FxSS.java index 9d01ae3..99cf106 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/FxSS.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/FxSS.java @@ -29,8 +29,11 @@ public final class FxSS { private static final String OBSERVABLE_CLASS_KEY = FxSS.class.getName() + ".observablesClasses"; + private FxSS() { + } + public static void addObservableClass(Node node, ObservableValue<@Nullable String> styleClass) { - ChangeListener<@Nullable String> listener = (observable, oldValue, newValue) -> { + ChangeListener<@Nullable String> listener = (_, oldValue, newValue) -> { if (oldValue != null) { node.getStyleClass().remove(oldValue); } @@ -47,7 +50,7 @@ public static void addObservableClass(Node node, ObservableValue<@Nullable Strin // Need to keep a reference to the style observable to prevent it from being garbage collected @SuppressWarnings("unchecked") var styleClassObservables = (Map, ChangeListener>) node.getProperties().computeIfAbsent( - OBSERVABLE_CLASS_KEY, k -> new IdentityHashMap<>() + OBSERVABLE_CLASS_KEY, _ -> new IdentityHashMap<>() ); styleClassObservables.put(styleClass, listener); } diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/Icons.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/Icons.java index c4968d7..00e509a 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/Icons.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/Icons.java @@ -33,6 +33,9 @@ public class Icons { private static final Map IMAGE_CACHE = new ConcurrentHashMap<>(LinTagId.values().length); + private Icons() { + } + public static Node iconForTag(LinTag tag) { ImageView view = new ImageView( IMAGE_CACHE.computeIfAbsent(tag.type().id(), Icons::initImage) diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/LongSpinnerValueFactory.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/LongSpinnerValueFactory.java index 4578a05..4bac653 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/LongSpinnerValueFactory.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/LongSpinnerValueFactory.java @@ -48,8 +48,8 @@ public LongSpinnerValueFactory(@NamedArg("min") long min, * @param min The minimum allowed long value for the Spinner. * @param max The maximum allowed long value for the Spinner. * @param initialValue The value of the Spinner when first instantiated, must - * be within the bounds of the min and max arguments, or - * else the min value will be used. + * be within the bounds of the min and max arguments, or + * else the min value will be used. */ public LongSpinnerValueFactory(@NamedArg("min") long min, @NamedArg("max") long max, @@ -63,8 +63,8 @@ public LongSpinnerValueFactory(@NamedArg("min") long min, * @param min The minimum allowed long value for the Spinner. * @param max The maximum allowed long value for the Spinner. * @param initialValue The value of the Spinner when first instantiated, must - * be within the bounds of the min and max arguments, or - * else the min value will be used. + * be within the bounds of the min and max arguments, or + * else the min value will be used. * @param amountToStepBy The amount to increment or decrement by, per step. */ public LongSpinnerValueFactory(@NamedArg("min") long min, @@ -76,8 +76,10 @@ public LongSpinnerValueFactory(@NamedArg("min") long min, setAmountToStepBy(amountToStepBy); setConverter(new LongStringConverter()); - valueProperty().addListener((o, oldValue, newValue) -> { - if (newValue == null) return; + valueProperty().addListener((_, _, newValue) -> { + if (newValue == null) { + return; + } // when the value is set, we need to react to ensure it is a // valid value (and if not, blow up appropriately) @@ -126,7 +128,7 @@ public final long getMin() { } /** - * Sets the minimum allowable value for this value factory + * Sets the minimum allowable value for this value factory. * * @return the minimum allowable value for this value factory */ @@ -163,7 +165,7 @@ public final long getMax() { } /** - * Sets the maximum allowable value for this value factory + * Sets the maximum allowable value for this value factory. * * @return the maximum allowable value for this value factory */ diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/MainSceneSetup.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/MainSceneSetup.java index 513d176..093ea0e 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/MainSceneSetup.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/MainSceneSetup.java @@ -79,7 +79,7 @@ private static MenuBar menuBar(Menu fileMenu) { private Menu fileMenu(MenuItem openFile, MenuItem saveFile) { var exit = new MenuItem("E_xit", FontIcon.of(FontAwesomeSolid.SIGN_OUT_ALT, 16)); - exit.setOnAction(__ -> { + exit.setOnAction(_ -> { if (checkExitOkay()) { Platform.exit(); } @@ -100,7 +100,7 @@ private Menu fileMenu(MenuItem openFile, MenuItem saveFile) { private MenuItem openFile(Stage stage, ExecutorService backgroundExecutor) { var openFile = new MenuItem("_Open...", FontIcon.of(FontAwesomeSolid.FILE_IMPORT, 16)); openFile.setAccelerator(new KeyCharacterCombination("O", KeyCombination.SHORTCUT_DOWN)); - openFile.setOnAction(__ -> { + openFile.setOnAction(_ -> { var chooser = new FileChooser(); chooser.setTitle("Choose an NBT File"); chooser.setInitialDirectory(new File(".")); @@ -120,7 +120,7 @@ private MenuItem saveFile() { var saveFile = new MenuItem("_Save", FontIcon.of(FontAwesomeSolid.SAVE, 16)); saveFile.disableProperty().bind(openPath.isNull().or(treeTableView.rootProperty().isNull())); saveFile.setAccelerator(new KeyCharacterCombination("S", KeyCombination.SHORTCUT_DOWN)); - saveFile.setOnAction(__ -> trySave()); + saveFile.setOnAction(_ -> trySave()); return saveFile; } @@ -185,9 +185,9 @@ private Button moveEntryUp() { button.disableProperty().bind( treeTableView.getSelectionModel().selectedItemProperty().map(item -> // Disable if we don't have any parent to move up in - (item == null || item.getParent() == null) || + (item == null || item.getParent() == null) // Disable if we're the first child - item.getParent().getChildren().getFirst() == item + || item.getParent().getChildren().getFirst() == item ) ); button.setOnAction(event -> { @@ -204,9 +204,9 @@ private Button moveEntryDown() { button.disableProperty().bind( treeTableView.getSelectionModel().selectedItemProperty().map(item -> // Disable if we don't have any parent to move down in - (item == null || item.getParent() == null) || + (item == null || item.getParent() == null) // Disable if we're the last child - item.getParent().getChildren().getLast() == item + || item.getParent().getChildren().getLast() == item ) ); button.setOnAction(event -> { diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/NbtTreeView.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/NbtTreeView.java index 3c4f02b..e4c2211 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/NbtTreeView.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/NbtTreeView.java @@ -75,7 +75,7 @@ public void changed(ObservableValue observable, Number oldValu }); treeView.getStyleClass().add("zebra"); - treeView.setRowFactory(view -> { + treeView.setRowFactory(_ -> { TreeTableRow row = new TreeTableRow<>(); // Compensate for the lack of `:not` in JavaFX CSS FxSS.addObservableClass(row, row.selectedProperty().map(selected -> selected ? null : "unselected")); @@ -87,14 +87,14 @@ public void changed(ObservableValue observable, Number oldValu private static TreeTableColumn createTypeNameColumn() { TreeTableColumn typeNameCol = new TreeTableColumn<>("Type/Name"); typeNameCol.setCellValueFactory(cellData -> Bindings.createObjectBinding(cellData.getValue()::getValue)); - typeNameCol.setCellFactory(column -> new TypeNameEditableCell()); + typeNameCol.setCellFactory(_ -> new TypeNameEditableCell()); return typeNameCol; } private static TreeTableColumn createValueColumn() { TreeTableColumn valueCol = new TreeTableColumn<>("Value"); valueCol.setCellValueFactory(cellData -> cellData.getValue().valueProperty()); - valueCol.setCellFactory(column -> new ValueEditableCell()); + valueCol.setCellFactory(_ -> new ValueEditableCell()); return valueCol; } diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/SpinnerListCell.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/SpinnerListCell.java index 9dc3a38..7fb76b1 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/SpinnerListCell.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/SpinnerListCell.java @@ -108,6 +108,7 @@ public void startEdit() { private Spinner initializeEditableGraphic() { record Result(Spinner spinner, Function extractValue) { } + // Safe because we checked it in the switch case labels @SuppressWarnings("unchecked") Result result = switch (getItem()) { diff --git a/gui/src/main/java/org/enginehub/linbus/gui/javafx/ValueEditableCell.java b/gui/src/main/java/org/enginehub/linbus/gui/javafx/ValueEditableCell.java index 8e49468..0766990 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/javafx/ValueEditableCell.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/javafx/ValueEditableCell.java @@ -72,7 +72,7 @@ private static FxFonts.AndString getFontTextForValue(NbtTreeView.TagEntry item) case LinByteArrayTag byteArrayTag -> bufferToString(byteArrayTag.view(), BYTES, ByteBuffer::get); case LinIntArrayTag intArrayTag -> bufferToString(intArrayTag.view(), INTS, IntBuffer::get); case LinLongArrayTag longArrayTag -> bufferToString(longArrayTag.view(), LONGS, LongBuffer::get); - case LinEndTag tag -> new FxFonts.AndString(FxFonts.ITALIC, "End"); + case LinEndTag _ -> new FxFonts.AndString(FxFonts.ITALIC, "End"); default -> new FxFonts.AndString(FxFonts.DEFAULT, item.tag().value().toString()); }; } @@ -98,16 +98,17 @@ private static FxFonts.AndString bufferToString( private static boolean isSimpleValueTag(LinTag tag) { return !( - tag instanceof LinCompoundTag || - tag instanceof LinListTag || - tag instanceof LinByteArrayTag || - tag instanceof LinIntArrayTag || - tag instanceof LinLongArrayTag || - tag instanceof LinEndTag - ); + tag instanceof LinCompoundTag + || tag instanceof LinListTag + || tag instanceof LinByteArrayTag + || tag instanceof LinIntArrayTag + || tag instanceof LinLongArrayTag + || tag instanceof LinEndTag + ); } - private sealed interface EditableGraphic { + private sealed interface EditableGraphic + permits EditableGraphic.Text, EditableGraphic.LongSpinner, EditableGraphic.DoubleSpinner { Node node(); @@ -226,9 +227,9 @@ protected void updateItem(NbtTreeView.@Nullable TagEntry item, boolean empty) { } else { setEditable(false); - if (item.tag() instanceof LinLongArrayTag || - item.tag() instanceof LinIntArrayTag || - item.tag() instanceof LinByteArrayTag) { + if (item.tag() instanceof LinLongArrayTag + || item.tag() instanceof LinIntArrayTag + || item.tag() instanceof LinByteArrayTag) { // These are editable, but not directly. We use a popup for them. if (doubleClickHandler == null) { doubleClickHandler = event -> { @@ -253,13 +254,13 @@ protected void updateItem(NbtTreeView.@Nullable TagEntry item, boolean empty) { } applyUpdate(switch (item.tag()) { - case LinByteArrayTag __ -> LinByteArrayTag.of( + case LinByteArrayTag _ -> LinByteArrayTag.of( ((BufferObservableList.OfByte) buffer).buffer().array() ); - case LinIntArrayTag __ -> LinIntArrayTag.of( + case LinIntArrayTag _ -> LinIntArrayTag.of( ((BufferObservableList.OfInt) buffer).buffer().array() ); - case LinLongArrayTag __ -> LinLongArrayTag.of( + case LinLongArrayTag _ -> LinLongArrayTag.of( ((BufferObservableList.OfLong) buffer).buffer().array() ); default -> throw new AssertionError("Unreachable"); @@ -295,6 +296,7 @@ public void startEdit() { private EditableGraphic initializeEditableGraphic() { record Result(EditableGraphic graphic, Consumer onAction) { } + Result result = switch (getItem().tag()) { case LinByteTag tag -> { EditableGraphic.LongSpinner graphic = new EditableGraphic.LongSpinner(new Spinner<>( diff --git a/gui/src/main/java/org/enginehub/linbus/gui/util/ErrorReporter.java b/gui/src/main/java/org/enginehub/linbus/gui/util/ErrorReporter.java index 495da06..16a100e 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/util/ErrorReporter.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/util/ErrorReporter.java @@ -44,7 +44,7 @@ private void logMessage(String message, Throwable t) { switch (this) { case TRACK -> Logger.info(t, message); case INFORM -> Logger.warn(t, message); - case DIE -> Logger.error(t, message); + default -> Logger.error(t, message); } } } @@ -60,7 +60,7 @@ public static void reportError(Level level, String message, Throwable t) { var cf = new CompletableFuture<@Nullable Void>(); // the whenComplete callback handles display errors and exit, so the returned future is unused @SuppressWarnings("FutureReturnValueIgnored") - CompletableFuture<@Nullable Void> _ = cf.whenComplete((value, t2) -> { + CompletableFuture<@Nullable Void> _ = cf.whenComplete((_, t2) -> { if (t2 != null) { Logger.warn("Error displaying error to user", t2); } @@ -71,7 +71,7 @@ public static void reportError(Level level, String message, Throwable t) { Platform.runLater(() -> { try { var alert = initAlert(message, t); - alert.setOnHidden(e -> cf.complete(null)); + alert.setOnHidden(_ -> cf.complete(null)); alert.show(); } catch (Throwable t2) { cf.completeExceptionally(t2); @@ -119,10 +119,10 @@ private static Alert initAlert(String message, Throwable t) { * @param message the message to include * * @return a {@link BiConsumer} that will call {@link #reportError(Level, String, Throwable)} if given a non-null - * {@link Throwable} + * {@link Throwable} */ public static BiConsumer bind(Level level, String message) { - return (value, t) -> { + return (_, t) -> { if (t != null) { reportError(level, message, t); } diff --git a/gui/src/main/java/org/enginehub/linbus/gui/util/MoreFutures.java b/gui/src/main/java/org/enginehub/linbus/gui/util/MoreFutures.java index 69e4876..ab7ef24 100644 --- a/gui/src/main/java/org/enginehub/linbus/gui/util/MoreFutures.java +++ b/gui/src/main/java/org/enginehub/linbus/gui/util/MoreFutures.java @@ -23,7 +23,7 @@ import java.util.function.Consumer; public class MoreFutures { - public static CompletableFuture create(BiConsumer, Consumer> body) { + public static CompletableFuture create(BiConsumer, Consumer> body) { var future = new CompletableFuture(); try { body.accept(future::complete, future::completeExceptionally); diff --git a/stream/src/main/java/org/enginehub/linbus/stream/LinBinaryIO.java b/stream/src/main/java/org/enginehub/linbus/stream/LinBinaryIO.java index 556c6d3..5538a55 100644 --- a/stream/src/main/java/org/enginehub/linbus/stream/LinBinaryIO.java +++ b/stream/src/main/java/org/enginehub/linbus/stream/LinBinaryIO.java @@ -138,7 +138,7 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep } } switch (token) { - case LinToken.Name(String name, Optional id) -> + case LinToken.Name(String name, Optional _) -> // We need to hold this until we print the id nextName = name; case LinToken.ByteArrayStart(OptionalInt size) -> { @@ -152,7 +152,7 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep buffer.get(copy); output.write(copy); } - case LinToken.ByteArrayEnd byteArrayEnd -> { + case LinToken.ByteArrayEnd _ -> { // Nothing to do } case LinToken.Byte(byte value) -> { @@ -161,11 +161,11 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep output.writeByte(value); } - case LinToken.CompoundStart compoundStart -> { + case LinToken.CompoundStart _ -> { writeIdAndNameIfNeeded(output, LinTagId.COMPOUND, nextName); nextName = null; } - case LinToken.CompoundEnd compoundEnd -> output.writeByte(LinTagId.END.id()); + case LinToken.CompoundEnd _ -> output.writeByte(LinTagId.END.id()); case LinToken.Double(double value) -> { writeIdAndNameIfNeeded(output, LinTagId.DOUBLE, nextName); nextName = null; @@ -189,7 +189,7 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep output.writeInt(buffer.get()); } } - case LinToken.IntArrayEnd intArrayEnd -> { + case LinToken.IntArrayEnd _ -> { // Nothing to do } case LinToken.Int(int value) -> { @@ -205,7 +205,7 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep output.writeByte(elementId.orElseThrow().id()); output.writeInt(size.orElseThrow()); } - case LinToken.ListEnd listEnd -> { + case LinToken.ListEnd _ -> { // Nothing to do } case LinToken.LongArrayStart(OptionalInt size) -> { @@ -219,7 +219,7 @@ public static void write(DataOutput output, LinStreamable tokens) throws IOExcep output.writeLong(buffer.get()); } } - case LinToken.LongArrayEnd longArrayEnd -> { + case LinToken.LongArrayEnd _ -> { // Nothing to do } case LinToken.Long(long value) -> { diff --git a/stream/src/main/java/org/enginehub/linbus/stream/LinReadOptions.java b/stream/src/main/java/org/enginehub/linbus/stream/LinReadOptions.java index b23fa95..aff30fe 100644 --- a/stream/src/main/java/org/enginehub/linbus/stream/LinReadOptions.java +++ b/stream/src/main/java/org/enginehub/linbus/stream/LinReadOptions.java @@ -70,9 +70,9 @@ public LinReadOptions build() { @Override public String toString() { - return "LinReadOptions.Builder{" + - "allowNormalUtf8Encoding=" + allowNormalUtf8Encoding + - '}'; + return "LinReadOptions.Builder{" + + "allowNormalUtf8Encoding=" + allowNormalUtf8Encoding + + '}'; } } @@ -97,8 +97,8 @@ public boolean allowNormalUtf8Encoding() { @Override public String toString() { - return "LinReadOptions{" + - "allowNormalUtf8Encoding=" + allowNormalUtf8Encoding + - '}'; + return "LinReadOptions{" + + "allowNormalUtf8Encoding=" + allowNormalUtf8Encoding + + '}'; } } diff --git a/stream/src/main/java/org/enginehub/linbus/stream/impl/LinNbtReader.java b/stream/src/main/java/org/enginehub/linbus/stream/impl/LinNbtReader.java index 59f35ee..4e980fd 100644 --- a/stream/src/main/java/org/enginehub/linbus/stream/impl/LinNbtReader.java +++ b/stream/src/main/java/org/enginehub/linbus/stream/impl/LinNbtReader.java @@ -110,7 +110,9 @@ private static StringEncoding getGuaranteedStringEncoding(ByteBuffer bytes) { return StringEncoding.UNKNOWN; } - private sealed interface State { + private sealed interface State permits + State.Initial, State.CompoundStart, State.CompoundEntryName, State.ListEntry, State.ReadValue, + State.ReadByteArray, State.ReadIntArray, State.ReadLongArray { /** * We need to initialize and return the root name. */ @@ -204,8 +206,9 @@ String decode() throws CharacterCodingException { int n = (int) (sourceBuffer.remaining() * decoder.averageCharsPerByte()); ensureCharBufferCapacity(n); - if ((n == 0) && (sourceBuffer.remaining() == 0)) + if ((n == 0) && (sourceBuffer.remaining() == 0)) { return ""; + } decoder.reset(); for (; ; ) { CoderResult cr = sourceBuffer.hasRemaining() @@ -261,18 +264,18 @@ public LinNbtReader(DataInput input, LinReadOptions options) { var state = stateStack.pollLast(); return switch (state) { case null -> null; - case State.Initial initial -> { + case State.Initial _ -> { if (input.readUnsignedByte() != LinTagId.COMPOUND.id()) { throw new NbtParseException("NBT stream does not start with a compound tag"); } stateStack.addLast(State.CompoundStart.INSTANCE); yield new LinToken.Name(readUtf(), LinTagId.COMPOUND); } - case State.CompoundStart compoundStart -> { + case State.CompoundStart _ -> { stateStack.addLast(State.CompoundEntryName.INSTANCE); yield new LinToken.CompoundStart(); } - case State.CompoundEntryName compoundEntryName -> { + case State.CompoundEntryName _ -> { var id = LinTagId.fromId(input.readUnsignedByte()); if (id == LinTagId.END) { yield new LinToken.CompoundEnd(); diff --git a/stream/src/main/java/org/enginehub/linbus/stream/impl/ValueCounter.java b/stream/src/main/java/org/enginehub/linbus/stream/impl/ValueCounter.java index 80d44d8..e65f56a 100644 --- a/stream/src/main/java/org/enginehub/linbus/stream/impl/ValueCounter.java +++ b/stream/src/main/java/org/enginehub/linbus/stream/impl/ValueCounter.java @@ -51,8 +51,8 @@ public void add(LinToken token) { return; } switch (token) { - case LinToken.CompoundStart compoundStart -> compounds++; - case LinToken.CompoundEnd compoundEnd -> { + case LinToken.CompoundStart _ -> compounds++; + case LinToken.CompoundEnd _ -> { compounds--; if (compounds < 0) { throw new NbtParseException("Compound end without start"); @@ -61,8 +61,8 @@ public void add(LinToken token) { count++; } } - case LinToken.ListStart listStart -> lists++; - case LinToken.ListEnd listEnd -> { + case LinToken.ListStart _ -> lists++; + case LinToken.ListEnd _ -> { lists--; if (lists < 0) { throw new NbtParseException("List end without start"); @@ -71,8 +71,8 @@ public void add(LinToken token) { count++; } } - case LinToken.ByteArrayStart byteArrayStart -> arrayType = BYTE_ARRAY; - case LinToken.ByteArrayEnd byteArrayEnd -> { + case LinToken.ByteArrayStart _ -> arrayType = BYTE_ARRAY; + case LinToken.ByteArrayEnd _ -> { if (arrayType != BYTE_ARRAY) { throw new NbtParseException("Byte array end without start"); } @@ -81,8 +81,8 @@ public void add(LinToken token) { count++; } } - case LinToken.IntArrayStart intArrayStart -> arrayType = INT_ARRAY; - case LinToken.IntArrayEnd intArrayEnd -> { + case LinToken.IntArrayStart _ -> arrayType = INT_ARRAY; + case LinToken.IntArrayEnd _ -> { if (arrayType != INT_ARRAY) { throw new NbtParseException("Int array end without start"); } @@ -91,8 +91,8 @@ public void add(LinToken token) { count++; } } - case LinToken.LongArrayStart longArrayStart -> arrayType = LONG_ARRAY; - case LinToken.LongArrayEnd longArrayEnd -> { + case LinToken.LongArrayStart _ -> arrayType = LONG_ARRAY; + case LinToken.LongArrayEnd _ -> { if (arrayType != LONG_ARRAY) { throw new NbtParseException("Long array end without start"); } diff --git a/stream/src/main/java/org/enginehub/linbus/stream/token/LinToken.java b/stream/src/main/java/org/enginehub/linbus/stream/token/LinToken.java index 9326687..9aa567b 100644 --- a/stream/src/main/java/org/enginehub/linbus/stream/token/LinToken.java +++ b/stream/src/main/java/org/enginehub/linbus/stream/token/LinToken.java @@ -31,7 +31,12 @@ */ // token types deliberately mirror the NBT type names @SuppressWarnings("JavaLangClash") -public sealed interface LinToken { +public sealed interface LinToken permits + LinToken.Name, LinToken.ByteArrayStart, LinToken.ByteArrayContent, LinToken.ByteArrayEnd, LinToken.Byte, + LinToken.CompoundStart, LinToken.CompoundEnd, LinToken.Double, LinToken.Float, LinToken.IntArrayStart, + LinToken.IntArrayContent, LinToken.IntArrayEnd, LinToken.Int, LinToken.ListStart, LinToken.ListEnd, + LinToken.LongArrayStart, LinToken.LongArrayContent, LinToken.LongArrayEnd, LinToken.Long, LinToken.Short, + LinToken.String { /** * Check if this token represents a whole value on its own, i.e. there are no following tokens. * diff --git a/stream/src/test/java/org/enginehub/linbus/stream/BigTestPrinter.java b/stream/src/test/java/org/enginehub/linbus/stream/BigTestPrinter.java index 27334bd..696599d 100644 --- a/stream/src/test/java/org/enginehub/linbus/stream/BigTestPrinter.java +++ b/stream/src/test/java/org/enginehub/linbus/stream/BigTestPrinter.java @@ -27,6 +27,9 @@ import java.util.zip.GZIPInputStream; public class BigTestPrinter { + private BigTestPrinter() { + } + public static void main(String[] args) throws IOException { var resource = Resources.getResource("bigtest.nbt.gz"); try (var stream = Resources.asByteSource(resource).openStream(); diff --git a/stream/src/test/java/org/enginehub/linbus/stream/LinBinaryIOTest.java b/stream/src/test/java/org/enginehub/linbus/stream/LinBinaryIOTest.java index 8e36bdc..c3c3912 100644 --- a/stream/src/test/java/org/enginehub/linbus/stream/LinBinaryIOTest.java +++ b/stream/src/test/java/org/enginehub/linbus/stream/LinBinaryIOTest.java @@ -52,7 +52,7 @@ void readUsing() throws IOException { 0, // name size (0) 0, 1, // value - 0 // end tag + 0, // end tag }), s -> ImmutableList.copyOf(s.asIterator())); assertThat(tokens).isNotNull(); assertThat(tokens).isNotEmpty(); diff --git a/stream/src/test/java/org/enginehub/linbus/stream/StreamTestUtil.java b/stream/src/test/java/org/enginehub/linbus/stream/StreamTestUtil.java index fecce74..295a40c 100644 --- a/stream/src/test/java/org/enginehub/linbus/stream/StreamTestUtil.java +++ b/stream/src/test/java/org/enginehub/linbus/stream/StreamTestUtil.java @@ -35,6 +35,9 @@ public interface ResourceLoader { T load(InputStream stream) throws IOException; } + private StreamTestUtil() { + } + public static T loadResource(String name, ResourceLoader loader) throws IOException { var resource = Resources.getResource(name); try (var stream = Resources.asByteSource(resource).openStream(); diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinByteArrayTag.java b/tree/src/main/java/org/enginehub/linbus/tree/LinByteArrayTag.java index 7bc7045..65d670d 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinByteArrayTag.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinByteArrayTag.java @@ -72,16 +72,16 @@ public LinStream linStream() { new LinToken.ByteArrayStart(value.length), new LinStream() { private static final int BUFFER_SIZE = 4096; - private int i = 0; + private int index = 0; @Override public @Nullable LinToken nextOrNull() { - if (i >= value.length) { + if (index >= value.length) { return null; } - var length = Math.min(BUFFER_SIZE, value.length - i); - var buffer = ByteBuffer.wrap(value, i, length).asReadOnlyBuffer(); - i += length; + var length = Math.min(BUFFER_SIZE, value.length - index); + var buffer = ByteBuffer.wrap(value, index, length).asReadOnlyBuffer(); + index += length; return new LinToken.ByteArrayContent(buffer); } }, @@ -91,8 +91,12 @@ public LinStream linStream() { @Override public boolean equals(@Nullable Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } LinByteArrayTag that = (LinByteArrayTag) o; return Arrays.equals(value, that.value); } diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinIntArrayTag.java b/tree/src/main/java/org/enginehub/linbus/tree/LinIntArrayTag.java index 9905dea..f699da1 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinIntArrayTag.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinIntArrayTag.java @@ -73,16 +73,16 @@ public LinStream linStream() { new LinToken.IntArrayStart(value.length), new LinStream() { private static final int BUFFER_SIZE = 4096; - private int i = 0; + private int index = 0; @Override public @Nullable LinToken nextOrNull() { - if (i >= value.length) { + if (index >= value.length) { return null; } - var length = Math.min(BUFFER_SIZE, value.length - i); - var buffer = IntBuffer.wrap(value, i, length).asReadOnlyBuffer(); - i += length; + var length = Math.min(BUFFER_SIZE, value.length - index); + var buffer = IntBuffer.wrap(value, index, length).asReadOnlyBuffer(); + index += length; return new LinToken.IntArrayContent(buffer); } }, @@ -92,8 +92,12 @@ public LinStream linStream() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } LinIntArrayTag that = (LinIntArrayTag) o; return Arrays.equals(value, that.value); } diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinLongArrayTag.java b/tree/src/main/java/org/enginehub/linbus/tree/LinLongArrayTag.java index 156d4ef..7f1100f 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinLongArrayTag.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinLongArrayTag.java @@ -74,16 +74,16 @@ public LinStream linStream() { new LinToken.LongArrayStart(value.length), new LinStream() { private static final int BUFFER_SIZE = 4096; - private int i = 0; + private int index = 0; @Override public @Nullable LinToken nextOrNull() { - if (i >= value.length) { + if (index >= value.length) { return null; } - var length = Math.min(BUFFER_SIZE, value.length - i); - var buffer = LongBuffer.wrap(value, i, length).asReadOnlyBuffer(); - i += length; + var length = Math.min(BUFFER_SIZE, value.length - index); + var buffer = LongBuffer.wrap(value, index, length).asReadOnlyBuffer(); + index += length; return new LinToken.LongArrayContent(buffer); } }, @@ -93,8 +93,12 @@ public LinStream linStream() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } LinLongArrayTag that = (LinLongArrayTag) o; return Arrays.equals(value, that.value); } diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinNumberTag.java b/tree/src/main/java/org/enginehub/linbus/tree/LinNumberTag.java index 05029a5..b3e41bc 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinNumberTag.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinNumberTag.java @@ -23,7 +23,7 @@ * * @param the specific type of number this tag represents */ -public sealed abstract class LinNumberTag extends LinTag +public abstract sealed class LinNumberTag extends LinTag permits LinByteTag, LinDoubleTag, LinFloatTag, LinIntTag, LinLongTag, LinShortTag { /** * Constructor for subclasses. diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinRootEntry.java b/tree/src/main/java/org/enginehub/linbus/tree/LinRootEntry.java index 06494de..084b570 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinRootEntry.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinRootEntry.java @@ -103,6 +103,7 @@ public byte[] writeToArray() { /** * {@inheritDoc} + * *

* Note that the tag returned is not the same as {@link #value()}. */ diff --git a/tree/src/main/java/org/enginehub/linbus/tree/LinTag.java b/tree/src/main/java/org/enginehub/linbus/tree/LinTag.java index d1f51ee..9cbf66b 100644 --- a/tree/src/main/java/org/enginehub/linbus/tree/LinTag.java +++ b/tree/src/main/java/org/enginehub/linbus/tree/LinTag.java @@ -28,7 +28,7 @@ * * @param the type of the canonical representation */ -public sealed abstract class LinTag implements ToLinTag>, LinStreamable +public abstract sealed class LinTag implements ToLinTag>, LinStreamable permits LinByteArrayTag, LinCompoundTag, LinEndTag, LinIntArrayTag, LinListTag, LinLongArrayTag, LinNumberTag, LinStringTag { /** @@ -63,8 +63,12 @@ public final LinTag toLinTag() { // distinct concrete tag types must never be equal @SuppressWarnings("EqualsGetClass") public boolean equals(@Nullable Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } LinTag that = (LinTag) o; return Objects.equals(value(), that.value()); } diff --git a/tree/src/test/java/org/enginehub/linbus/tree/LinCompoundTagTest.java b/tree/src/test/java/org/enginehub/linbus/tree/LinCompoundTagTest.java index 0444da7..9012a5e 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/LinCompoundTagTest.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/LinCompoundTagTest.java @@ -143,13 +143,13 @@ void transformByName() { "Hello", LinStringTag.of("World!"), "Goodbye", LinIntArrayTag.of(0xCAFE, 0xBABE) )); - var transformed = tag.transformTag("Hello", LinTagType.stringTag(), t -> LinStringTag.of("New World!")); + var transformed = tag.transformTag("Hello", LinTagType.stringTag(), _ -> LinStringTag.of("New World!")); assertThat(transformed).isEqualTo(LinCompoundTag.of(Map.of( "Hello", LinStringTag.of("New World!"), "Goodbye", LinIntArrayTag.of(0xCAFE, 0xBABE) ))); - var transformedToNewType = tag.transformTag("Hello", LinTagType.stringTag(), t -> LinIntArrayTag.of(0xDEAD, 0xBEEF)); + var transformedToNewType = tag.transformTag("Hello", LinTagType.stringTag(), _ -> LinIntArrayTag.of(0xDEAD, 0xBEEF)); assertThat(transformedToNewType).isEqualTo(LinCompoundTag.of(Map.of( "Hello", LinIntArrayTag.of(0xDEAD, 0xBEEF), "Goodbye", LinIntArrayTag.of(0xCAFE, 0xBABE) @@ -180,7 +180,7 @@ void transformRejectsEndTag() { var tag = LinCompoundTag.of(Map.of("Hello", LinStringTag.of("World!"))); var ex = assertThrows( IllegalArgumentException.class, - () -> tag.transformTag("Hello", LinTagType.stringTag(), t -> LinEndTag.instance()) + () -> tag.transformTag("Hello", LinTagType.stringTag(), _ -> LinEndTag.instance()) ); assertThat(ex).hasMessageThat().isEqualTo("Cannot add END tag to compound tag"); } @@ -190,7 +190,7 @@ void transformRejectsNullResult() { var tag = LinCompoundTag.of(Map.of("Hello", LinStringTag.of("World!"))); assertThrows( NullPointerException.class, - () -> tag.transformTag("Hello", LinTagType.stringTag(), t -> null) + () -> tag.transformTag("Hello", LinTagType.stringTag(), _ -> null) ); } @@ -227,11 +227,11 @@ void transformListByName() { void transformIfPresentByName() { var tag = LinCompoundTag.of(Map.of("Hello", LinStringTag.of("World!"))); var transformed = tag.transformTagIfPresent( - "Hello", LinTagType.stringTag(), t -> LinStringTag.of("New World!") + "Hello", LinTagType.stringTag(), _ -> LinStringTag.of("New World!") ); assertThat(transformed).getTagByKey("Hello").stringValue().isEqualTo("New World!"); - assertThat(tag.transformTagIfPresent("Nope", LinTagType.stringTag(), t -> LinStringTag.of("x"))) + assertThat(tag.transformTagIfPresent("Nope", LinTagType.stringTag(), _ -> LinStringTag.of("x"))) .isSameInstanceAs(tag); var ex = assertThrows( @@ -269,7 +269,7 @@ void transformOrInsertByName() { } assertThrows( NullPointerException.class, - () -> tag.transformTagOrInsert("Hello", LinTagType.stringTag(), t -> null) + () -> tag.transformTagOrInsert("Hello", LinTagType.stringTag(), _ -> null) ); } diff --git a/tree/src/test/java/org/enginehub/linbus/tree/LinListTagTest.java b/tree/src/test/java/org/enginehub/linbus/tree/LinListTagTest.java index b906bbb..66fb5a6 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/LinListTagTest.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/LinListTagTest.java @@ -75,7 +75,7 @@ void transformByIndex() { LinStringTag.of("Hello"), LinStringTag.of("Goodbye...") )) - ).isEqualTo(initial.transformTag(1, s -> LinStringTag.of("Goodbye..."))); + ).isEqualTo(initial.transformTag(1, _ -> LinStringTag.of("Goodbye..."))); } @Test @@ -86,7 +86,7 @@ void transformByIndexOutOfRange() { )); assertThrows( IndexOutOfBoundsException.class, - () -> initial.transformTag(2, s -> LinStringTag.of("Goodbye...")) + () -> initial.transformTag(2, _ -> LinStringTag.of("Goodbye...")) ); } diff --git a/tree/src/test/java/org/enginehub/linbus/tree/LinRootEntryTest.java b/tree/src/test/java/org/enginehub/linbus/tree/LinRootEntryTest.java index d5f1124..a617815 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/LinRootEntryTest.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/LinRootEntryTest.java @@ -37,7 +37,7 @@ void transformName() { void transformValue() { var root = new LinRootEntry("root", LinCompoundTag.of(Map.of("Hello", LinStringTag.of("World!")))); var updated = root.transformValue( - v -> v.transformTag("Hello", LinTagType.stringTag(), t -> LinStringTag.of("New World!")) + v -> v.transformTag("Hello", LinTagType.stringTag(), _ -> LinStringTag.of("New World!")) ); assertThat(updated.name()).isEqualTo("root"); assertThat(updated.value()).isEqualTo(LinCompoundTag.of(Map.of("Hello", LinStringTag.of("New World!")))); diff --git a/tree/src/test/java/org/enginehub/linbus/tree/LinTagIntegrationTest.java b/tree/src/test/java/org/enginehub/linbus/tree/LinTagIntegrationTest.java index 3a10f12..0acd85b 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/LinTagIntegrationTest.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/LinTagIntegrationTest.java @@ -84,7 +84,7 @@ void bigtest() throws IOException { rootCompoundSubject.getTagByKey("intTest").intValue().isEqualTo(2147483647); rootCompoundSubject.getTagByKey("byteTest").byteValue().isEqualTo(127); rootCompoundSubject.getTagByKey("stringTest").stringValue() - .isEqualTo("HELLO WORLD THIS IS A TEST STRING \u00c5\u00c4\u00d6!"); + .isEqualTo("HELLO WORLD THIS IS A TEST STRING ÅÄÖ!"); for (int i = 0; i < 5; i++) { rootCompoundSubject.getTagByKey("listTest (long)") .getTagByIndex(i).longValue().isEqualTo(11 + i); diff --git a/tree/src/test/java/org/enginehub/linbus/tree/NestedTransformShowcaseTest.java b/tree/src/test/java/org/enginehub/linbus/tree/NestedTransformShowcaseTest.java index 9e7a37e..27125db 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/NestedTransformShowcaseTest.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/NestedTransformShowcaseTest.java @@ -40,7 +40,7 @@ void transformSchematicMetadata() { LinRootEntry withNewName = root.transformValue(v -> v.transformTag("Schematic", LinTagType.compoundTag(), schematic -> schematic.transformTag("Metadata", LinTagType.compoundTag(), metadata -> - metadata.transformTag("Name", LinTagType.stringTag(), name -> + metadata.transformTag("Name", LinTagType.stringTag(), _ -> LinStringTag.of("My New Schematic") ) ) diff --git a/tree/src/test/java/org/enginehub/linbus/tree/SimpleObjectVerifier.java b/tree/src/test/java/org/enginehub/linbus/tree/SimpleObjectVerifier.java index 115984a..2e54d01 100644 --- a/tree/src/test/java/org/enginehub/linbus/tree/SimpleObjectVerifier.java +++ b/tree/src/test/java/org/enginehub/linbus/tree/SimpleObjectVerifier.java @@ -25,6 +25,9 @@ * Helper for verifying equals and hashCode implementations. */ public class SimpleObjectVerifier { + private SimpleObjectVerifier() { + } + // deliberately verifies the equals(null) contract @SuppressWarnings("EqualsNull") public static void assertEqualsHashCodeImplementation(T base, T equal, T alsoEqual, T notEqual) {