From 9c0ce27ce6ac568ecdff2a369cf517cb9431279f Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 22 Mar 2025 09:39:47 +0000 Subject: [PATCH] Switch a few more places to use Java 17 features New ErrorProne hint, and one which is actually pretty useful! --- .../impl/network/wired/WiredNetworkImpl.java | 4 ++-- .../builder/HelpingArgumentBuilder.java | 4 ++-- .../wireless/WirelessModemBlockEntity.java | 2 +- .../peripheral/monitor/MonitorPeripheral.java | 3 +-- .../peripheral/monitor/MonitorWatcher.java | 7 +++--- .../speaker/SpeakerBlockEntity.java | 2 +- .../pocket/peripherals/PocketSpeaker.java | 3 +-- .../shared/turtle/core/TurtleDropCommand.java | 15 ++++++------- .../shared/turtle/core/TurtleSuckCommand.java | 15 ++++++------- .../shared/util/DropConsumer.java | 4 ++-- .../shared/util/PrettyJsonWriter.java | 4 ++-- .../gametest/core/ClientTestHooks.kt | 2 +- .../computercraft/core/apis/LuaDateTime.java | 2 +- .../dan200/computercraft/core/apis/OSAPI.java | 10 ++++----- .../core/apis/handles/AbstractHandle.java | 4 ++-- .../computercraft/core/lua/TableImpl.java | 4 ++-- .../core/lua/VarargArguments.java | 9 ++++---- .../computercraft/core/asm/MethodTest.java | 22 ++++++++++--------- .../web/builder/TransformingClassLoader.java | 1 + 19 files changed, 58 insertions(+), 59 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNetworkImpl.java b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNetworkImpl.java index c297b7294..c536556e9 100644 --- a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNetworkImpl.java +++ b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNetworkImpl.java @@ -437,8 +437,8 @@ final class WiredNetworkImpl implements WiredNetwork { } private static WiredNodeImpl checkNode(WiredNode node) { - if (node instanceof WiredNodeImpl) { - return (WiredNodeImpl) node; + if (node instanceof WiredNodeImpl n) { + return n; } else { throw new IllegalArgumentException("Unknown implementation of IWiredNode: " + node); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java b/projects/common/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java index de3ef8f18..81f60cc0f 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java @@ -66,8 +66,8 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder then(final ArgumentBuilder argument) { if (getRedirect() != null) throw new IllegalStateException("Cannot add children to a redirected node"); - if (argument instanceof HelpingArgumentBuilder) { - children.add((HelpingArgumentBuilder) argument); + if (argument instanceof HelpingArgumentBuilder child) { + children.add(child); } else if (argument instanceof LiteralArgumentBuilder) { super.then(argument); } else { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlockEntity.java index e5b895110..fad31f8f8 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlockEntity.java @@ -38,7 +38,7 @@ public class WirelessModemBlockEntity extends BlockEntity { @Override public boolean equals(@Nullable IPeripheral other) { - return this == other || (other instanceof Peripheral && entity == ((Peripheral) other).entity); + return this == other || (other instanceof Peripheral o && entity == o.entity); } @Override diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java index 2c1cf681e..b525f2dab 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java @@ -40,7 +40,6 @@ import org.jspecify.annotations.Nullable; * monitor.setCursorPos(1, 1) * monitor.write("Hello, world!") * } - * * @cc.see monitor_resize Queued when a monitor is resized. * @cc.see monitor_touch Queued when an advanced monitor is clicked. */ @@ -95,7 +94,7 @@ public class MonitorPeripheral extends TermMethods implements IPeripheral { @Override public boolean equals(@Nullable IPeripheral other) { - return other instanceof MonitorPeripheral && monitor == ((MonitorPeripheral) other).monitor; + return other instanceof MonitorPeripheral o && monitor == o.monitor; } private ServerMonitor getMonitor() throws LuaException { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorWatcher.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorWatcher.java index 48c44e024..ad485d64e 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorWatcher.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorWatcher.java @@ -57,11 +57,10 @@ public final class MonitorWatcher { if (monitor == null) continue; var pos = tile.getBlockPos(); - var world = tile.getLevel(); - if (!(world instanceof ServerLevel)) continue; + if (!(tile.getLevel() instanceof ServerLevel level)) continue; - var chunk = world.getChunkAt(pos); - if (((ServerLevel) world).getChunkSource().chunkMap.getPlayers(chunk.getPos(), false).isEmpty()) { + var chunk = level.getChunkAt(pos); + if (level.getChunkSource().chunkMap.getPlayers(chunk.getPos(), false).isEmpty()) { continue; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlockEntity.java index 041f0f212..160eb5caf 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlockEntity.java @@ -53,7 +53,7 @@ public class SpeakerBlockEntity extends BlockEntity { @Override public boolean equals(@Nullable IPeripheral other) { - return this == other || (other instanceof Peripheral && speaker == ((Peripheral) other).speaker); + return this == other || (other instanceof Peripheral o && speaker == o.speaker); } } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java index 657286729..c863b9a47 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java @@ -25,7 +25,6 @@ public class PocketSpeaker extends AbstractPocketUpgrade { @Override public void update(IPocketAccess access, @Nullable IPeripheral peripheral) { - if (!(peripheral instanceof PocketSpeakerPeripheral)) return; - ((PocketSpeakerPeripheral) peripheral).update(); + if (peripheral instanceof PocketSpeakerPeripheral speaker) speaker.update(); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java index ac990902d..a1848ecf2 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java @@ -62,14 +62,13 @@ public class TurtleDropCommand implements TurtleCommand { } } - switch (transferred) { - case ContainerTransfer.NO_SPACE: - return TurtleCommandResult.failure("No space for items"); - case ContainerTransfer.NO_ITEMS: - return TurtleCommandResult.failure("No items to drop"); - default: + return switch (transferred) { + case ContainerTransfer.NO_SPACE -> TurtleCommandResult.failure("No space for items"); + case ContainerTransfer.NO_ITEMS -> TurtleCommandResult.failure("No items to drop"); + default -> { turtle.playAnimation(TurtleAnimation.WAIT); - return TurtleCommandResult.success(); - } + yield TurtleCommandResult.success(); + } + }; } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java index 0061d9ab1..4cd1e4351 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java @@ -50,15 +50,14 @@ public class TurtleSuckCommand implements TurtleCommand { if (inventory != null) { // Take from inventory of thing in front var transferred = inventory.moveTo(TurtleUtil.getOffsetInventory(turtle), quantity); - switch (transferred) { - case ContainerTransfer.NO_SPACE: - return TurtleCommandResult.failure("No space for items"); - case ContainerTransfer.NO_ITEMS: - return TurtleCommandResult.failure("No items to take"); - default: + return switch (transferred) { + case ContainerTransfer.NO_SPACE -> TurtleCommandResult.failure("No space for items"); + case ContainerTransfer.NO_ITEMS -> TurtleCommandResult.failure("No items to take"); + default -> { turtle.playAnimation(TurtleAnimation.WAIT); - return TurtleCommandResult.success(); - } + yield TurtleCommandResult.success(); + } + }; } else { // Suck up loose items off the ground var aabb = new AABB( diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/DropConsumer.java b/projects/common/src/main/java/dan200/computercraft/shared/util/DropConsumer.java index 731e3935c..8b5b2daed 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/util/DropConsumer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/util/DropConsumer.java @@ -70,9 +70,9 @@ public final class DropConsumer { public static boolean onEntitySpawn(Entity entity) { // Capture any nearby item spawns - if (dropWorld == entity.level() && entity instanceof ItemEntity + if (dropWorld == entity.level() && entity instanceof ItemEntity item && assertNonNull(dropBounds).contains(entity.position())) { - handleDrops(((ItemEntity) entity).getItem()); + handleDrops(item.getItem()); return true; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/PrettyJsonWriter.java b/projects/common/src/main/java/dan200/computercraft/shared/util/PrettyJsonWriter.java index 30b91bf3d..6a4e82b48 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/util/PrettyJsonWriter.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/util/PrettyJsonWriter.java @@ -79,8 +79,8 @@ public class PrettyJsonWriter extends JsonWriter { // Otherwise we either need to push to our list or finish a record pair. var head = stack.getLast(); - if (head instanceof DocList) { - ((DocList) head).add(object); + if (head instanceof DocList headList) { + headList.add(object); } else { stack.removeLast(); ((DocList) stack.getLast()).add(new Pair((String) head, object)); diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt index fb92c58b7..64e8e7643 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt @@ -83,7 +83,7 @@ object ClientTestHooks { if (minecraft.levelSource.levelExists(LEVEL_NAME)) { LOG.info("World already exists, opening.") - minecraft.createWorldOpenFlows().loadLevel(minecraft.screen, LEVEL_NAME) + minecraft.createWorldOpenFlows().loadLevel(minecraft.screen!!, LEVEL_NAME) } else { LOG.info("World does not exist, creating it.") val rules = GameRules() diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/LuaDateTime.java b/projects/core/src/main/java/dan200/computercraft/core/apis/LuaDateTime.java index ccaf6b40e..d53f60795 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/LuaDateTime.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/LuaDateTime.java @@ -112,7 +112,7 @@ final class LuaDateTime { private static int getField(Map table, String field, int def) throws LuaException { var value = table.get(field); - if (value instanceof Number) return ((Number) value).intValue(); + if (value instanceof Number n) return n.intValue(); if (def < 0) throw new LuaException("field \"" + field + "\" missing in date table"); return def; } diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java b/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java index 477c83aac..e2c54fc52 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java @@ -110,14 +110,14 @@ public class OSAPI implements ILuaAPI { return time; } - private static int getDayForCalendar(Calendar c) { - var g = c instanceof GregorianCalendar ? (GregorianCalendar) c : new GregorianCalendar(); - var year = c.get(Calendar.YEAR); + private static int getDayForCalendar(Calendar calendar) { + var g = calendar instanceof GregorianCalendar c ? c : new GregorianCalendar(); + var year = calendar.get(Calendar.YEAR); var day = 0; for (var y = 1970; y < year; y++) { day += g.isLeapYear(y) ? 366 : 365; } - day += c.get(Calendar.DAY_OF_YEAR); + day += calendar.get(Calendar.DAY_OF_YEAR); return day; } @@ -133,7 +133,7 @@ public class OSAPI implements ILuaAPI { * @param args The parameters of the event. * @cc.tparam string name The name of the event to queue. * @cc.param ... The parameters of the event. These can be any primitive type (boolean, number, string) as well as - * tables. Other types (like functions), as well as metatables, will not be preserved. + * tables. Other types (like functions), as well as metatables, will not be preserved. * @cc.see os.pullEvent To pull the event queued */ @LuaFunction diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/AbstractHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/AbstractHandle.java index b5e39e3c0..395f27d45 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/AbstractHandle.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/AbstractHandle.java @@ -265,8 +265,8 @@ public abstract class AbstractHandle { checkOpen(); try { var arg = arguments.get(0); - if (binary && arg instanceof Number) { - var number = ((Number) arg).intValue(); + if (binary && arg instanceof Number n) { + var number = n.intValue(); writeSingle((byte) number); } else { channel.write(arguments.getBytesCoerced(0)); diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/TableImpl.java b/projects/core/src/main/java/dan200/computercraft/core/lua/TableImpl.java index d764db045..8c3fa6108 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/lua/TableImpl.java +++ b/projects/core/src/main/java/dan200/computercraft/core/lua/TableImpl.java @@ -58,8 +58,8 @@ class TableImpl implements dan200.computercraft.api.lua.LuaTable private LuaValue getImpl(Object o) { checkValid(); - if (o instanceof String) return table.rawget((String) o); - if (o instanceof Integer) return table.rawget((Integer) o); + if (o instanceof String s) return table.rawget(s); + if (o instanceof Integer i) return table.rawget(i); return Constants.NIL; } diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/VarargArguments.java b/projects/core/src/main/java/dan200/computercraft/core/lua/VarargArguments.java index ed75df732..45003276d 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/lua/VarargArguments.java +++ b/projects/core/src/main/java/dan200/computercraft/core/lua/VarargArguments.java @@ -181,8 +181,8 @@ final class VarargArguments implements IArguments { if (isClosed()) throw new IllegalStateException("Cannot use getTableUnsafe after IArguments has been closed."); var value = varargs.arg(index + 1); - if (!(value instanceof LuaTable)) throw LuaValues.badArgument(index, "table", value.typeName()); - return new TableImpl(this, (LuaTable) value); + if (!(value instanceof LuaTable table)) throw LuaValues.badArgument(index, "table", value.typeName()); + return new TableImpl(this, table); } @Override @@ -191,8 +191,8 @@ final class VarargArguments implements IArguments { var value = varargs.arg(index + 1); if (value.isNil()) return Optional.empty(); - if (!(value instanceof LuaTable)) throw LuaValues.badArgument(index, "table", value.typeName()); - return Optional.of(new TableImpl(this, (LuaTable) value)); + if (!(value instanceof LuaTable table)) throw LuaValues.badArgument(index, "table", value.typeName()); + return Optional.of(new TableImpl(this, table)); } @Override @@ -237,6 +237,7 @@ final class VarargArguments implements IArguments { return metatable != null && metatable.rawget(NAME) instanceof LuaString s ? s.toString() : null; } + @SuppressWarnings("ArrayRecordComponent") private record ArraySlice(T[] array, int offset) { // FIXME: We should be able to remove the @Nullables if we update NullAway. diff --git a/projects/core/src/test/java/dan200/computercraft/core/asm/MethodTest.java b/projects/core/src/test/java/dan200/computercraft/core/asm/MethodTest.java index 98326a587..9dc24ee3c 100644 --- a/projects/core/src/test/java/dan200/computercraft/core/asm/MethodTest.java +++ b/projects/core/src/test/java/dan200/computercraft/core/asm/MethodTest.java @@ -48,9 +48,10 @@ public class MethodTest { @Test public void testDynamicPeripheral() { ComputerBootstrap.run( - "local dynamic = peripheral.wrap('top')\n" + - "assert(dynamic.foo() == 123, 'foo: ' .. tostring(dynamic.foo()))\n" + - "assert(dynamic.bar() == 321, 'bar: ' .. tostring(dynamic.bar()))", + """ + local dynamic = peripheral.wrap('top') + assert(dynamic.foo() == 123, 'foo: ' .. tostring(dynamic.foo())) + assert(dynamic.bar() == 321, 'bar: ' .. tostring(dynamic.bar()))""", x -> x.getEnvironment().setPeripheral(ComputerSide.TOP, new Dynamic()), 50 ); @@ -66,9 +67,10 @@ public class MethodTest { @Test public void testPeripheralThrow() { ComputerBootstrap.run( - "local throw = peripheral.wrap('top')\n" + - "local _, err = pcall(function() throw.thisThread() end) assert(err == '/test.lua:2: !', (\"thisThread: %q\"):format(err))\n" + - "local _, err = pcall(function() throw.mainThread() end) assert(err == '/test.lua:3: !', (\"mainThread: %q\"):format(err))\n", + """ + local throw = peripheral.wrap('top') + local _, err = pcall(function() throw.thisThread() end) assert(err == '/test.lua:2: !', ("thisThread: %q"):format(err)) + local _, err = pcall(function() throw.mainThread() end) assert(err == '/test.lua:3: !', ("mainThread: %q"):format(err))""", x -> x.getEnvironment().setPeripheral(ComputerSide.TOP, new PeripheralThrow()), 50 ); @@ -77,8 +79,9 @@ public class MethodTest { @Test public void testMany() { ComputerBootstrap.run( - "assert(many.method_0)\n" + - "assert(many.method_39)", + """ + assert(many.method_0) + assert(many.method_39)""", x -> x.addApi(new ManyMethods()), 50); } @@ -94,8 +97,7 @@ public class MethodTest { public void testModule() { ComputerBootstrap.run( """ - assert(require "test.module".func() == 123) - """, + assert(require "test.module".func() == 123)""", x -> x.addApi(new IsModule()), 50); } diff --git a/projects/web/src/builder/java/cc/tweaked/web/builder/TransformingClassLoader.java b/projects/web/src/builder/java/cc/tweaked/web/builder/TransformingClassLoader.java index 0bd15b413..27e690e2b 100644 --- a/projects/web/src/builder/java/cc/tweaked/web/builder/TransformingClassLoader.java +++ b/projects/web/src/builder/java/cc/tweaked/web/builder/TransformingClassLoader.java @@ -168,6 +168,7 @@ public class TransformingClassLoader extends ClassLoader { } } + @SuppressWarnings("ArrayRecordComponent") private record TransformedClass(String name, byte[] contents) { } }