diff --git a/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts b/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts
index bdfa23a21..3138d0e76 100644
--- a/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts
+++ b/buildSrc/src/main/kotlin/cc-tweaked.java-convention.gradle.kts
@@ -84,7 +84,6 @@ sourceSets.all {
options.errorprone {
check("InvalidBlockTag", CheckSeverity.OFF) // Broken by @cc.xyz
- check("InvalidParam", CheckSeverity.OFF) // Broken by records.
check("InlineMeSuggester", CheckSeverity.OFF) // Minecraft uses @Deprecated liberally
// Too many false positives right now. Maybe we need an indirection for it later on.
check("ReferenceEquality", CheckSeverity.OFF)
diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
index c8a0ae25e..8321fa26c 100644
--- a/config/checkstyle/checkstyle.xml
+++ b/config/checkstyle/checkstyle.xml
@@ -92,7 +92,10 @@ SPDX-License-Identifier: MPL-2.0
-
+
+
+
+
@@ -143,7 +146,10 @@ SPDX-License-Identifier: MPL-2.0
-
+
+
+
+
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 40b2a7b5b..c64a3af7a 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -29,9 +29,9 @@ checkerFramework = "3.42.0"
cobalt = { strictly = "0.9.5" }
commonsCli = "1.6.0"
jetbrainsAnnotations = "24.1.0"
-jsr305 = "3.0.2"
+jspecify = "1.0.0"
jzlib = "1.1.3"
-kotlin = "2.1.0"
+kotlin = "2.1.10"
kotlin-coroutines = "1.10.1"
nightConfig = "3.8.1"
@@ -58,9 +58,9 @@ jmh = "1.37"
# Build tools
cctJavadoc = "1.8.3"
-checkstyle = "10.14.1"
-errorProne-core = "2.27.0"
-errorProne-plugin = "3.1.0"
+checkstyle = "10.21.2"
+errorProne-core = "2.36.0"
+errorProne-plugin = "4.1.0"
fabric-loom = "1.9.2"
githubRelease = "2.5.2"
gradleVersions = "0.50.0"
@@ -69,7 +69,7 @@ illuaminate = "0.1.0-74-gf1551d5"
lwjgl = "3.3.3"
minotaur = "2.8.7"
modDevGradle = "2.0.74"
-nullAway = "0.10.25"
+nullAway = "0.12.3"
shadow = "8.3.1"
spotless = "6.23.3"
taskTree = "2.1.1"
@@ -89,7 +89,7 @@ fastutil = { module = "it.unimi.dsi:fastutil", version.ref = "fastutil" }
forgeSpi = { module = "net.minecraftforge:forgespi", version.ref = "forgeSpi" }
guava = { module = "com.google.guava:guava", version.ref = "guava" }
jetbrainsAnnotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" }
-jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "jsr305" }
+jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" }
jzlib = { module = "com.jcraft:jzlib", version.ref = "jzlib" }
kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" }
kotlin-platform = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" }
@@ -178,7 +178,7 @@ taskTree = { id = "com.dorongold.task-tree", version.ref = "taskTree" }
versionCatalogUpdate = { id = "nl.littlerobots.version-catalog-update", version.ref = "versionCatalogUpdate" }
[bundles]
-annotations = ["jsr305", "checkerFramework", "jetbrainsAnnotations"]
+annotations = ["checkerFramework", "jetbrainsAnnotations", "jspecify"]
kotlin = ["kotlin-stdlib", "kotlin-coroutines"]
# Minecraft
diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java
index a453723a7..31c9b78fa 100644
--- a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java
+++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java
@@ -12,8 +12,8 @@ import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModellers.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModellers.java
index 1af04e61b..343a996f7 100644
--- a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModellers.java
+++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModellers.java
@@ -14,8 +14,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import org.joml.Matrix4f;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class TurtleUpgradeModellers {
private static final Transformation leftTransform = getMatrixFor(-0.4065f);
diff --git a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java
index 2f79ed05d..bb76e2cc2 100644
--- a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java
+++ b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java
@@ -11,8 +11,7 @@ import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@ApiStatus.Internal
public interface ClientPlatformHelper {
diff --git a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ComputerCraftAPIClientService.java b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ComputerCraftAPIClientService.java
index a56e0a044..fd6458e7c 100644
--- a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ComputerCraftAPIClientService.java
+++ b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ComputerCraftAPIClientService.java
@@ -10,8 +10,7 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
import dan200.computercraft.impl.Services;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Backing interface for {@link ComputerCraftAPIClient}
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java
index 1a75ae954..806a3d597 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java
@@ -26,8 +26,7 @@ import net.minecraft.core.Direction;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The static entry point to the ComputerCraft API.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java b/projects/common-api/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java
index c709b79f6..56fe0557c 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/detail/BasicItemDetailProvider.java
@@ -6,8 +6,8 @@ package dan200.computercraft.api.detail;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/detail/BlockReference.java b/projects/common-api/src/main/java/dan200/computercraft/api/detail/BlockReference.java
index fc6f25bf6..b58f2da7a 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/detail/BlockReference.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/detail/BlockReference.java
@@ -8,8 +8,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A reference to a block in the world, used by block detail providers.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/lua/IComputerSystem.java b/projects/common-api/src/main/java/dan200/computercraft/api/lua/IComputerSystem.java
index 8d6de36e6..610824eec 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/lua/IComputerSystem.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/lua/IComputerSystem.java
@@ -9,8 +9,7 @@ import dan200.computercraft.api.peripheral.IComputerAccess;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* An interface passed to {@link ILuaAPIFactory} in order to provide additional information
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/lua/ILuaAPIFactory.java b/projects/common-api/src/main/java/dan200/computercraft/api/lua/ILuaAPIFactory.java
index cb0f35500..b8abdfedc 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/lua/ILuaAPIFactory.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/lua/ILuaAPIFactory.java
@@ -5,8 +5,7 @@
package dan200.computercraft.api.lua;
import dan200.computercraft.api.ComputerCraftAPI;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Construct an {@link ILuaAPI} for a computer.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java b/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java
index 045698aaa..a3995e42a 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java
@@ -12,8 +12,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Represents an item that can be placed in a disk drive and used by a Computer.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/media/MediaProvider.java b/projects/common-api/src/main/java/dan200/computercraft/api/media/MediaProvider.java
index 6ffd306dd..02d7a3bb4 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/media/MediaProvider.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/media/MediaProvider.java
@@ -5,8 +5,7 @@
package dan200.computercraft.api.media;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* This interface is used to provide {@link IMedia} implementations for {@link ItemStack}.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/media/PrintoutContents.java b/projects/common-api/src/main/java/dan200/computercraft/api/media/PrintoutContents.java
index 2825d796c..8284cdd62 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/media/PrintoutContents.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/media/PrintoutContents.java
@@ -6,8 +6,8 @@ package dan200.computercraft.api.media;
import dan200.computercraft.impl.ComputerCraftAPIService;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.stream.Stream;
/**
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java
index e0d539a1d..d61ce5d35 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java
@@ -14,8 +14,8 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
/**
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java
index 2ee590466..af982fb99 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java
@@ -7,8 +7,7 @@ package dan200.computercraft.api.pocket;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.upgrades.UpgradeBase;
import net.minecraft.world.level.Level;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A peripheral which can be equipped to the back side of a pocket computer.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java
index 9565a6e2d..97e1a2d59 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java
@@ -17,8 +17,7 @@ import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The interface passed to turtle by turtles, providing methods that they can call.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java
index eb776306f..6e6ffaf26 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java
@@ -9,8 +9,8 @@ import dan200.computercraft.api.upgrades.UpgradeBase;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.Items;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.BiFunction;
/**
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java
index f048782b9..348e13b5b 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java
@@ -5,8 +5,7 @@
package dan200.computercraft.api.turtle;
import net.minecraft.core.Direction;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Used to indicate the result of executing a turtle command.
@@ -60,9 +59,9 @@ public final class TurtleCommandResult {
private final boolean success;
private final @Nullable String errorMessage;
- private final @Nullable Object[] results;
+ private final @Nullable Object @Nullable [] results;
- private TurtleCommandResult(boolean success, @Nullable String errorMessage, @Nullable Object[] results) {
+ private TurtleCommandResult(boolean success, @Nullable String errorMessage, @Nullable Object @Nullable [] results) {
this.success = success;
this.errorMessage = errorMessage;
this.results = results;
@@ -92,8 +91,7 @@ public final class TurtleCommandResult {
*
* @return The command's result, or {@code null} if it was a failure.
*/
- @Nullable
- public Object[] getResults() {
+ public @Nullable Object @Nullable [] getResults() {
return results;
}
}
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeDataProvider.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeDataProvider.java
index 84753db98..2193d09d1 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeDataProvider.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeDataProvider.java
@@ -18,8 +18,8 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Consumer;
/**
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeData.java b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeData.java
index 27dd914f2..f4038fba5 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeData.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeData.java
@@ -9,8 +9,7 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Contract;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* An upgrade (i.e. a {@link ITurtleUpgrade}) and its current upgrade data.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeDataProvider.java b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeDataProvider.java
index 2d691ebeb..a62f21f9f 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeDataProvider.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeDataProvider.java
@@ -19,8 +19,8 @@ import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
diff --git a/projects/common-api/src/main/java/dan200/computercraft/impl/ComputerCraftAPIService.java b/projects/common-api/src/main/java/dan200/computercraft/impl/ComputerCraftAPIService.java
index 6dbf08f0c..f4263e6af 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/impl/ComputerCraftAPIService.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/impl/ComputerCraftAPIService.java
@@ -28,8 +28,7 @@ import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Backing interface for {@link ComputerCraftAPI}
diff --git a/projects/common-api/src/main/java/dan200/computercraft/impl/PlatformHelper.java b/projects/common-api/src/main/java/dan200/computercraft/impl/PlatformHelper.java
index a7ab333d4..7c951a786 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/impl/PlatformHelper.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/impl/PlatformHelper.java
@@ -12,8 +12,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.ApiStatus;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Abstraction layer for Forge and Fabric. See implementations for more details.
diff --git a/projects/common-api/src/main/java/dan200/computercraft/impl/ServiceException.java b/projects/common-api/src/main/java/dan200/computercraft/impl/ServiceException.java
index 81f45a6ee..766eddbb8 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/impl/ServiceException.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/impl/ServiceException.java
@@ -5,8 +5,8 @@
package dan200.computercraft.impl;
import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.Serial;
/**
diff --git a/projects/common-api/src/main/java/dan200/computercraft/impl/Services.java b/projects/common-api/src/main/java/dan200/computercraft/impl/Services.java
index 10f9c1a1d..45c1d8a0f 100644
--- a/projects/common-api/src/main/java/dan200/computercraft/impl/Services.java
+++ b/projects/common-api/src/main/java/dan200/computercraft/impl/Services.java
@@ -5,8 +5,8 @@
package dan200.computercraft.impl;
import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ServiceLoader;
import java.util.stream.Collectors;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java b/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java
index 3ecd0bdc6..647057d26 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java
@@ -38,8 +38,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Consumer;
/**
diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java
index b1560568c..9fe909ee9 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java
@@ -46,8 +46,8 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.function.BiConsumer;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientTableFormatter.java b/projects/common/src/client/java/dan200/computercraft/client/ClientTableFormatter.java
index fe6263b51..e62037e0a 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/ClientTableFormatter.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/ClientTableFormatter.java
@@ -15,8 +15,8 @@ import net.minecraft.client.gui.components.ChatComponent;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Mth;
import org.apache.commons.lang3.StringUtils;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
/**
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/AbstractComputerScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/AbstractComputerScreen.java
index c25c0d059..d58e19d2a 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/AbstractComputerScreen.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/AbstractComputerScreen.java
@@ -26,11 +26,11 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java b/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java
index 8e2627a74..bf5c57867 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java
@@ -11,8 +11,8 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.resources.TextureAtlasHolder;
import net.minecraft.resources.ResourceLocation;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
import java.util.stream.Stream;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/NoTermComputerScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/NoTermComputerScreen.java
index 71a3609ad..6493d3c74 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/NoTermComputerScreen.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/NoTermComputerScreen.java
@@ -15,9 +15,9 @@ import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.MenuAccess;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
+import org.jspecify.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
-import javax.annotation.Nullable;
import java.util.Objects;
import static dan200.computercraft.core.util.Nullability.assertNonNull;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java
index 1dae0bcea..057f149d5 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java
@@ -12,8 +12,8 @@ import net.minecraft.client.gui.components.MultiLineLabel;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import static dan200.computercraft.core.util.Nullability.assertNonNull;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java
index 626ee07d0..701a2dbf0 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java
@@ -149,6 +149,7 @@ public final class PrintoutScreen extends AbstractContainerScreen
// Skip rendering labels.
}
+ @SuppressWarnings("ArrayRecordComponent")
record PrintoutInfo(int pages, boolean book, TextBuffer[] text, TextBuffer[] colour) {
public static final PrintoutInfo DEFAULT;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java b/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java
index 2434e277d..ab85aa492 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java
@@ -12,8 +12,8 @@ import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.network.chat.Component;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Supplier;
/**
diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java
index c512f0c0d..6132d0242 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java
@@ -13,8 +13,8 @@ import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction;
import org.joml.Matrix4f;
import org.joml.Vector4f;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java
index fec6d4d7d..d898020e2 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java
@@ -20,8 +20,8 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java
index ca3d9f9e7..3ff0a3692 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java
@@ -26,8 +26,8 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.UUID;
/**
diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java
index 4200f9545..43d1681d0 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java
@@ -13,8 +13,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ServerGamePacketListener;
import net.minecraft.sounds.SoundEvent;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public interface ClientPlatformHelper extends dan200.computercraft.impl.client.ClientPlatformHelper {
static ClientPlatformHelper get() {
@@ -39,7 +38,7 @@ public interface ClientPlatformHelper extends dan200.computercraft.impl.client.C
* @param overlayLight The current overlay light.
* @param tints Block colour tints to apply to the model.
*/
- void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints);
+ void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints);
/**
* Play a record at a particular position.
diff --git a/projects/common/src/client/java/dan200/computercraft/client/pocket/ClientPocketComputers.java b/projects/common/src/client/java/dan200/computercraft/client/pocket/ClientPocketComputers.java
index 2d4eef3c7..252f3c5e9 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/pocket/ClientPocketComputers.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/pocket/ClientPocketComputers.java
@@ -10,8 +10,8 @@ import dan200.computercraft.shared.computer.terminal.TerminalState;
import dan200.computercraft.shared.network.client.PocketComputerDataMessage;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/pocket/PocketComputerData.java b/projects/common/src/client/java/dan200/computercraft/client/pocket/PocketComputerData.java
index d2e5125ef..c12913c78 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/pocket/PocketComputerData.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/pocket/PocketComputerData.java
@@ -8,8 +8,7 @@ import dan200.computercraft.shared.computer.core.ComputerState;
import dan200.computercraft.shared.computer.terminal.NetworkedTerminal;
import dan200.computercraft.shared.computer.terminal.TerminalState;
import dan200.computercraft.shared.pocket.core.PocketServerComputer;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Clientside data about a pocket computer.
diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java
index f054f3f40..9db294f0c 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java
@@ -14,8 +14,8 @@ import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.item.ItemStack;
import org.joml.Vector4f;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
/**
@@ -39,7 +39,7 @@ public final class ModelRenderer {
* @param overlayLight The current overlay light.
* @param tints Block colour tints to apply to the model.
*/
- public static void renderQuads(PoseStack transform, VertexConsumer buffer, List quads, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
+ public static void renderQuads(PoseStack transform, VertexConsumer buffer, List quads, int lightmapCoord, int overlayLight, int @Nullable [] tints) {
var matrix = transform.last();
var inverted = matrix.pose().determinant() < 0;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java b/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java
index 3a701e4ed..327038690 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java
@@ -16,8 +16,8 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceProvider;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.util.Objects;
import java.util.function.BiConsumer;
diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java
index caf56621e..48a1e9895 100644
--- a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java
+++ b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java
@@ -23,8 +23,7 @@ import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class TurtleBlockEntityRenderer implements BlockEntityRenderer {
private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour");
@@ -127,7 +126,7 @@ public class TurtleBlockEntityRenderer implements BlockEntityRenderer
diff --git a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/NodeSet.java b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/NodeSet.java
index 9d3f0808e..87994d1e8 100644
--- a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/NodeSet.java
+++ b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/NodeSet.java
@@ -5,8 +5,8 @@
package dan200.computercraft.impl.network.wired;
import dan200.computercraft.api.network.wired.WiredNode;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNodeImpl.java b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNodeImpl.java
index ec9d6015e..c79b82ead 100644
--- a/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNodeImpl.java
+++ b/projects/common/src/main/java/dan200/computercraft/impl/network/wired/WiredNodeImpl.java
@@ -11,8 +11,8 @@ import dan200.computercraft.api.network.wired.WiredNetwork;
import dan200.computercraft.api.network.wired.WiredNode;
import dan200.computercraft.api.network.wired.WiredSender;
import dan200.computercraft.api.peripheral.IPeripheral;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java b/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java
index b3c01c791..c35d17e50 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java
@@ -30,8 +30,8 @@ import net.minecraft.world.level.storage.loot.BuiltInLootTables;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.entries.LootTableReference;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Set;
import java.util.function.BiConsumer;
@@ -101,7 +101,7 @@ public final class CommonHooks {
BuiltInLootTables.VILLAGE_CARTOGRAPHER
);
- public static @Nullable LootPool.Builder getExtraLootPool(ResourceLocation lootTable) {
+ public static LootPool.@Nullable Builder getExtraLootPool(ResourceLocation lootTable) {
if (!lootTable.getNamespace().equals("minecraft") || !TREASURE_DISK_LOOT_TABLES.contains(lootTable)) {
return null;
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java b/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java
index 4889f20f2..4fff85dd4 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java
@@ -34,8 +34,8 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.File;
import java.util.*;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ComputerSelector.java b/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ComputerSelector.java
index 7d1668b76..298aecc7c 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ComputerSelector.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ComputerSelector.java
@@ -22,8 +22,8 @@ import net.minecraft.network.chat.ComponentContents;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
@@ -43,11 +43,11 @@ public record ComputerSelector(
@Nullable String label,
@Nullable ComputerFamily family,
@Nullable AABB bounds,
- @Nullable MinMaxBounds.Doubles range
+ MinMaxBounds.@Nullable Doubles range
) {
private static final ComputerSelector all = new ComputerSelector("@c[]", OptionalInt.empty(), null, OptionalInt.empty(), null, null, null, null);
- private static UuidArgument uuidArgument = UuidArgument.uuid();
+ private static final UuidArgument uuidArgument = UuidArgument.uuid();
/**
* A {@link ComputerSelector} which matches all computers.
@@ -279,7 +279,7 @@ public record ComputerSelector(
private @Nullable String label;
private @Nullable ComputerFamily family;
private @Nullable AABB bounds;
- private @Nullable MinMaxBounds.Doubles range;
+ private MinMaxBounds.@Nullable Doubles range;
}
private static final Map options;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java b/projects/common/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java
index 02401973e..5f9372b71 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java
@@ -12,8 +12,8 @@ import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.tree.CommandNode;
import dan200.computercraft.shared.command.arguments.RepeatArgumentType;
import net.minecraft.commands.CommandSourceStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
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 1edf06554..de3ef8f18 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
@@ -14,8 +14,8 @@ import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.Component;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java
index 1c9a910f3..d44a37fb9 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java
@@ -12,8 +12,7 @@ import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Various helpers for building chat messages.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java
index bd50c7ae3..af2e3e4ed 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java
@@ -7,8 +7,7 @@ package dan200.computercraft.shared.command.text;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component;
import org.apache.commons.lang3.StringUtils;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class ServerTableFormatter implements TableFormatter {
private final CommandSourceStack source;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java b/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java
index dbf719d12..8b3a5f2e2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java
@@ -11,15 +11,15 @@ import dan200.computercraft.shared.network.server.ServerNetworking;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class TableBuilder {
private final String id;
private int columns = -1;
- private final @Nullable Component[] headers;
+ private final Component @Nullable [] headers;
private final ArrayList rows = new ArrayList<>();
private int additional;
@@ -72,8 +72,7 @@ public class TableBuilder {
return columns;
}
- @Nullable
- public Component[] getHeaders() {
+ public Component @Nullable [] getHeaders() {
return headers;
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java b/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java
index d5a5c9306..d6f5ee145 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java
@@ -7,8 +7,7 @@ package dan200.computercraft.shared.command.text;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import org.apache.commons.lang3.StringUtils;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.command.text.ChatHelpers.coloured;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java
index ab8b4965b..77f39ea44 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java
@@ -23,8 +23,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.phys.BlockHitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A block which has a container and can be placed in a horizontal direction.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java
index 4e093af11..4bfdb694d 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java
@@ -36,8 +36,8 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
public abstract class AbstractComputerBlock extends HorizontalDirectionalBlock implements IBundledRedstoneBlock, EntityBlock {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java
index cd7609460..09cea96ed 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java
@@ -34,8 +34,8 @@ import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
import java.util.UUID;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlock.java
index 44a3e85f4..31be162b8 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlock.java
@@ -17,8 +17,7 @@ import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class ComputerBlock extends AbstractComputerBlock {
public static final EnumProperty STATE = EnumProperty.create("state", ComputerState.class);
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlockEntity.java
index ab6f90e7b..68d529725 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerBlockEntity.java
@@ -20,8 +20,7 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class ComputerBlockEntity extends AbstractComputerBlockEntity {
private @Nullable IPeripheral peripheral;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerPeripheral.java
index 44db65e9f..4d4eb7528 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/ComputerPeripheral.java
@@ -7,8 +7,7 @@ package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.OSAPI;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A computer or turtle wrapped as a peripheral.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java
index 7302fcccc..30b2ff5a7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java
@@ -13,8 +13,8 @@ import dan200.computercraft.core.apis.IAPIEnvironment;
import dan200.computercraft.core.computer.ApiLifecycle;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java
index 5582c2f58..c3f9c9bae 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java
@@ -29,8 +29,8 @@ import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@@ -214,7 +214,7 @@ public class ServerComputer implements ComputerEnvironment, ComputerEvents.Recei
}
@Override
- public final void queueEvent(String event, @Nullable Object[] arguments) {
+ public final void queueEvent(String event, @Nullable Object @Nullable [] arguments) {
computer.queueEvent(event, arguments);
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputerRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputerRegistry.java
index 326562c7a..14baa5b5d 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputerRegistry.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputerRegistry.java
@@ -6,8 +6,8 @@ package dan200.computercraft.shared.computer.core;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
public class ServerComputerRegistry {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerContext.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerContext.java
index 3131c667a..169b46527 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerContext.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerContext.java
@@ -26,10 +26,10 @@ import dan200.computercraft.shared.util.IDAssigner;
import net.minecraft.SharedConstants;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.storage.LevelResource;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.Objects;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/inventory/AbstractComputerMenu.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/inventory/AbstractComputerMenu.java
index 5f8197dce..0567e67e1 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/inventory/AbstractComputerMenu.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/inventory/AbstractComputerMenu.java
@@ -21,8 +21,8 @@ import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.SimpleContainerData;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Predicate;
public abstract class AbstractComputerMenu extends AbstractContainerMenu implements ComputerMenu {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java
index f9499e7dc..cdffc644b 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java
@@ -16,8 +16,8 @@ import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
public abstract class AbstractComputerItem extends BlockItem implements IComputerItem, IMedia {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/CommandComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/CommandComputerItem.java
index 062bef8ad..f8ce2ff76 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/CommandComputerItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/CommandComputerItem.java
@@ -10,7 +10,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.block.state.BlockState;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link ComputerItem} which prevents players placing it without permission.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/ComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/ComputerItem.java
index 56170e454..0541daa3a 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/ComputerItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/ComputerItem.java
@@ -8,8 +8,7 @@ import dan200.computercraft.shared.computer.blocks.ComputerBlock;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class ComputerItem extends AbstractComputerItem {
public ComputerItem(ComputerBlock> block, Properties settings) {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java
index 03bcb762e..e0253b31f 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java
@@ -6,8 +6,7 @@ package dan200.computercraft.shared.computer.items;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public interface IComputerItem {
String NBT_ID = "ComputerId";
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java
index 7a70e76f9..4bfeeba2c 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/menu/ServerInputState.java
@@ -19,10 +19,10 @@ import it.unimi.dsi.fastutil.ints.IntSet;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.inventory.AbstractContainerMenu;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.UUID;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/ComputerMBean.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/ComputerMBean.java
index 0da446e75..7b03d161e 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/ComputerMBean.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/ComputerMBean.java
@@ -14,10 +14,10 @@ import dan200.computercraft.shared.computer.metrics.basic.AggregatedMetric;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.server.MinecraftServer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import javax.management.*;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/BasicComputerMetricsObserver.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/BasicComputerMetricsObserver.java
index 90eefbb64..78beaa60c 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/BasicComputerMetricsObserver.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/BasicComputerMetricsObserver.java
@@ -5,12 +5,12 @@
package dan200.computercraft.shared.computer.metrics.basic;
import com.google.common.collect.MapMaker;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.core.metrics.Metric;
import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.computer.metrics.ComputerMetricsObserver;
import dan200.computercraft.shared.computer.metrics.GlobalMetrics;
-import javax.annotation.concurrent.GuardedBy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/ComputerMetrics.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/ComputerMetrics.java
index 91d63d58e..1ff2b0c2c 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/ComputerMetrics.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/metrics/basic/ComputerMetrics.java
@@ -6,8 +6,8 @@ package dan200.computercraft.shared.computer.metrics.basic;
import dan200.computercraft.core.metrics.Metric;
import dan200.computercraft.shared.computer.core.ServerComputer;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.util.Arrays;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/terminal/TerminalState.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/terminal/TerminalState.java
index e756108e7..c0c6335ad 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/terminal/TerminalState.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/terminal/TerminalState.java
@@ -6,8 +6,7 @@ package dan200.computercraft.shared.computer.terminal;
import net.minecraft.network.FriendlyByteBuf;
import org.jetbrains.annotations.Contract;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A snapshot of a terminal's state.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/upload/FileUpload.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/upload/FileUpload.java
index e1d371b99..4648b8161 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/computer/upload/FileUpload.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/upload/FileUpload.java
@@ -4,10 +4,10 @@
package dan200.computercraft.shared.computer.upload;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -52,8 +52,7 @@ public class FileUpload {
return digest != null && Arrays.equals(checksum, digest);
}
- @Nullable
- public static byte[] getDigest(ByteBuffer bytes) {
+ public static byte @Nullable [] getDigest(ByteBuffer bytes) {
try {
var digest = MessageDigest.getInstance("SHA-256");
digest.update(bytes.duplicate());
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigFile.java b/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigFile.java
index 7dc998520..f3f106754 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigFile.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigFile.java
@@ -5,9 +5,9 @@
package dan200.computercraft.shared.config;
import com.google.common.base.Splitter;
+import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
-import javax.annotation.OverridingMethodsMustInvokeSuper;
import java.nio.file.Path;
import java.util.*;
import java.util.function.Predicate;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigSpec.java b/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigSpec.java
index 201dcb635..9598f3974 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigSpec.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/config/ConfigSpec.java
@@ -16,8 +16,8 @@ import dan200.computercraft.shared.platform.PlatformHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.filter.MarkerFilter;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.TimeUnit;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/config/ProxyPasswordConfig.java b/projects/common/src/main/java/dan200/computercraft/shared/config/ProxyPasswordConfig.java
index 3c45f64f4..feacea5ed 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/config/ProxyPasswordConfig.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/config/ProxyPasswordConfig.java
@@ -5,10 +5,10 @@
package dan200.computercraft.shared.config;
import dan200.computercraft.core.CoreConfig;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicWorldlyContainer.java b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicWorldlyContainer.java
index b2e92bd79..a1dc1212c 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicWorldlyContainer.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicWorldlyContainer.java
@@ -7,8 +7,7 @@ package dan200.computercraft.shared.container;
import net.minecraft.core.Direction;
import net.minecraft.world.WorldlyContainer;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A basic implementation of {@link WorldlyContainer} which operates on a {@linkplain #getContents() list of stacks}.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java b/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java
index d29249773..794a337d8 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java
@@ -13,8 +13,8 @@ import net.minecraft.network.chat.Component;
import net.minecraft.world.item.EnchantedBookItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/PermissionRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/PermissionRegistry.java
index cb700c05f..9ba20f60a 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/integration/PermissionRegistry.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/PermissionRegistry.java
@@ -4,13 +4,13 @@
package dan200.computercraft.shared.integration;
+import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
import com.mojang.brigadier.builder.ArgumentBuilder;
import dan200.computercraft.shared.command.CommandComputerCraft;
import dan200.computercraft.shared.command.UserLevel;
import dan200.computercraft.shared.platform.RegistrationHelper;
import net.minecraft.commands.CommandSourceStack;
-import javax.annotation.OverridingMethodsMustInvokeSuper;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.function.Predicate;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java
index 95a7700d9..809dd5dce 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/UpgradeRecipeGenerator.java
@@ -22,8 +22,8 @@ import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.ShapedRecipe;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.function.Function;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/lectern/CustomLecternBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/lectern/CustomLecternBlock.java
index 862c12800..11946fcda 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/lectern/CustomLecternBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/lectern/CustomLecternBlock.java
@@ -28,7 +28,7 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Extends {@link LecternBlock} with support for {@linkplain PrintoutItem printouts}.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java
index 0b38fa8fe..01e1a4b0e 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java
@@ -22,8 +22,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
public class DiskItem extends Item implements IMedia, IColouredItem {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/PrintoutItem.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/PrintoutItem.java
index 6e9421933..7c8fbf0b2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/PrintoutItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/PrintoutItem.java
@@ -19,8 +19,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
public class PrintoutItem extends Item {
@@ -68,7 +68,7 @@ public class PrintoutItem extends Item {
return new InteractionResultHolder<>(InteractionResult.sidedSuccess(world.isClientSide), stack);
}
- private ItemStack createFromTitleAndText(@Nullable String title, @Nullable String[] text, @Nullable String[] colours) {
+ private ItemStack createFromTitleAndText(@Nullable String title, String @Nullable [] text, String @Nullable [] colours) {
var stack = new ItemStack(this);
// Build NBT
@@ -91,15 +91,15 @@ public class PrintoutItem extends Item {
return stack;
}
- public static ItemStack createSingleFromTitleAndText(@Nullable String title, @Nullable String[] text, @Nullable String[] colours) {
+ public static ItemStack createSingleFromTitleAndText(@Nullable String title, String @Nullable [] text, String @Nullable [] colours) {
return ModRegistry.Items.PRINTED_PAGE.get().createFromTitleAndText(title, text, colours);
}
- public static ItemStack createMultipleFromTitleAndText(@Nullable String title, @Nullable String[] text, @Nullable String[] colours) {
+ public static ItemStack createMultipleFromTitleAndText(@Nullable String title, String @Nullable [] text, String @Nullable [] colours) {
return ModRegistry.Items.PRINTED_PAGES.get().createFromTitleAndText(title, text, colours);
}
- public static ItemStack createBookFromTitleAndText(@Nullable String title, @Nullable String[] text, @Nullable String[] colours) {
+ public static ItemStack createBookFromTitleAndText(@Nullable String title, String @Nullable [] text, String @Nullable [] colours) {
return ModRegistry.Items.PRINTED_BOOK.get().createFromTitleAndText(title, text, colours);
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java
index 8442d7d17..658a7977d 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java
@@ -8,8 +8,7 @@ import dan200.computercraft.api.media.IMedia;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.RecordItem;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* An implementation of {@link IMedia} for {@link RecordItem}.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java
index f5fab821a..dc6e49c30 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java
@@ -20,8 +20,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.util.List;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java
index d5822536d..f8c3e055b 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java
@@ -14,8 +14,8 @@ import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.UUID;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java
index 97f7c73cd..2be9dd233 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java
@@ -10,8 +10,7 @@ import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.NetworkMessages;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class MonitorClientMessage implements NetworkMessage {
private final BlockPos pos;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java
index c5580ae48..d608ae841 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java
@@ -11,8 +11,7 @@ import dan200.computercraft.shared.peripheral.diskdrive.DiskDriveBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.sounds.SoundEvent;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Starts or stops a record on the client, depending on if {@link #soundEvent} is {@code null}.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java
index 0f0ac70c3..e3b67acd6 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java
@@ -11,8 +11,8 @@ import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.NetworkMessages;
import dan200.computercraft.shared.pocket.core.PocketServerComputer;
import net.minecraft.network.FriendlyByteBuf;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.UUID;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java
index ec2b8e192..988d1db9e 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java
@@ -12,8 +12,7 @@ import dan200.computercraft.shared.network.NetworkMessages;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.world.inventory.AbstractContainerMenu;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class UploadResultMessage implements NetworkMessage {
private final int containerId;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java
index 0abd197f6..c039f0f00 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java
@@ -4,14 +4,13 @@
package dan200.computercraft.shared.network.server;
+import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
import dan200.computercraft.shared.computer.menu.ComputerMenu;
import dan200.computercraft.shared.network.NetworkMessage;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
-import javax.annotation.OverridingMethodsMustInvokeSuper;
-
/**
* A packet, which performs an action on the currently open {@link ComputerMenu}.
*/
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
index d96ec0a81..9c9cf724d 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
@@ -14,8 +14,8 @@ import dan200.computercraft.shared.network.NetworkMessages;
import io.netty.handler.codec.DecoderException;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.inventory.AbstractContainerMenu;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java
index e35080a48..143427420 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java
@@ -8,8 +8,7 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.computer.apis.CommandAPI;
import net.minecraft.world.level.block.entity.CommandBlockEntity;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* This peripheral allows you to interact with command blocks.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlock.java
index 2edca1700..bc550ec2f 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlock.java
@@ -22,8 +22,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class DiskDriveBlock extends HorizontalContainerBlock {
public static final EnumProperty STATE = EnumProperty.create("state", DiskDriveState.class);
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java
index bcd006c74..4e3dad922 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java
@@ -26,8 +26,8 @@ import net.minecraft.world.level.block.LevelEvent;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java
index d103baf96..6bd3961c2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java
@@ -10,8 +10,8 @@ import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.util.StringUtil;
import dan200.computercraft.shared.media.items.DiskItem;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Optional;
/**
@@ -60,9 +60,8 @@ public class DiskDrivePeripheral implements IPeripheral {
* @return The label of the disk, or {@code nil} if either no disk is inserted or the disk doesn't have a label.
* @cc.treturn string|nil The label of the disk, or {@code nil} if either no disk is inserted or the disk doesn't have a label.
*/
- @Nullable
@LuaFunction
- public final Object[] getDiskLabel() {
+ public final @Nullable Object @Nullable [] getDiskLabel() {
var media = diskDrive.getMedia();
return media.media() == null ? null : new Object[]{ media.media().getLabel(media.stack()) };
}
@@ -166,9 +165,8 @@ public class DiskDrivePeripheral implements IPeripheral {
* @cc.treturn number|nil The ID of the disk in the drive, or {@code nil} if no disk with an ID is inserted.
* @cc.since 1.4
*/
- @Nullable
@LuaFunction
- public final Object[] getDiskID() {
+ public final @Nullable Object @Nullable [] getDiskID() {
var disk = diskDrive.getMedia().stack();
return disk.getItem() instanceof DiskItem ? new Object[]{ DiskItem.getDiskID(disk) } : null;
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java
index dc56eabcc..7a1390bc1 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java
@@ -8,8 +8,7 @@ import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.impl.MediaProviders;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* An immutable snapshot of the current disk. This allows us to read the stack in a thread-safe manner.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/ComponentLookup.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/ComponentLookup.java
index 082391e14..6a86ca2c2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/ComponentLookup.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/ComponentLookup.java
@@ -9,8 +9,7 @@ import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Extract some component (for instance a capability on Forge, or a {@code BlockApiLookup} on Fabric) from a block and
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java
index ee4f1f299..567a3df9d 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java
@@ -14,8 +14,8 @@ import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.computer.GuardedLuaContext;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.entity.BlockEntity;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.Set;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralBuilder.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralBuilder.java
index 67d2ea8c4..f5759e084 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralBuilder.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralBuilder.java
@@ -11,10 +11,10 @@ import dan200.computercraft.core.methods.PeripheralMethod;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java
index 0bdce7984..aa8066b2a 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java
@@ -13,8 +13,8 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java
index 78fd2d934..125fff0b7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java
@@ -11,8 +11,8 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.GenericPeripheral;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.PeripheralType;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
import java.util.Optional;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java
index 7977ed342..58f7fb0aa 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java
@@ -13,8 +13,8 @@ import dan200.computercraft.api.network.PacketReceiver;
import dan200.computercraft.api.network.PacketSender;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Set;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemState.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemState.java
index d1e9031b1..816b5a0f8 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemState.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemState.java
@@ -7,8 +7,8 @@ package dan200.computercraft.shared.peripheral.modem;
import dan200.computercraft.api.lua.LuaException;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean;
public class ModemState {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java
index 0d068b58f..e1f7d0f44 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlock.java
@@ -35,8 +35,8 @@ import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.EnumMap;
import static dan200.computercraft.shared.util.WaterloggableHelpers.WATERLOGGED;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockEntity.java
index 5e619d361..7b17ab0a2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockEntity.java
@@ -24,8 +24,8 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
public class CableBlockEntity extends BlockEntity {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockItem.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockItem.java
index 7149f01ee..9e96f6069 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableBlockItem.java
@@ -14,8 +14,7 @@ import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.peripheral.modem.wired.CableBlock.*;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java
index e27749b0e..31a506e77 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java
@@ -6,8 +6,7 @@ package dan200.computercraft.shared.peripheral.modem.wired;
import net.minecraft.core.Direction;
import net.minecraft.util.StringRepresentable;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public enum CableModemVariant implements StringRepresentable {
None("none", null, false, false),
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlock.java
index 6f9e0b958..141a2aca7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlock.java
@@ -23,8 +23,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.phys.BlockHitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class WiredModemFullBlock extends Block implements EntityBlock {
public static final BooleanProperty MODEM_ON = BooleanProperty.create("modem");
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlockEntity.java
index 288b0e1cd..faef2be68 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemFullBlockEntity.java
@@ -24,8 +24,8 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import static dan200.computercraft.shared.peripheral.modem.wired.WiredModemFullBlock.MODEM_ON;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java
index 3893b4ac4..965a4cc63 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java
@@ -14,8 +14,8 @@ import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
import static dan200.computercraft.core.util.Nullability.assertNonNull;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java
index ce1374b27..b47f4cbcc 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java
@@ -24,10 +24,10 @@ import dan200.computercraft.shared.peripheral.modem.ModemState;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -130,7 +130,7 @@ public abstract class WiredModemPeripheral extends ModemPeripheral implements Wi
* @see PeripheralAPI#getType
*/
@LuaFunction
- public final @Nullable Object[] getTypeRemote(IComputerAccess computer, String name) {
+ public final Object @Nullable [] getTypeRemote(IComputerAccess computer, String name) {
var wrapper = getWrapper(computer, name);
return wrapper == null ? null : LuaUtil.consArray(wrapper.getType(), wrapper.getAdditionalTypes());
}
@@ -150,7 +150,7 @@ public abstract class WiredModemPeripheral extends ModemPeripheral implements Wi
* @see PeripheralAPI#getType
*/
@LuaFunction
- public final @Nullable Object[] hasTypeRemote(IComputerAccess computer, String name, String type) {
+ public final Object @Nullable [] hasTypeRemote(IComputerAccess computer, String name, String type) {
var wrapper = getWrapper(computer, name);
return wrapper == null ? null : new Object[]{ wrapper.getType().equals(type) || wrapper.getAdditionalTypes().contains(type) };
}
@@ -168,7 +168,7 @@ public abstract class WiredModemPeripheral extends ModemPeripheral implements Wi
* @see PeripheralAPI#getMethods
*/
@LuaFunction
- public final @Nullable Object[] getMethodsRemote(IComputerAccess computer, String name) {
+ public final Object @Nullable [] getMethodsRemote(IComputerAccess computer, String name) {
var wrapper = getWrapper(computer, name);
if (wrapper == null) return null;
@@ -215,7 +215,7 @@ public abstract class WiredModemPeripheral extends ModemPeripheral implements Wi
* @cc.since 1.80pr1.7
*/
@LuaFunction
- public final @Nullable Object[] getNameLocal() {
+ public final Object @Nullable [] getNameLocal() {
var local = localPeripheral.getConnectedName();
return local == null ? null : new Object[]{ local };
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java
index 391dbd785..7881773b3 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemBlock.java
@@ -24,8 +24,7 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.util.WaterloggableHelpers.WATERLOGGED;
import static dan200.computercraft.shared.util.WaterloggableHelpers.getFluidStateForPlacement;
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 10fe36371..e5b895110 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
@@ -15,8 +15,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class WirelessModemBlockEntity extends BlockEntity {
private static class Peripheral extends WirelessModemPeripheral {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java
index 850379096..ee2982efb 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java
@@ -7,8 +7,8 @@ package dan200.computercraft.shared.peripheral.monitor;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.computer.terminal.NetworkedTerminal;
import dan200.computercraft.shared.computer.terminal.TerminalState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Supplier;
public final class ClientMonitor {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlock.java
index 41d0b6182..f352948f3 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlock.java
@@ -29,8 +29,7 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class MonitorBlock extends HorizontalDirectionalBlock implements EntityBlock {
public static final DirectionProperty ORIENTATION = DirectionProperty.create("orientation",
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java
index ae4a434b0..6df370e21 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java
@@ -23,10 +23,10 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.function.Consumer;
public class MonitorBlockEntity extends BlockEntity {
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 c07bfb41e..2c1cf681e 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
@@ -11,8 +11,7 @@ import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.TermMethods;
import dan200.computercraft.core.terminal.Terminal;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Monitors are a block which act as a terminal, displaying information on one side. This allows them to be read and
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorState.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorState.java
index ff8e4b406..7ec271ae6 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorState.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorState.java
@@ -4,7 +4,7 @@
package dan200.computercraft.shared.peripheral.monitor;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class MonitorState {
public static final MonitorState UNLOADED = new MonitorState(State.UNLOADED, null);
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 2317f9da9..48c44e024 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
@@ -11,8 +11,8 @@ import dan200.computercraft.shared.network.server.ServerNetworking;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.chunk.LevelChunk;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayDeque;
import java.util.Queue;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ServerMonitor.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ServerMonitor.java
index b7d43b8db..16aaf5cec 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ServerMonitor.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/ServerMonitor.java
@@ -8,8 +8,8 @@ import com.google.common.annotations.VisibleForTesting;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.computer.terminal.NetworkedTerminal;
import dan200.computercraft.shared.util.TickScheduler;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean;
public class ServerMonitor {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlock.java
index b0bede7cf..698354fa1 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlock.java
@@ -13,8 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class PrinterBlock extends HorizontalContainerBlock {
public static final BooleanProperty TOP = BooleanProperty.create("top");
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlockEntity.java
index a593e6836..c6fcc8efc 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterBlockEntity.java
@@ -21,8 +21,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class PrinterBlockEntity extends AbstractContainerBlockEntity implements BasicWorldlyContainer {
private static final String NBT_PRINTING = "Printing";
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java
index 60943702e..c831bb705 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/printer/PrinterPeripheral.java
@@ -10,8 +10,8 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.core.util.StringUtil;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Optional;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java
index 61146ee09..5ec209c7b 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java
@@ -18,7 +18,6 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
-import javax.annotation.Nonnull;
/**
* The block for redstone relays. This mostly just forwards method calls to the {@linkplain RedstoneRelayBlockEntity
@@ -50,13 +49,13 @@ public final class RedstoneRelayBlock extends HorizontalDirectionalBlock impleme
@Override
@Deprecated
- public boolean isSignalSource(@Nonnull BlockState state) {
+ public boolean isSignalSource(BlockState state) {
return true;
}
@Override
@Deprecated
- public int getDirectSignal(@Nonnull BlockState state, BlockGetter level, @Nonnull BlockPos pos, @Nonnull Direction incomingSide) {
+ public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction incomingSide) {
return level.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay ? relay.getRedstoneOutput(incomingSide.getOpposite()) : 0;
}
@@ -73,7 +72,7 @@ public final class RedstoneRelayBlock extends HorizontalDirectionalBlock impleme
@Override
@Deprecated
- public void neighborChanged(@Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Block neighbourBlock, @Nonnull BlockPos neighbourPos, boolean isMoving) {
+ public void neighborChanged(BlockState state, Level world, BlockPos pos, Block neighbourBlock, BlockPos neighbourPos, boolean isMoving) {
if (world.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay) relay.neighborChanged(neighbourPos);
}
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java
index 7f03cc9cd..74bde1829 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java
@@ -9,9 +9,7 @@ import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.RedstoneAPI;
import dan200.computercraft.core.apis.RedstoneMethods;
import dan200.computercraft.core.redstone.RedstoneAccess;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The redstone relay is a peripheral that allows reading and outputting redstone signals. While this is not very useful
@@ -46,7 +44,6 @@ public final class RedstoneRelayPeripheral extends RedstoneMethods implements IP
super(access);
}
- @Nonnull
@Override
public String getType() {
return "redstone_relay";
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/DfpwmState.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/DfpwmState.java
index f5988a198..9921fd234 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/DfpwmState.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/DfpwmState.java
@@ -7,8 +7,8 @@ package dan200.computercraft.shared.peripheral.speaker;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaTable;
import dan200.computercraft.shared.util.PauseAwareTimer;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlock.java
index c19b9522e..a5d7b7c14 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerBlock.java
@@ -18,8 +18,7 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class SpeakerBlock extends HorizontalDirectionalBlock implements EntityBlock {
private static final BlockEntityTicker serverTicker = (level, pos, state, drive) -> drive.serverTick();
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 972f67be5..041f0f212 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
@@ -13,8 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class SpeakerBlockEntity extends BlockEntity {
private final SpeakerPeripheral peripheral;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java
index 54b8d6e07..757a81195 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java
@@ -31,8 +31,8 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.item.RecordItem;
import net.minecraft.world.level.block.state.properties.NoteBlockInstrument;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPosition.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPosition.java
index ec8c54c62..e2d2e786a 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPosition.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPosition.java
@@ -9,8 +9,8 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.OptionalInt;
public record SpeakerPosition(@Nullable Level level, Vec3 position, @Nullable Entity entity) {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/ComponentAccess.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/ComponentAccess.java
index 215adefd3..a66c697b7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/platform/ComponentAccess.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/ComponentAccess.java
@@ -5,8 +5,7 @@
package dan200.computercraft.shared.platform;
import net.minecraft.core.Direction;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A (possibly cached) provider of a component at a specific location.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java
index d24eff2ca..156c16ff1 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java
@@ -53,8 +53,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java
index 76c289a5b..7069db974 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java
@@ -17,8 +17,8 @@ import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.material.Fluid;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
index d127f50f7..c8331f0c4 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java
@@ -13,8 +13,8 @@ import dan200.computercraft.impl.PocketUpgrades;
import net.minecraft.core.NonNullList;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java
index 8e6e3c7b2..e6f477437 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java
@@ -20,8 +20,8 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java
index 670d29991..efa4a5c24 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java
@@ -14,8 +14,8 @@ import dan200.computercraft.shared.network.server.ServerNetworking;
import dan200.computercraft.shared.pocket.items.PocketComputerItem;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.ChunkPos;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Set;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java
index e4776d064..df885633e 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java
@@ -47,8 +47,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java
index 6ab3469a0..feff1ba78 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java
@@ -10,8 +10,7 @@ import dan200.computercraft.api.pocket.IPocketAccess;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class PocketModem extends AbstractPocketUpgrade {
private final boolean advanced;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java
index bd1d8b289..52fd55ea1 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java
@@ -10,8 +10,7 @@ import dan200.computercraft.shared.peripheral.modem.ModemState;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class PocketModemPeripheral extends WirelessModemPeripheral {
private final IPocketAccess access;
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 c9508cbc7..657286729 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
@@ -10,8 +10,7 @@ import dan200.computercraft.api.pocket.IPocketAccess;
import dan200.computercraft.shared.peripheral.speaker.UpgradeSpeakerPeripheral;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class PocketSpeaker extends AbstractPocketUpgrade {
public PocketSpeaker(ResourceLocation id, ItemStack item) {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java
index 58a8df873..6073b7046 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java
@@ -8,8 +8,7 @@ import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.pocket.IPocketAccess;
import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition;
import dan200.computercraft.shared.peripheral.speaker.UpgradeSpeakerPeripheral;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class PocketSpeakerPeripheral extends UpgradeSpeakerPeripheral {
private final IPocketAccess access;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java
index 2456a76ae..72b5792ac 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlock.java
@@ -46,8 +46,7 @@ import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.util.WaterloggableHelpers.WATERLOGGED;
import static dan200.computercraft.shared.util.WaterloggableHelpers.getFluidStateForPlacement;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlockEntity.java
index a1661cac9..2720abbc2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlockEntity.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/blocks/TurtleBlockEntity.java
@@ -35,8 +35,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Collections;
import java.util.function.IntSupplier;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java
index 4c62cb236..24305ceae 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java
@@ -40,8 +40,8 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.material.PushReaction;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.TimeUnit;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java
index 82bbbe8c7..3e7b41fc2 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java
@@ -33,8 +33,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class TurtlePlaceCommand implements TurtleCommand {
private final InteractDirection direction;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
index cff7d1b89..fd9401aa7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
@@ -14,10 +14,10 @@ import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.UUID;
public final class TurtlePlayer {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleToolCommand.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleToolCommand.java
index 5bc19294d..63842d1c4 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleToolCommand.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleToolCommand.java
@@ -5,8 +5,8 @@
package dan200.computercraft.shared.turtle.core;
import dan200.computercraft.api.turtle.*;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Locale;
public class TurtleToolCommand implements TurtleCommand {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/TurtleMenu.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/TurtleMenu.java
index 61d2e67d8..1837b0b50 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/TurtleMenu.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/TurtleMenu.java
@@ -21,8 +21,8 @@ import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.SimpleContainerData;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Predicate;
public final class TurtleMenu extends AbstractComputerMenu {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeContainer.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeContainer.java
index 9fff2789a..88172d182 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeContainer.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeContainer.java
@@ -13,8 +13,8 @@ import net.minecraft.core.NonNullList;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java
index 7947785e1..ecd8957c9 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java
@@ -13,8 +13,7 @@ import net.minecraft.world.Container;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A slot in the turtle UI which holds the turtle's current upgrade.
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java
index 4b5994900..261236216 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItem.java
@@ -21,8 +21,7 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.LayeredCauldronBlock;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.turtle.core.TurtleBrain.*;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/CraftingTablePeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/CraftingTablePeripheral.java
index b22a7ca45..96d77fecf 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/CraftingTablePeripheral.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/CraftingTablePeripheral.java
@@ -10,8 +10,8 @@ import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.shared.turtle.core.TurtleCraftCommand;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Optional;
/**
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java
index e428d36fd..8e6e08171 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java
@@ -16,8 +16,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java
index 7235d4431..968c4e68a 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java
@@ -14,8 +14,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class TurtleModem extends AbstractTurtleUpgrade {
private static class Peripheral extends WirelessModemPeripheral {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java
index a0766bd85..3df02429b 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java
@@ -14,8 +14,7 @@ import dan200.computercraft.shared.peripheral.speaker.UpgradeSpeakerPeripheral;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class TurtleSpeaker extends AbstractTurtleUpgrade {
private static class Peripheral extends UpgradeSpeakerPeripheral {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java
index de72b7e09..7fcb6ea57 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java
@@ -37,8 +37,8 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.GameMasterBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.EntityHitResult;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
import java.util.function.Function;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/BlockEntityHelpers.java b/projects/common/src/main/java/dan200/computercraft/shared/util/BlockEntityHelpers.java
index 4e70c55ec..da68ee0a7 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/BlockEntityHelpers.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/BlockEntityHelpers.java
@@ -8,8 +8,7 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class BlockEntityHelpers {
private BlockEntityHelpers() {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/ColourUtils.java b/projects/common/src/main/java/dan200/computercraft/shared/util/ColourUtils.java
index 8f66a6a0a..e00f9f65b 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/ColourUtils.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/ColourUtils.java
@@ -9,8 +9,8 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
public final class ColourUtils {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/ConsList.java b/projects/common/src/main/java/dan200/computercraft/shared/util/ConsList.java
index 909959642..67c0bdfc8 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/ConsList.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/ConsList.java
@@ -4,7 +4,7 @@
package dan200.computercraft.shared.util;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.AbstractList;
import java.util.Iterator;
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 c287b3891..731e3935c 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
@@ -11,8 +11,8 @@ import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/IDAssigner.java b/projects/common/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
index 30c17f2a0..d2d3408eb 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
@@ -7,10 +7,10 @@ package dan200.computercraft.shared.util;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Reader;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java b/projects/common/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java
index 3e833566f..c2acfe1f5 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java
@@ -17,8 +17,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.Vec3;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class InventoryUtil {
private InventoryUtil() {
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/NBTUtil.java b/projects/common/src/main/java/dan200/computercraft/shared/util/NBTUtil.java
index 17d2bf8cc..43dc6c3c3 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/NBTUtil.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/NBTUtil.java
@@ -9,10 +9,10 @@ import com.google.common.io.BaseEncoding;
import dan200.computercraft.core.util.Nullability;
import dan200.computercraft.shared.platform.PlatformHelper;
import net.minecraft.nbt.*;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
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 d52459acc..30b91bf3d 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
@@ -11,8 +11,8 @@ import com.google.gson.JsonSyntaxException;
import com.google.gson.stream.JsonWriter;
import net.minecraft.data.DataProvider;
import net.minecraft.util.GsonHelper;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/WorldUtil.java b/projects/common/src/main/java/dan200/computercraft/shared/util/WorldUtil.java
index 046967211..efae4c230 100644
--- a/projects/common/src/main/java/dan200/computercraft/shared/util/WorldUtil.java
+++ b/projects/common/src/main/java/dan200/computercraft/shared/util/WorldUtil.java
@@ -25,8 +25,7 @@ import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class WorldUtil {
@SuppressWarnings("deprecation")
diff --git a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java
index bd7f412cf..1589b235b 100644
--- a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java
+++ b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java
@@ -53,8 +53,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.List;
import java.util.function.BiFunction;
diff --git a/projects/common/src/test/java/dan200/computercraft/impl/network/wired/NetworkTest.java b/projects/common/src/test/java/dan200/computercraft/impl/network/wired/NetworkTest.java
index 0c76f697e..c24e9a73e 100644
--- a/projects/common/src/test/java/dan200/computercraft/impl/network/wired/NetworkTest.java
+++ b/projects/common/src/test/java/dan200/computercraft/impl/network/wired/NetworkTest.java
@@ -11,9 +11,9 @@ import dan200.computercraft.api.network.wired.WiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
diff --git a/projects/common/src/testMod/java/dan200/computercraft/export/JsonDump.java b/projects/common/src/testMod/java/dan200/computercraft/export/JsonDump.java
index 474c879bf..3504dc184 100644
--- a/projects/common/src/testMod/java/dan200/computercraft/export/JsonDump.java
+++ b/projects/common/src/testMod/java/dan200/computercraft/export/JsonDump.java
@@ -10,7 +10,10 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
public class JsonDump {
public Map itemNames = new TreeMap<>();
diff --git a/projects/common/src/testMod/java/dan200/computercraft/gametest/api/ComputerState.java b/projects/common/src/testMod/java/dan200/computercraft/gametest/api/ComputerState.java
index 82a15b1f7..bf1693231 100644
--- a/projects/common/src/testMod/java/dan200/computercraft/gametest/api/ComputerState.java
+++ b/projects/common/src/testMod/java/dan200/computercraft/gametest/api/ComputerState.java
@@ -7,8 +7,8 @@ package dan200.computercraft.gametest.api;
import dan200.computercraft.gametest.core.TestAPI;
import net.minecraft.gametest.framework.GameTestAssertException;
import net.minecraft.gametest.framework.GameTestSequence;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
diff --git a/projects/common/src/testMod/java/dan200/computercraft/gametest/core/TestAPI.java b/projects/common/src/testMod/java/dan200/computercraft/gametest/core/TestAPI.java
index 0ae3a2847..d2887bb90 100644
--- a/projects/common/src/testMod/java/dan200/computercraft/gametest/core/TestAPI.java
+++ b/projects/common/src/testMod/java/dan200/computercraft/gametest/core/TestAPI.java
@@ -11,10 +11,10 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.gametest.api.ComputerState;
import dan200.computercraft.gametest.api.TestExtensionsKt;
import net.minecraft.gametest.framework.GameTestSequence;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.Optional;
/**
diff --git a/projects/common/src/testMod/java/dan200/computercraft/mixin/gametest/client/MinecraftMixin.java b/projects/common/src/testMod/java/dan200/computercraft/mixin/gametest/client/MinecraftMixin.java
index 801bd81b6..607f2fb6f 100644
--- a/projects/common/src/testMod/java/dan200/computercraft/mixin/gametest/client/MinecraftMixin.java
+++ b/projects/common/src/testMod/java/dan200/computercraft/mixin/gametest/client/MinecraftMixin.java
@@ -9,6 +9,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.LevelRenderer;
+import org.jspecify.annotations.Nullable;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -17,7 +18,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean;
@Mixin(Minecraft.class)
diff --git a/projects/core-api/build.gradle.kts b/projects/core-api/build.gradle.kts
index 2005b8695..9d75f4b0d 100644
--- a/projects/core-api/build.gradle.kts
+++ b/projects/core-api/build.gradle.kts
@@ -23,3 +23,5 @@ tasks.javadoc {
// Depend on the common API when publishing javadoc
classpath += docApi.get()
}
+
+cct.linters(minecraft = false, loader = null)
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileAttributes.java b/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileAttributes.java
index 256ac8529..a2010b9c3 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileAttributes.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileAttributes.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.filesystem;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileOperationException.java b/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileOperationException.java
index 9d3ac4260..48656f43e 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileOperationException.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/filesystem/FileOperationException.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.filesystem;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.io.IOException;
import java.io.Serial;
import java.util.Objects;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/IArguments.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/IArguments.java
index fa0018ef7..e70527785 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/IArguments.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/IArguments.java
@@ -5,8 +5,8 @@
package dan200.computercraft.api.lua;
import org.jetbrains.annotations.Contract;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.Optional;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaAPI.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaAPI.java
index 4b28fd245..3f98e27a3 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaAPI.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaAPI.java
@@ -4,7 +4,7 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Represents a Lua object which is stored as a global variable on computer startup. This must either provide
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaCallback.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaCallback.java
index 0a9e25066..292b2d338 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaCallback.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ILuaCallback.java
@@ -4,6 +4,8 @@
package dan200.computercraft.api.lua;
+import org.jspecify.annotations.Nullable;
+
/**
* A continuation which is called when this coroutine is resumed.
*
@@ -18,5 +20,5 @@ public interface ILuaCallback {
* @return The result of this continuation. Either the result to return to the callee, or another yield.
* @throws LuaException On an error.
*/
- MethodResult resume(Object[] args) throws LuaException;
+ MethodResult resume(@Nullable Object[] args) throws LuaException;
}
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaException.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaException.java
index c6d4371f2..aaef1cf01 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaException.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaException.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.io.Serial;
/**
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTable.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTable.java
index b3a996820..006f6f51d 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTable.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTable.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.Map;
import static dan200.computercraft.api.lua.LuaValues.*;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTask.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTask.java
index c49473b07..045339014 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTask.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaTask.java
@@ -4,7 +4,7 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A task which can be executed via {@link ILuaContext#issueMainThreadTask(LuaTask)} This will be run on the main
@@ -24,5 +24,5 @@ public interface LuaTask {
* arguments are supplied to your method.
*/
@Nullable
- Object[] execute() throws LuaException;
+ Object @Nullable [] execute() throws LuaException;
}
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaValues.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaValues.java
index ee710995a..61ec3635e 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaValues.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/LuaValues.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.nio.ByteBuffer;
import java.util.Map;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/MethodResult.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/MethodResult.java
index 8b834f54c..b861307e3 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/MethodResult.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/MethodResult.java
@@ -5,8 +5,8 @@
package dan200.computercraft.api.lua;
import dan200.computercraft.api.peripheral.IComputerAccess;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.*;
@@ -19,17 +19,17 @@ import java.util.*;
public final class MethodResult {
private static final MethodResult empty = new MethodResult(null, null);
- private final @Nullable Object[] result;
+ private final @Nullable Object @Nullable [] result;
private final @Nullable ILuaCallback callback;
private final int adjust;
- private MethodResult(@Nullable Object[] arguments, @Nullable ILuaCallback callback) {
+ private MethodResult(@Nullable Object @Nullable [] arguments, @Nullable ILuaCallback callback) {
result = arguments;
this.callback = callback;
adjust = 0;
}
- private MethodResult(@Nullable Object[] arguments, @Nullable ILuaCallback callback, int adjust) {
+ private MethodResult(@Nullable Object @Nullable [] arguments, @Nullable ILuaCallback callback, int adjust) {
result = arguments;
this.callback = callback;
this.adjust = adjust;
@@ -73,7 +73,7 @@ public final class MethodResult {
* @param values The values to return. See {@link #of(Object)} for acceptable values.
* @return A method result which returns immediately with the given values.
*/
- public static MethodResult of(@Nullable Object... values) {
+ public static MethodResult of(@Nullable Object @Nullable ... values) {
return values == null || values.length == 0 ? empty : new MethodResult(values, null);
}
@@ -121,13 +121,12 @@ public final class MethodResult {
* @see #pullEvent(String, ILuaCallback)
*/
@SuppressWarnings("NamedLikeContextualKeyword")
- public static MethodResult yield(@Nullable Object[] arguments, ILuaCallback callback) {
+ public static MethodResult yield(@Nullable Object @Nullable [] arguments, ILuaCallback callback) {
Objects.requireNonNull(callback, "callback cannot be null");
return new MethodResult(arguments, callback);
}
- @Nullable
- public Object[] getResult() {
+ public @Nullable Object @Nullable [] getResult() {
return result;
}
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectArguments.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectArguments.java
index 14e36fb44..769ee6976 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectArguments.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectArguments.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectLuaTable.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectLuaTable.java
index db4ea75eb..5a133b742 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectLuaTable.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/ObjectLuaTable.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/TaskCallback.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/TaskCallback.java
index 7b1385f58..608000f68 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/TaskCallback.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/TaskCallback.java
@@ -5,13 +5,12 @@
package dan200.computercraft.api.lua;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class TaskCallback implements ILuaCallback, LuaTask {
private final LuaTask task;
- private volatile @Nullable Object[] result;
+ private volatile @Nullable Object @Nullable [] result;
private volatile @MonotonicNonNull LuaException failure;
private final long taskId;
@@ -22,9 +21,8 @@ final class TaskCallback implements ILuaCallback, LuaTask {
taskId = context.issueMainThreadTask(this);
}
- @Nullable
@Override
- public Object[] execute() throws LuaException {
+ public @Nullable Object @Nullable [] execute() throws LuaException {
// Store the result/exception: we read these back when receiving the task_complete event.
try {
result = task.execute();
@@ -38,7 +36,7 @@ final class TaskCallback implements ILuaCallback, LuaTask {
}
@Override
- public MethodResult resume(Object[] response) throws LuaException {
+ public MethodResult resume(@Nullable Object[] response) throws LuaException {
if (response.length < 3 || !(response[1] instanceof Number eventTask) || !(response[2] instanceof Boolean isOk)) {
return pull;
}
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java
index 33fb31eb2..cd2caa8e1 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.peripheral;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java
index fc56bc6a9..7268cf0e0 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java
@@ -10,8 +10,8 @@ import dan200.computercraft.api.lua.ILuaCallback;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaTask;
import dan200.computercraft.api.lua.MethodResult;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
/**
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java
index 1b80787f0..319d7c3d5 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java
@@ -7,8 +7,8 @@ package dan200.computercraft.api.peripheral;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.LuaTask;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Set;
/**
diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java
index e651df006..c8f1f2a01 100644
--- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java
+++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java
@@ -4,7 +4,8 @@
package dan200.computercraft.api.peripheral;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.Collection;
import java.util.Set;
diff --git a/projects/core/build.gradle.kts b/projects/core/build.gradle.kts
index 5ae2dbe4d..bfea7628b 100644
--- a/projects/core/build.gradle.kts
+++ b/projects/core/build.gradle.kts
@@ -58,6 +58,8 @@ val checkChangelog by tasks.registering(cc.tweaked.gradle.CheckChangelog::class)
tasks.check { dependsOn(checkChangelog) }
+cct.linters(minecraft = false, loader = null)
+
// We configure the shadow jar to ship netty-codec and all its dependencies, relocating them under the
// dan200.computercraft.core package.
// This is used as part of the Forge build, so that our version of netty-codec is loaded under the GAME layer, and so
diff --git a/projects/core/src/main/java/dan200/computercraft/core/ComputerContext.java b/projects/core/src/main/java/dan200/computercraft/core/ComputerContext.java
index d77b21c95..ac2c182cd 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/ComputerContext.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/ComputerContext.java
@@ -4,6 +4,7 @@
package dan200.computercraft.core;
+import com.google.errorprone.annotations.CheckReturnValue;
import dan200.computercraft.core.asm.GenericMethod;
import dan200.computercraft.core.asm.LuaMethodSupplier;
import dan200.computercraft.core.asm.PeripheralMethodSupplier;
@@ -18,9 +19,8 @@ import dan200.computercraft.core.lua.MachineEnvironment;
import dan200.computercraft.core.methods.LuaMethod;
import dan200.computercraft.core.methods.MethodSupplier;
import dan200.computercraft.core.methods.PeripheralMethod;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.CheckReturnValue;
-import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
@@ -153,7 +153,7 @@ public final class ComputerContext {
private final GlobalEnvironment environment;
private @Nullable ComputerScheduler computerScheduler = null;
private @Nullable MainThreadScheduler mainThreadScheduler;
- private @Nullable ILuaMachine.Factory luaFactory;
+ private ILuaMachine.@Nullable Factory luaFactory;
private @Nullable List genericMethods;
Builder(GlobalEnvironment environment) {
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/ComputerAccess.java b/projects/core/src/main/java/dan200/computercraft/core/apis/ComputerAccess.java
index 8184f3639..dede7998c 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/ComputerAccess.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/ComputerAccess.java
@@ -9,10 +9,10 @@ import dan200.computercraft.api.filesystem.WritableMount;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.WorkMonitor;
import dan200.computercraft.core.filesystem.FileSystemException;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/FSAPI.java b/projects/core/src/main/java/dan200/computercraft/core/apis/FSAPI.java
index 09c37ba9c..9988e33a9 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/FSAPI.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/FSAPI.java
@@ -15,8 +15,8 @@ import dan200.computercraft.core.apis.handles.WriteHandle;
import dan200.computercraft.core.filesystem.FileSystem;
import dan200.computercraft.core.filesystem.FileSystemException;
import dan200.computercraft.core.metrics.Metrics;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.file.OpenOption;
import java.nio.file.StandardOpenOption;
import java.util.*;
@@ -410,9 +410,8 @@ public class FSAPI implements ILuaAPI {
* print("/rom/: " .. fs.getDrive("rom"))
* }
*/
- @Nullable
@LuaFunction
- public final Object[] getDrive(String path) throws LuaException {
+ public final Object @Nullable [] getDrive(String path) throws LuaException {
try {
return getFileSystem().exists(path) ? new Object[]{ getFileSystem().getMountLabel(path) } : null;
} catch (FileSystemException e) {
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/FastLuaException.java b/projects/core/src/main/java/dan200/computercraft/core/apis/FastLuaException.java
index efadf52c2..cca33130e 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/FastLuaException.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/FastLuaException.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.apis;
import dan200.computercraft.api.lua.LuaException;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.Serial;
/**
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java b/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java
index 046fc3ac9..ee5fb41a3 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java
@@ -14,8 +14,7 @@ import dan200.computercraft.core.metrics.Metric;
import dan200.computercraft.core.metrics.MetricsObserver;
import dan200.computercraft.core.metrics.OperationTimer;
import dan200.computercraft.core.terminal.Terminal;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public interface IAPIEnvironment {
String TIMER_EVENT = "timer";
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 d185f4fad..ccaf6b40e 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
@@ -5,8 +5,8 @@
package dan200.computercraft.core.apis;
import dan200.computercraft.api.lua.LuaException;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
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 3251004c3..477c83aac 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
@@ -11,8 +11,8 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.core.util.StringUtil;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
@@ -245,9 +245,8 @@ public class OSAPI implements ILuaAPI {
* @cc.treturn string|nil The label of the computer.
* @cc.since 1.3
*/
- @Nullable
@LuaFunction({ "getComputerLabel", "computerLabel" })
- public final Object[] getComputerLabel() {
+ public final Object @Nullable [] getComputerLabel() {
var label = apiEnvironment.getLabel();
return label == null ? null : new Object[]{ label };
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/PeripheralAPI.java b/projects/core/src/main/java/dan200/computercraft/core/apis/PeripheralAPI.java
index 0b5307fcd..dd065b00f 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/PeripheralAPI.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/PeripheralAPI.java
@@ -16,8 +16,8 @@ import dan200.computercraft.core.methods.MethodSupplier;
import dan200.computercraft.core.methods.PeripheralMethod;
import dan200.computercraft.core.metrics.Metrics;
import dan200.computercraft.core.util.LuaUtil;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
/**
@@ -268,9 +268,8 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
return false;
}
- @Nullable
@LuaFunction
- public final Object[] getType(String sideName) {
+ public final Object @Nullable [] getType(String sideName) {
var side = ComputerSide.valueOfInsensitive(sideName);
if (side == null) return null;
@@ -280,9 +279,8 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
}
}
- @Nullable
@LuaFunction
- public final Object[] hasType(String sideName, String type) {
+ public final Object @Nullable [] hasType(String sideName, String type) {
var side = ComputerSide.valueOfInsensitive(sideName);
if (side == null) return null;
@@ -295,9 +293,8 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
return null;
}
- @Nullable
@LuaFunction
- public final Object[] getMethods(String sideName) {
+ public final Object @Nullable [] getMethods(String sideName) {
var side = ComputerSide.valueOfInsensitive(sideName);
if (side == null) return null;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/TableHelper.java b/projects/core/src/main/java/dan200/computercraft/core/apis/TableHelper.java
index d4ed5dc9f..9ccb5f39e 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/TableHelper.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/TableHelper.java
@@ -6,8 +6,8 @@ package dan200.computercraft.core.apis;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaValues;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Map;
import java.util.Optional;
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 b46a2b1ba..b5e39e3c0 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
@@ -10,8 +10,8 @@ import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.core.filesystem.TrackingCloseable;
import dan200.computercraft.core.util.IoUtil;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -77,8 +77,7 @@ public abstract class AbstractHandle {
* @cc.treturn string The reason seeking failed.
* @cc.since 1.80pr1.9
*/
- @Nullable
- public Object[] seek(Optional whence, Optional offset) throws LuaException {
+ public Object @Nullable [] seek(Optional whence, Optional offset) throws LuaException {
checkOpen();
long actualOffset = offset.orElse(0L);
try {
@@ -111,8 +110,7 @@ public abstract class AbstractHandle {
* @cc.treturn [3] string The bytes read as a string. This is returned when the {@code count} is given.
* @cc.changed 1.80pr1 Now accepts an integer argument to read multiple bytes, returning a string instead of a number.
*/
- @Nullable
- public Object[] read(Optional countArg) throws LuaException {
+ public Object @Nullable [] read(Optional countArg) throws LuaException {
checkOpen();
try {
if (binary && countArg.isEmpty()) {
@@ -161,7 +159,7 @@ public abstract class AbstractHandle {
var bytes = new byte[totalRead];
var pos = 0;
for (var part : parts) {
- int length = part.remaining();
+ var length = part.remaining();
part.get(bytes, pos, length);
pos += length;
}
@@ -182,8 +180,7 @@ public abstract class AbstractHandle {
* @cc.treturn string|nil The remaining contents of the file, or {@code nil} in the event of an error.
* @cc.since 1.80pr1
*/
- @Nullable
- public Object[] readAll() throws LuaException {
+ public Object @Nullable [] readAll() throws LuaException {
checkOpen();
try {
var expected = 32;
@@ -214,8 +211,7 @@ public abstract class AbstractHandle {
* @cc.since 1.80pr1.9
* @cc.changed 1.81.0 `\r` is now stripped.
*/
- @Nullable
- public Object[] readLine(Optional withTrailingArg) throws LuaException {
+ public Object @Nullable [] readLine(Optional withTrailingArg) throws LuaException {
checkOpen();
boolean withTrailing = withTrailingArg.orElse(false);
try {
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadHandle.java
index 8a7b1b3b7..e3cbb8574 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadHandle.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadHandle.java
@@ -7,8 +7,8 @@ package dan200.computercraft.core.apis.handles;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.core.filesystem.TrackingCloseable;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.channels.SeekableByteChannel;
import java.util.Optional;
@@ -29,40 +29,36 @@ public class ReadHandle extends AbstractHandle {
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] read(Optional countArg) throws LuaException {
+ public final Object @Nullable [] read(Optional countArg) throws LuaException {
return super.read(countArg);
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] readAll() throws LuaException {
+ public final Object @Nullable [] readAll() throws LuaException {
return super.readAll();
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] readLine(Optional withTrailingArg) throws LuaException {
+ public final Object @Nullable [] readLine(Optional withTrailingArg) throws LuaException {
return super.readLine(withTrailingArg);
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] seek(Optional whence, Optional offset) throws LuaException {
+ public final Object @Nullable [] seek(Optional whence, Optional offset) throws LuaException {
return super.seek(whence, offset);
}
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadWriteHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadWriteHandle.java
index d295a3763..29a454192 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadWriteHandle.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/ReadWriteHandle.java
@@ -9,8 +9,8 @@ import dan200.computercraft.api.lua.IArguments;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.core.filesystem.TrackingCloseable;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.util.Optional;
@@ -28,40 +28,36 @@ public class ReadWriteHandle extends AbstractHandle {
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] read(Optional countArg) throws LuaException {
+ public final Object @Nullable [] read(Optional countArg) throws LuaException {
return super.read(countArg);
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] readAll() throws LuaException {
+ public final Object @Nullable [] readAll() throws LuaException {
return super.readAll();
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] readLine(Optional withTrailingArg) throws LuaException {
+ public final Object @Nullable [] readLine(Optional withTrailingArg) throws LuaException {
return super.readLine(withTrailingArg);
}
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] seek(Optional whence, Optional offset) throws LuaException {
+ public final Object @Nullable [] seek(Optional whence, Optional offset) throws LuaException {
return super.seek(whence, offset);
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/WriteHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/WriteHandle.java
index c91bf37ac..ad1618d9a 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/handles/WriteHandle.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/handles/WriteHandle.java
@@ -9,8 +9,8 @@ import dan200.computercraft.api.lua.IArguments;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.core.filesystem.TrackingCloseable;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.util.Optional;
@@ -64,10 +64,9 @@ public class WriteHandle extends AbstractHandle {
/**
* {@inheritDoc}
*/
- @Nullable
@Override
@LuaFunction
- public final Object[] seek(Optional whence, Optional offset) throws LuaException {
+ public final Object @Nullable [] seek(Optional whence, Optional offset) throws LuaException {
return super.seek(whence, offset);
}
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/CheckUrl.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/CheckUrl.java
index 7d23b7973..addd9eaa7 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/CheckUrl.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/CheckUrl.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.apis.http;
import dan200.computercraft.core.apis.IAPIEnvironment;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.net.URI;
import java.util.concurrent.Future;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/NetworkUtils.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/NetworkUtils.java
index 054b5b250..594dfccfd 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/NetworkUtils.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/NetworkUtils.java
@@ -27,10 +27,10 @@ import io.netty.handler.ssl.SslHandler;
import io.netty.handler.timeout.ReadTimeoutException;
import io.netty.handler.traffic.AbstractTrafficShapingHandler;
import io.netty.handler.traffic.GlobalTrafficShapingHandler;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import java.net.InetSocketAddress;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/Resource.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/Resource.java
index c4396ff5e..e344a9fc8 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/Resource.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/Resource.java
@@ -6,8 +6,8 @@ package dan200.computercraft.core.apis.http;
import dan200.computercraft.core.util.IoUtil;
import io.netty.channel.ChannelFuture;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.Closeable;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/AddressRule.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/AddressRule.java
index 3673e8da0..f686d594a 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/AddressRule.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/AddressRule.java
@@ -8,8 +8,8 @@ import com.google.common.net.InetAddresses;
import dan200.computercraft.core.apis.http.options.AddressPredicate.DomainPattern;
import dan200.computercraft.core.apis.http.options.AddressPredicate.HostRange;
import dan200.computercraft.core.apis.http.options.AddressPredicate.PrivatePattern;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/PartialOptions.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/PartialOptions.java
index bd0c91c6f..2c8bd12b0 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/PartialOptions.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/options/PartialOptions.java
@@ -6,8 +6,8 @@ package dan200.computercraft.core.apis.http.options;
import com.google.errorprone.annotations.Immutable;
import com.google.errorprone.annotations.concurrent.LazyInit;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.OptionalLong;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequest.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequest.java
index fb28284e2..dc0b038d1 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequest.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequest.java
@@ -20,10 +20,10 @@ import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.*;
import io.netty.handler.timeout.ReadTimeoutHandler;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java
index 8ef3a099c..b23d6e12e 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java
@@ -14,8 +14,8 @@ import io.netty.buffer.CompositeByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.Closeable;
import java.net.URI;
import java.net.URISyntaxException;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java
index 5695000ef..a4ebc4c9e 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java
@@ -25,10 +25,10 @@ import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.websocketx.*;
import io.netty.util.concurrent.GenericFutureListener;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.concurrent.Future;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java
index f5182868a..c1b704b44 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java
@@ -7,6 +7,7 @@ package dan200.computercraft.core.apis.http.websocket;
import dan200.computercraft.api.lua.*;
import dan200.computercraft.core.apis.IAPIEnvironment;
import dan200.computercraft.core.apis.http.options.Options;
+import org.jspecify.annotations.Nullable;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
@@ -119,7 +120,7 @@ public class WebsocketHandle {
}
@Override
- public MethodResult resume(Object[] event) {
+ public MethodResult resume(@Nullable Object[] event) {
if (event.length >= 3 && Objects.equals(event[0], MESSAGE_EVENT) && Objects.equals(event[1], address)) {
environment.cancelTimer(timeoutId);
return MethodResult.of(Arrays.copyOfRange(event, 2, event.length));
diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/transfer/TransferredFiles.java b/projects/core/src/main/java/dan200/computercraft/core/apis/transfer/TransferredFiles.java
index a2afd7dd3..04e4e9306 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/apis/transfer/TransferredFiles.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/apis/transfer/TransferredFiles.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.apis.transfer;
import dan200.computercraft.api.lua.LuaFunction;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/asm/Generator.java b/projects/core/src/main/java/dan200/computercraft/core/asm/Generator.java
index 3272b3bc2..e31cac71e 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/asm/Generator.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/asm/Generator.java
@@ -11,10 +11,10 @@ import com.google.common.primitives.Primitives;
import com.google.common.reflect.TypeToken;
import dan200.computercraft.api.lua.*;
import dan200.computercraft.core.methods.LuaMethod;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/asm/GenericMethod.java b/projects/core/src/main/java/dan200/computercraft/core/asm/GenericMethod.java
index 1681c4ed2..ef3f70ce2 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/asm/GenericMethod.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/asm/GenericMethod.java
@@ -8,10 +8,10 @@ import dan200.computercraft.api.lua.GenericSource;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.GenericPeripheral;
import dan200.computercraft.api.peripheral.PeripheralType;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Objects;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/asm/MethodSupplierImpl.java b/projects/core/src/main/java/dan200/computercraft/core/asm/MethodSupplierImpl.java
index 92a2cb700..aa773ddde 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/asm/MethodSupplierImpl.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/asm/MethodSupplierImpl.java
@@ -11,10 +11,10 @@ import dan200.computercraft.core.methods.MethodSupplier;
import dan200.computercraft.core.methods.NamedMethod;
import dan200.computercraft.core.methods.ObjectSource;
import org.jetbrains.annotations.VisibleForTesting;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/asm/Reflect.java b/projects/core/src/main/java/dan200/computercraft/core/asm/Reflect.java
index 7c14a578c..f66dead23 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/asm/Reflect.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/asm/Reflect.java
@@ -5,10 +5,10 @@
package dan200.computercraft.core.asm;
import dan200.computercraft.api.lua.Coerced;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.lang.reflect.*;
import java.util.Optional;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/asm/ResultHelpers.java b/projects/core/src/main/java/dan200/computercraft/core/asm/ResultHelpers.java
index ef2e55a80..c8de48bf5 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/asm/ResultHelpers.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/asm/ResultHelpers.java
@@ -5,15 +5,13 @@
package dan200.computercraft.core.asm;
import dan200.computercraft.api.lua.MethodResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class ResultHelpers {
private ResultHelpers() {
}
- @Nullable
- static Object[] checkNormalResult(MethodResult result) {
+ static @Nullable Object @Nullable [] checkNormalResult(MethodResult result) {
if (result.getCallback() != null) {
// Due to how tasks are implemented, we can't currently return a MethodResult. This is an
// entirely artificial limitation - we can remove it if it ever becomes an issue.
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ApiWrapper.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ApiWrapper.java
index 94394724a..ea4a3fdaf 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/ApiWrapper.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ApiWrapper.java
@@ -5,8 +5,7 @@
package dan200.computercraft.core.computer;
import dan200.computercraft.api.lua.ILuaAPI;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A wrapper for {@link ILuaAPI}s which provides an optional shutdown hook to clean up resources.
@@ -28,8 +27,4 @@ record ApiWrapper(ILuaAPI api, @Nullable ApiLifecycle lifecycle) {
api.shutdown();
if (lifecycle != null) lifecycle.shutdown();
}
-
- public ILuaAPI api() {
- return api;
- }
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java b/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java
index bab208506..5973d0444 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java
@@ -14,8 +14,8 @@ import dan200.computercraft.core.computer.mainthread.MainThreadScheduler;
import dan200.computercraft.core.filesystem.FileSystem;
import dan200.computercraft.core.redstone.RedstoneState;
import dan200.computercraft.core.terminal.Terminal;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -115,7 +115,7 @@ public class Computer implements ComputerEvents.Receiver {
}
@Override
- public void queueEvent(String event, @Nullable Object[] args) {
+ public void queueEvent(String event, @Nullable Object @Nullable [] args) {
executor.queueEvent(event, args);
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEnvironment.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEnvironment.java
index a9984aa1f..06fad0f90 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEnvironment.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEnvironment.java
@@ -7,8 +7,7 @@ package dan200.computercraft.core.computer;
import dan200.computercraft.api.filesystem.WritableMount;
import dan200.computercraft.core.filesystem.WritableFileMount;
import dan200.computercraft.core.metrics.MetricsObserver;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public interface ComputerEnvironment {
/**
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEvents.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEvents.java
index f3ed14372..678607cb1 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEvents.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerEvents.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.computer;
import dan200.computercraft.core.util.StringUtil;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
/**
@@ -67,6 +67,6 @@ public final class ComputerEvents {
*/
@FunctionalInterface
public interface Receiver {
- void queueEvent(String event, @Nullable Object[] arguments);
+ void queueEvent(String event, @Nullable Object @Nullable [] arguments);
}
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java
index d9db83472..55d57ab39 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java
@@ -4,6 +4,7 @@
package dan200.computercraft.core.computer;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.api.filesystem.Mount;
import dan200.computercraft.api.filesystem.WritableMount;
import dan200.computercraft.api.lua.ILuaAPI;
@@ -22,11 +23,10 @@ import dan200.computercraft.core.methods.MethodSupplier;
import dan200.computercraft.core.metrics.MetricsObserver;
import dan200.computercraft.core.util.Colour;
import dan200.computercraft.core.util.Nullability;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayDeque;
@@ -266,7 +266,7 @@ final class ComputerExecutor implements ComputerScheduler.Worker {
* @param event The event's name
* @param args The event's arguments
*/
- void queueEvent(String event, @Nullable Object[] args) {
+ void queueEvent(String event, @Nullable Object @Nullable [] args) {
// Events should be skipped if we're not on.
if (!isOn) return;
@@ -552,7 +552,7 @@ final class ComputerExecutor implements ComputerScheduler.Worker {
terminal.write("ComputerCraft may be installed incorrectly");
}
- private void resumeMachine(@Nullable String event, @Nullable Object[] args) throws InterruptedException {
+ private void resumeMachine(@Nullable String event, @Nullable Object @Nullable [] args) throws InterruptedException {
var result = Nullability.assertNonNull(machine).handleEvent(event, args);
if (result.isError()) {
displayFailure("Error running computer", result.getMessage());
@@ -573,6 +573,7 @@ final class ComputerExecutor implements ComputerScheduler.Worker {
ABORT_WITH_ERROR,
}
- private record Event(String name, @Nullable Object[] args) {
+ @SuppressWarnings("ArrayRecordComponent")
+ private record Event(String name, @Nullable Object @Nullable [] args) {
}
}
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerSide.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerSide.java
index c35016080..439f7359f 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerSide.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerSide.java
@@ -4,7 +4,8 @@
package dan200.computercraft.core.computer;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.List;
/**
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java b/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java
index d1e10d5c4..a87903e41 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java
@@ -14,8 +14,8 @@ import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.core.util.PeripheralHelpers;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Iterator;
/**
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/GlobalEnvironment.java b/projects/core/src/main/java/dan200/computercraft/core/computer/GlobalEnvironment.java
index 36b018cd0..9051da12f 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/GlobalEnvironment.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/GlobalEnvironment.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.computer;
import dan200.computercraft.api.filesystem.Mount;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.InputStream;
/**
diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/computerthread/ComputerThread.java b/projects/core/src/main/java/dan200/computercraft/core/computer/computerthread/ComputerThread.java
index 5866628da..67672bc54 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/computer/computerthread/ComputerThread.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/computer/computerthread/ComputerThread.java
@@ -6,6 +6,7 @@ package dan200.computercraft.core.computer.computerthread;
import com.google.common.annotations.VisibleForTesting;
import com.google.errorprone.annotations.Keep;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.core.ComputerContext;
import dan200.computercraft.core.Logging;
import dan200.computercraft.core.computer.TimeoutState;
@@ -13,11 +14,10 @@ import dan200.computercraft.core.metrics.Metrics;
import dan200.computercraft.core.metrics.MetricsObserver;
import dan200.computercraft.core.metrics.ThreadAllocations;
import dan200.computercraft.core.util.ThreadUtils;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
import java.util.Arrays;
import java.util.Objects;
import java.util.TreeSet;
@@ -242,7 +242,7 @@ public final class ComputerThread implements ComputerScheduler {
// Encourage any currently running runners to terminate.
threadLock.lock();
try {
- for (@Nullable var worker : workers) {
+ for (var worker : workers) {
if (worker == null) continue;
var executor = worker.currentExecutor.get();
@@ -349,7 +349,7 @@ public final class ComputerThread implements ComputerScheduler {
// Update all the currently executing tasks
var now = System.nanoTime();
var tasks = 1 + computerQueue.size();
- for (@Nullable var runner : workersReadOnly()) {
+ for (var runner : workersReadOnly()) {
if (runner == null) continue;
var executor = runner.currentExecutor.get();
if (executor == null) continue;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/AbstractInMemoryMount.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/AbstractInMemoryMount.java
index 188628a3b..361cbb735 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/AbstractInMemoryMount.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/AbstractInMemoryMount.java
@@ -7,8 +7,8 @@ package dan200.computercraft.core.filesystem;
import dan200.computercraft.api.filesystem.FileAttributes;
import dan200.computercraft.api.filesystem.FileOperationException;
import dan200.computercraft.api.filesystem.Mount;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.attribute.BasicFileAttributes;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/ArchiveMount.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/ArchiveMount.java
index bac283ad9..388cc10de 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/ArchiveMount.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/ArchiveMount.java
@@ -7,8 +7,8 @@ package dan200.computercraft.core.filesystem;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import dan200.computercraft.core.apis.handles.ArrayByteChannel;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.channels.SeekableByteChannel;
import java.util.concurrent.TimeUnit;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/JarMount.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/JarMount.java
index 635c1a076..fc4cd1d93 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/JarMount.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/JarMount.java
@@ -6,8 +6,8 @@ package dan200.computercraft.core.filesystem;
import dan200.computercraft.api.filesystem.FileAttributes;
import dan200.computercraft.api.filesystem.FileOperationException;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/MemoryMount.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/MemoryMount.java
index 2db0154b6..1bacb72c4 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/MemoryMount.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/MemoryMount.java
@@ -9,8 +9,8 @@ import dan200.computercraft.api.filesystem.FileOperationException;
import dan200.computercraft.api.filesystem.Mount;
import dan200.computercraft.api.filesystem.WritableMount;
import dan200.computercraft.core.util.Nullability;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
@@ -220,8 +220,7 @@ public final class MemoryMount extends AbstractInMemoryMount {
FileTime created = EPOCH;
FileTime modified = EPOCH;
- @Nullable
- byte[] contents;
+ byte @Nullable [] contents;
int length;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/MountWrapper.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/MountWrapper.java
index 10d9243e2..a77c3af18 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/MountWrapper.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/MountWrapper.java
@@ -7,8 +7,8 @@ package dan200.computercraft.core.filesystem;
import dan200.computercraft.api.filesystem.FileOperationException;
import dan200.computercraft.api.filesystem.Mount;
import dan200.computercraft.api.filesystem.WritableMount;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.OpenOption;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/filesystem/WritableFileMount.java b/projects/core/src/main/java/dan200/computercraft/core/filesystem/WritableFileMount.java
index 390e7899e..8086196b7 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/filesystem/WritableFileMount.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/filesystem/WritableFileMount.java
@@ -6,10 +6,10 @@ package dan200.computercraft.core.filesystem;
import dan200.computercraft.api.filesystem.FileOperationException;
import dan200.computercraft.api.filesystem.WritableMount;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java b/projects/core/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java
index 0bc3c4856..527bf03bc 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java
@@ -17,6 +17,7 @@ import dan200.computercraft.core.methods.MethodSupplier;
import dan200.computercraft.core.util.LuaUtil;
import dan200.computercraft.core.util.Nullability;
import dan200.computercraft.core.util.SanitisedError;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.squiddev.cobalt.*;
@@ -26,7 +27,6 @@ import org.squiddev.cobalt.interrupt.InterruptAction;
import org.squiddev.cobalt.lib.Bit32Lib;
import org.squiddev.cobalt.lib.CoreLibraries;
-import javax.annotation.Nullable;
import java.io.InputStream;
import java.io.Serial;
import java.nio.ByteBuffer;
@@ -114,7 +114,7 @@ public class CobaltLuaMachine implements ILuaMachine {
}
@Override
- public MachineResult handleEvent(@Nullable String eventName, @Nullable Object[] arguments) {
+ public MachineResult handleEvent(@Nullable String eventName, @Nullable Object @Nullable [] arguments) {
if (isDisposed) throw new IllegalStateException("Machine has been closed");
if (eventFilter != null && eventName != null && !eventName.equals(eventFilter) && !eventName.equals("terminate")) {
@@ -253,7 +253,7 @@ public class CobaltLuaMachine implements ILuaMachine {
return Constants.NIL;
}
- Varargs toValues(@Nullable Object[] objects) throws LuaError {
+ Varargs toValues(@Nullable Object @Nullable [] objects) throws LuaError {
if (objects == null || objects.length == 0) return Constants.NONE;
if (objects.length == 1) return toValue(objects[0], null);
@@ -266,8 +266,7 @@ public class CobaltLuaMachine implements ILuaMachine {
return ValueFactory.varargsOf(values);
}
- @Nullable
- static Object toObject(LuaValue value, @Nullable IdentityHashMap objects) {
+ static @Nullable Object toObject(LuaValue value, @Nullable IdentityHashMap objects) {
return switch (value.type()) {
case Constants.TNIL -> null;
case Constants.TINT, Constants.TNUMBER -> value.toDouble();
@@ -312,7 +311,7 @@ public class CobaltLuaMachine implements ILuaMachine {
};
}
- static Object[] toObjects(Varargs values) {
+ static @Nullable Object[] toObjects(Varargs values) {
var count = values.count();
var objects = new Object[count];
for (var i = 0; i < count; i++) objects[i] = toObject(values.arg(i + 1), null);
diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java b/projects/core/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java
index 1c939d997..8ff30d6d0 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java
@@ -4,7 +4,8 @@
package dan200.computercraft.core.lua;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.io.IOException;
import java.io.InputStream;
@@ -28,7 +29,7 @@ public interface ILuaMachine {
* @return The result of loading this machine. Will either be OK, or the error message that occurred when
* executing.
*/
- MachineResult handleEvent(@Nullable String eventName, @Nullable Object[] arguments);
+ MachineResult handleEvent(@Nullable String eventName, @Nullable Object @Nullable [] arguments);
/**
* Print some information about the internal execution state.
diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/MachineResult.java b/projects/core/src/main/java/dan200/computercraft/core/lua/MachineResult.java
index a7e481fbc..731b5295a 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/lua/MachineResult.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/lua/MachineResult.java
@@ -5,8 +5,7 @@
package dan200.computercraft.core.lua;
import dan200.computercraft.core.computer.TimeoutState;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The result of executing an action on a machine.
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 0ffa65d76..d764db045 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
@@ -6,9 +6,9 @@ package dan200.computercraft.core.lua;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaValues;
+import org.jspecify.annotations.Nullable;
import org.squiddev.cobalt.*;
-import javax.annotation.Nullable;
import java.util.*;
import static dan200.computercraft.api.lua.LuaValues.badTableItem;
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 f8ecee139..ed75df732 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
@@ -7,11 +7,11 @@ package dan200.computercraft.core.lua;
import dan200.computercraft.api.lua.IArguments;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaValues;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.squiddev.cobalt.*;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Optional;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/lua/errorinfo/ErrorInfoLib.java b/projects/core/src/main/java/dan200/computercraft/core/lua/errorinfo/ErrorInfoLib.java
index 5f23941f5..3f03f31c2 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/lua/errorinfo/ErrorInfoLib.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/lua/errorinfo/ErrorInfoLib.java
@@ -5,12 +5,12 @@
package dan200.computercraft.core.lua.errorinfo;
import com.google.common.annotations.VisibleForTesting;
+import org.jspecify.annotations.Nullable;
import org.squiddev.cobalt.*;
import org.squiddev.cobalt.debug.DebugFrame;
import org.squiddev.cobalt.function.LuaFunction;
import org.squiddev.cobalt.function.RegisteredFunction;
-import javax.annotation.Nullable;
import java.util.Objects;
import static org.squiddev.cobalt.Lua.*;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/methods/MethodSupplier.java b/projects/core/src/main/java/dan200/computercraft/core/methods/MethodSupplier.java
index 13f45b915..701148829 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/methods/MethodSupplier.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/methods/MethodSupplier.java
@@ -4,7 +4,8 @@
package dan200.computercraft.core.methods;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.HashMap;
import java.util.Map;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/methods/NamedMethod.java b/projects/core/src/main/java/dan200/computercraft/core/methods/NamedMethod.java
index f4f5de441..a848b36d4 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/methods/NamedMethod.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/methods/NamedMethod.java
@@ -8,8 +8,7 @@ import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.peripheral.GenericPeripheral;
import dan200.computercraft.api.peripheral.PeripheralType;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A method generated from a {@link LuaFunction}.
diff --git a/projects/core/src/main/java/dan200/computercraft/core/metrics/ThreadAllocations.java b/projects/core/src/main/java/dan200/computercraft/core/metrics/ThreadAllocations.java
index 940c0d232..953a832db 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/metrics/ThreadAllocations.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/metrics/ThreadAllocations.java
@@ -4,10 +4,10 @@
package dan200.computercraft.core.metrics;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java
index e2a6f0d9f..5de2e9b8a 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java
@@ -3,10 +3,10 @@
// SPDX-License-Identifier: LicenseRef-CCPL
package dan200.computercraft.core.redstone;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.core.computer.ComputerSide;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
import java.util.Arrays;
import java.util.concurrent.locks.ReentrantLock;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/terminal/Terminal.java b/projects/core/src/main/java/dan200/computercraft/core/terminal/Terminal.java
index 983a277e0..0e3a87def 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/terminal/Terminal.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/terminal/Terminal.java
@@ -5,8 +5,8 @@
package dan200.computercraft.core.terminal;
import dan200.computercraft.core.util.Colour;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
public class Terminal {
diff --git a/projects/core/src/main/java/dan200/computercraft/core/util/IoUtil.java b/projects/core/src/main/java/dan200/computercraft/core/util/IoUtil.java
index dc5e18e67..896b18503 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/util/IoUtil.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/util/IoUtil.java
@@ -4,7 +4,8 @@
package dan200.computercraft.core.util;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.io.Closeable;
import java.io.IOException;
diff --git a/projects/core/src/main/java/dan200/computercraft/core/util/Nullability.java b/projects/core/src/main/java/dan200/computercraft/core/util/Nullability.java
index 10b4e90fc..95383948d 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/util/Nullability.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/util/Nullability.java
@@ -4,7 +4,7 @@
package dan200.computercraft.core.util;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class Nullability {
private Nullability() {
diff --git a/projects/core/src/main/java/dan200/computercraft/core/util/PeripheralHelpers.java b/projects/core/src/main/java/dan200/computercraft/core/util/PeripheralHelpers.java
index 6ac48da4e..f304eafc3 100644
--- a/projects/core/src/main/java/dan200/computercraft/core/util/PeripheralHelpers.java
+++ b/projects/core/src/main/java/dan200/computercraft/core/util/PeripheralHelpers.java
@@ -5,8 +5,7 @@
package dan200.computercraft.core.util;
import dan200.computercraft.api.peripheral.IPeripheral;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Utilities for working with {@linkplain IPeripheral peripherals}.
diff --git a/projects/core/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java b/projects/core/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java
index 319057a84..43d61eafa 100644
--- a/projects/core/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java
+++ b/projects/core/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java
@@ -21,6 +21,7 @@ import dan200.computercraft.core.lua.MachineException;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.test.core.computer.BasicEnvironment;
import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.function.Executable;
import org.opentest4j.AssertionFailedError;
@@ -34,7 +35,6 @@ import org.squiddev.cobalt.debug.DebugFrame;
import org.squiddev.cobalt.debug.DebugHook;
import org.squiddev.cobalt.debug.DebugState;
-import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
diff --git a/projects/core/src/test/java/dan200/computercraft/core/apis/handles/BinaryReadableHandleTest.java b/projects/core/src/test/java/dan200/computercraft/core/apis/handles/BinaryReadableHandleTest.java
index 465847b20..3aae43988 100644
--- a/projects/core/src/test/java/dan200/computercraft/core/apis/handles/BinaryReadableHandleTest.java
+++ b/projects/core/src/test/java/dan200/computercraft/core/apis/handles/BinaryReadableHandleTest.java
@@ -5,9 +5,9 @@
package dan200.computercraft.core.apis.handles;
import dan200.computercraft.api.lua.LuaException;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
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 5dc674a98..98326a587 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
@@ -11,9 +11,9 @@ import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.computer.ComputerBootstrap;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.core.methods.ObjectSource;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
-import javax.annotation.Nullable;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
diff --git a/projects/core/src/test/java/dan200/computercraft/core/computer/computerthread/ComputerThreadRunner.java b/projects/core/src/test/java/dan200/computercraft/core/computer/computerthread/ComputerThreadRunner.java
index 6a76d929a..002b95074 100644
--- a/projects/core/src/test/java/dan200/computercraft/core/computer/computerthread/ComputerThreadRunner.java
+++ b/projects/core/src/test/java/dan200/computercraft/core/computer/computerthread/ComputerThreadRunner.java
@@ -4,12 +4,12 @@
package dan200.computercraft.core.computer.computerthread;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.core.computer.TimeoutState;
import dan200.computercraft.core.metrics.Metric;
import dan200.computercraft.core.metrics.MetricsObserver;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import javax.annotation.concurrent.GuardedBy;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
diff --git a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/ArbitraryByteBuffer.java b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/ArbitraryByteBuffer.java
index 2866e4206..fe3cdf963 100644
--- a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/ArbitraryByteBuffer.java
+++ b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/ArbitraryByteBuffer.java
@@ -6,8 +6,8 @@ package dan200.computercraft.test.core;
import net.jqwik.api.*;
import net.jqwik.api.arbitraries.SizableArbitrary;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.List;
diff --git a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/CloseScope.java b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/CloseScope.java
index 0b4d5b3d5..391596193 100644
--- a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/CloseScope.java
+++ b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/CloseScope.java
@@ -4,7 +4,8 @@
package dan200.computercraft.test.core;
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Objects;
diff --git a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/StructuralEqualities.java b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/StructuralEqualities.java
index 9517cc526..b5e2e0053 100644
--- a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/StructuralEqualities.java
+++ b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/StructuralEqualities.java
@@ -6,8 +6,8 @@ package dan200.computercraft.test.core;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
diff --git a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java
index dd75d2a32..f82b50468 100644
--- a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java
+++ b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java
@@ -14,8 +14,7 @@ import dan200.computercraft.core.filesystem.FileSystem;
import dan200.computercraft.core.metrics.MetricsObserver;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.test.core.computer.BasicEnvironment;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public abstract class BasicApiEnvironment implements IAPIEnvironment {
private final BasicEnvironment environment;
diff --git a/projects/core/src/testFixtures/kotlin/dan200/computercraft/test/core/computer/KotlinLuaMachine.kt b/projects/core/src/testFixtures/kotlin/dan200/computercraft/test/core/computer/KotlinLuaMachine.kt
index 1c3e193e4..cf15cdf63 100644
--- a/projects/core/src/testFixtures/kotlin/dan200/computercraft/test/core/computer/KotlinLuaMachine.kt
+++ b/projects/core/src/testFixtures/kotlin/dan200/computercraft/test/core/computer/KotlinLuaMachine.kt
@@ -21,7 +21,7 @@ abstract class KotlinLuaMachine(environment: MachineEnvironment) : ILuaMachine,
for (api in environment.apis) addApi(api)
}
- override fun handleEvent(eventName: String?, arguments: Array?): MachineResult {
+ override fun handleEvent(eventName: String?, arguments: Array?): MachineResult {
if (hasEventListeners) {
queueEvent(eventName, arguments)
} else {
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/CompositeBakedModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/CompositeBakedModel.java
index 00880515a..608829f71 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/CompositeBakedModel.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/CompositeBakedModel.java
@@ -15,8 +15,8 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Stream;
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java
index bc2c28650..aec192103 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java
@@ -19,10 +19,10 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.GsonHelper;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/EmissiveBakedModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/EmissiveBakedModel.java
index 3512eb896..4d3d18ea9 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/EmissiveBakedModel.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/EmissiveBakedModel.java
@@ -16,8 +16,8 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Supplier;
/**
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/FoiledModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/FoiledModel.java
index a0995211a..34313ebb5 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/FoiledModel.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/FoiledModel.java
@@ -18,8 +18,8 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Supplier;
/**
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
index 79f0dc03f..ac614c01c 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
@@ -16,8 +16,8 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
import java.util.function.Supplier;
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/TurtleModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/TurtleModel.java
index 704350b1a..dc83ddde5 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/TurtleModel.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/TurtleModel.java
@@ -12,8 +12,7 @@ import net.minecraft.client.renderer.block.model.ItemOverrides;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The custom model for turtle items, which renders tools and overlays as part of the model.
diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
index 8452d9e58..b8aebca17 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
@@ -26,8 +26,7 @@ import net.minecraft.network.protocol.game.ServerGamePacketListener;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.RandomSource;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class)
public class ClientPlatformHelperImpl implements ClientPlatformHelper {
@@ -52,7 +51,7 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper {
}
@Override
- public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
+ public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints) {
// Unfortunately we can't call Fabric's emitItemQuads here, as there's no way to obtain a RenderContext via the
// API. Instead, we special case our FoiledModel, and just render everything else normally.
var buffer = ItemRenderer.getFoilBuffer(buffers, Sheets.translucentCullBlockSheet(), true, model instanceof FoiledModel);
diff --git a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/BlockModelAccessor.java b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/BlockModelAccessor.java
index 497a5b9a4..10863f758 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/BlockModelAccessor.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/BlockModelAccessor.java
@@ -6,11 +6,10 @@ package dan200.computercraft.mixin.client;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.resources.ResourceLocation;
+import org.jspecify.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
-import javax.annotation.Nullable;
-
@Mixin(BlockModel.class)
public interface BlockModelAccessor {
@Accessor("parentLocation")
diff --git a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/SoundEngineMixin.java b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/SoundEngineMixin.java
index 943d3207a..b1d079e8f 100644
--- a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/SoundEngineMixin.java
+++ b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/SoundEngineMixin.java
@@ -9,14 +9,13 @@ import dan200.computercraft.client.sound.SpeakerManager;
import net.minecraft.client.resources.sounds.SoundInstance;
import net.minecraft.client.sounds.AudioStream;
import net.minecraft.client.sounds.SoundEngine;
+import org.jspecify.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import javax.annotation.Nullable;
-
import static dan200.computercraft.core.util.Nullability.assertNonNull;
@Mixin(SoundEngine.class)
diff --git a/projects/fabric/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java b/projects/fabric/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
index 14073805b..a14d95b76 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
@@ -13,8 +13,7 @@ import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
import net.fabricmc.fabric.api.transfer.v1.storage.StorageView;
import net.fabricmc.loader.api.FabricLoader;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@AutoService(ComputerCraftAPIService.class)
public final class ComputerCraftAPIImpl extends AbstractComputerCraftAPI implements ComputerCraftAPIFabricService {
diff --git a/projects/fabric/src/main/java/dan200/computercraft/impl/Peripherals.java b/projects/fabric/src/main/java/dan200/computercraft/impl/Peripherals.java
index ed3f2a6aa..dd9a1409e 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/impl/Peripherals.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/impl/Peripherals.java
@@ -11,8 +11,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The registry for peripheral providers.
diff --git a/projects/fabric/src/main/java/dan200/computercraft/mixin/ChunkMapMixin.java b/projects/fabric/src/main/java/dan200/computercraft/mixin/ChunkMapMixin.java
index f99aca02b..9f769c6e8 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/mixin/ChunkMapMixin.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/mixin/ChunkMapMixin.java
@@ -12,6 +12,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.chunk.LevelChunk;
import org.apache.commons.lang3.mutable.MutableObject;
+import org.jspecify.annotations.Nullable;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -20,8 +21,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-import javax.annotation.Nullable;
-
@Mixin(ChunkMap.class)
class ChunkMapMixin {
@Final
diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/FabricCommonHooks.java b/projects/fabric/src/main/java/dan200/computercraft/shared/FabricCommonHooks.java
index 73a1ab689..62a72277b 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/shared/FabricCommonHooks.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/shared/FabricCommonHooks.java
@@ -18,8 +18,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class FabricCommonHooks {
public static boolean onBlockDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity) {
diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java b/projects/fabric/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
index f14753d37..5db5b9da3 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
@@ -22,8 +22,8 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/FabricConfigFile.java b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/FabricConfigFile.java
index b31f6ba2b..2765b17c9 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/FabricConfigFile.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/FabricConfigFile.java
@@ -12,10 +12,10 @@ import com.electronwill.nightconfig.core.io.WritingMode;
import com.google.errorprone.annotations.concurrent.GuardedBy;
import dan200.computercraft.shared.config.ConfigFile;
import org.apache.commons.lang3.function.TriFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
index 700f8a777..802b069cd 100644
--- a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
+++ b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
@@ -77,8 +77,8 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.Vec3;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -207,7 +207,7 @@ public class PlatformHelperImpl implements PlatformHelper {
}
@Override
- @SuppressWarnings({ "UnstableApiUsage", "NullAway" }) // FIXME: SIDED is treated as nullable by NullAway
+ @SuppressWarnings("UnstableApiUsage")
public @Nullable ContainerTransfer getContainer(ServerLevel level, BlockPos pos, Direction side) {
var storage = ItemStorage.SIDED.find(level, pos, side);
if (storage != null) return FabricContainerTransfer.of(storage);
@@ -258,7 +258,7 @@ public class PlatformHelperImpl implements PlatformHelper {
@Override
public int getBurnTime(ItemStack stack) {
- @Nullable var fuel = FuelRegistry.INSTANCE.get(stack.getItem());
+ var fuel = FuelRegistry.INSTANCE.get(stack.getItem());
return fuel == null ? 0 : fuel;
}
diff --git a/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java b/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java
index c351b79ee..7f71173ed 100644
--- a/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java
+++ b/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java
@@ -14,7 +14,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.BakedModelWrapper;
import net.minecraftforge.client.model.data.ModelData;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java b/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
index 2d457fe52..c36f4de2a 100644
--- a/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
+++ b/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java
@@ -14,8 +14,8 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.BakedModelWrapper;
import net.minecraftforge.client.model.data.ModelData;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.List;
/**
diff --git a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
index 612a79225..86fb1fe4c 100644
--- a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
+++ b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java
@@ -24,8 +24,8 @@ import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.model.data.ModelData;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Arrays;
@AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class)
@@ -49,7 +49,7 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper {
}
@Override
- public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
+ public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints) {
for (var renderType : model.getRenderTypes(ItemStack.EMPTY, true)) {
var buffer = buffers.getBuffer(renderType);
for (var face : directions) {
diff --git a/projects/forge/src/examples/java/com/example/examplemod/ForgeExampleMod.java b/projects/forge/src/examples/java/com/example/examplemod/ForgeExampleMod.java
index e54f0f6fb..34b8e6e95 100644
--- a/projects/forge/src/examples/java/com/example/examplemod/ForgeExampleMod.java
+++ b/projects/forge/src/examples/java/com/example/examplemod/ForgeExampleMod.java
@@ -18,8 +18,8 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.RegisterEvent;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.function.Function;
/**
diff --git a/projects/forge/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java b/projects/forge/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
index 597a71618..f493a52a0 100644
--- a/projects/forge/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
+++ b/projects/forge/src/main/java/dan200/computercraft/impl/ComputerCraftAPIImpl.java
@@ -18,8 +18,7 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.ModList;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import static dan200.computercraft.shared.Capabilities.CAPABILITY_WIRED_ELEMENT;
diff --git a/projects/forge/src/main/java/dan200/computercraft/impl/Peripherals.java b/projects/forge/src/main/java/dan200/computercraft/impl/Peripherals.java
index 916af6367..25a904450 100644
--- a/projects/forge/src/main/java/dan200/computercraft/impl/Peripherals.java
+++ b/projects/forge/src/main/java/dan200/computercraft/impl/Peripherals.java
@@ -16,10 +16,10 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.capabilities.Capability;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Objects;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/FluidMethods.java b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/FluidMethods.java
index 4408b8b95..d979be7ba 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/FluidMethods.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/FluidMethods.java
@@ -16,8 +16,8 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
index d1c109485..adcb59459 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java
@@ -17,8 +17,8 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/FakePlayerExt.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/FakePlayerExt.java
index ad32e9280..eb493bd60 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/FakePlayerExt.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/FakePlayerExt.java
@@ -13,8 +13,8 @@ import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.common.util.FakePlayer;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.OptionalInt;
import static dan200.computercraft.shared.platform.FakePlayerConstants.MAX_REACH;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/NetworkHandler.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/NetworkHandler.java
index 1c07b3b24..02f8f08e5 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/NetworkHandler.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/NetworkHandler.java
@@ -20,10 +20,10 @@ import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.util.function.Function;
import static dan200.computercraft.core.util.Nullability.assertNonNull;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
index c4c54ea20..e58d4a385 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java
@@ -77,8 +77,8 @@ import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager;
import net.minecraftforge.registries.RegistryObject;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityProvider.java b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityProvider.java
index 4c5b2ca14..b28d61adf 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityProvider.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityProvider.java
@@ -12,8 +12,8 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.AttachCapabilitiesEvent;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java
index 8e4b9c204..a028d843d 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java
@@ -9,8 +9,7 @@ import net.minecraft.core.Direction;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
-
-import javax.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public final class CapabilityUtil {
private CapabilityUtil() {
@@ -22,7 +21,7 @@ public final class CapabilityUtil {
return null;
}
- public static void invalidate(@Nullable LazyOptional[] caps) {
+ public static void invalidate(@Nullable LazyOptional @Nullable [] caps) {
if (caps == null) return;
for (var i = 0; i < caps.length; i++) {
diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/util/SidedCapabilityProvider.java b/projects/forge/src/main/java/dan200/computercraft/shared/util/SidedCapabilityProvider.java
index eb50ef21a..8614e8795 100644
--- a/projects/forge/src/main/java/dan200/computercraft/shared/util/SidedCapabilityProvider.java
+++ b/projects/forge/src/main/java/dan200/computercraft/shared/util/SidedCapabilityProvider.java
@@ -12,8 +12,8 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.AttachCapabilitiesEvent;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.util.Objects;
import java.util.function.BooleanSupplier;
@@ -31,7 +31,7 @@ public final class SidedCapabilityProvider implements ICapabilityProvider {
private final Capability cap;
private final Provider supplier;
private final BooleanSupplier isRemoved;
- private @Nullable LazyOptional[] instances;
+ private @Nullable LazyOptional @Nullable [] instances;
private SidedCapabilityProvider(Capability cap, Provider supplier, BooleanSupplier isRemoved) {
this.cap = Objects.requireNonNull(cap, "Capability cannot be null");
diff --git a/projects/lints/src/main/kotlin/cc/tweaked/linter/ForbiddenImport.kt b/projects/lints/src/main/kotlin/cc/tweaked/linter/ForbiddenImport.kt
new file mode 100644
index 000000000..fa10f9795
--- /dev/null
+++ b/projects/lints/src/main/kotlin/cc/tweaked/linter/ForbiddenImport.kt
@@ -0,0 +1,56 @@
+// SPDX-FileCopyrightText: 2025 The CC: Tweaked Developers
+//
+// SPDX-License-Identifier: MPL-2.0
+
+@file:Suppress("JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE")
+
+package cc.tweaked.linter
+
+import com.google.errorprone.BugPattern
+import com.google.errorprone.VisitorState
+import com.google.errorprone.bugpatterns.BugChecker
+import com.google.errorprone.fixes.SuggestedFix
+import com.google.errorprone.matchers.Description
+import com.google.errorprone.util.ASTHelpers
+import com.sun.source.tree.ImportTree
+import com.sun.source.tree.Tree
+
+@BugPattern(
+ summary = "Checks for forbidden imports.",
+ severity = BugPattern.SeverityLevel.ERROR,
+ tags = [BugPattern.StandardTags.LIKELY_ERROR],
+)
+class ForbiddenImport : BugChecker(), BugChecker.ImportTreeMatcher {
+ override fun matchImport(tree: ImportTree, state: VisitorState): Description {
+ if (tree.isStatic || tree.qualifiedIdentifier.kind != Tree.Kind.MEMBER_SELECT) return Description.NO_MATCH
+
+ val sym = ASTHelpers.getSymbol(tree.qualifiedIdentifier) ?: return Description.NO_MATCH
+ val importedName = sym.qualifiedName.toString()
+ if (!IMPORTS.contains(importedName)) return Description.NO_MATCH
+
+ val message = buildDescription(tree.qualifiedIdentifier).setMessage("Cannot import this symbol")
+ val replacement = ALTERNATIVE_IMPORTS[importedName]
+ if (replacement != null) message.addFix(SuggestedFix.replace(tree.qualifiedIdentifier, replacement))
+
+ return message.build()
+ }
+
+ companion object {
+ private val ALTERNATIVE_IMPORTS = mapOf(
+ // Ban JSR 305 and JetBrains @Nullable, and prefer the JSpecify one.
+ "org.javax.annotation.Nullable" to "org.jspecify.annotations.Nullable",
+ "org.jetbrains.annotations.Nullable" to "org.jspecify.annotations.Nullable",
+ // Prefer ErrorProne annotations over JSR ones.
+ "javax.annotation.CheckReturnValue" to "com.google.errorprone.annotations.CheckReturnValue",
+ "javax.annotation.OverridingMethodsMustInvokeSuper" to "com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper",
+ "javax.annotation.concurrent.GuardedBy" to "com.google.errorprone.annotations.concurrent.GuardedBy",
+ )
+
+ private val IMPORTS: Set = setOf(
+ // We ban all @Nonnull annotations, because that should be default already.
+ "javax.annotation.Nonnull",
+ "org.jetbrains.annotations.NotNull",
+ "org.jspecify.annotations.NonNull",
+ ) + ALTERNATIVE_IMPORTS.keys
+ }
+}
diff --git a/projects/lints/src/main/resources/META-INF/services/com.google.errorprone.bugpatterns.BugChecker b/projects/lints/src/main/resources/META-INF/services/com.google.errorprone.bugpatterns.BugChecker
index 388a1372a..075ac218b 100644
--- a/projects/lints/src/main/resources/META-INF/services/com.google.errorprone.bugpatterns.BugChecker
+++ b/projects/lints/src/main/resources/META-INF/services/com.google.errorprone.bugpatterns.BugChecker
@@ -2,6 +2,7 @@
#
# SPDX-License-Identifier: MPL-2.0
cc.tweaked.linter.ExtraMustCallSuper
+cc.tweaked.linter.ForbiddenImport
cc.tweaked.linter.LoaderOverride
cc.tweaked.linter.MissingLoaderOverride
cc.tweaked.linter.SideChecker
diff --git a/projects/lints/src/test/java/cc/tweaked/linter/TestForbiddenImport.java b/projects/lints/src/test/java/cc/tweaked/linter/TestForbiddenImport.java
new file mode 100644
index 000000000..9e90dbcf9
--- /dev/null
+++ b/projects/lints/src/test/java/cc/tweaked/linter/TestForbiddenImport.java
@@ -0,0 +1,39 @@
+// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
+//
+// SPDX-License-Identifier: MPL-2.0
+
+package cc.tweaked.linter;
+
+import com.google.common.base.Predicates;
+import com.google.errorprone.CompilationTestHelper;
+import org.junit.jupiter.api.Test;
+
+public class TestForbiddenImport {
+ private final CompilationTestHelper compilationHelper = CompilationTestHelper.newInstance(ForbiddenImport.class, getClass());
+
+ @Test
+ public void testForbiddenImport() {
+ compilationHelper
+ .addSourceLines("Import.java", """
+ // BUG: Diagnostic matches: X
+ import org.jspecify.annotations.NonNull;
+ class X {
+ }
+ """)
+ .expectErrorMessage("X", Predicates.containsPattern("Cannot import this symbol"))
+ .doTest();
+ }
+
+ @Test
+ public void testForbiddenImportSuggestion() {
+ compilationHelper
+ .addSourceLines("Import.java", """
+ // BUG: Diagnostic matches: X
+ import javax.annotation.concurrent.GuardedBy;
+ class X {
+ }
+ """)
+ .expectErrorMessage("X", Predicates.containsPattern("Did you mean 'import com.google.errorprone.annotations.concurrent.GuardedBy;'"))
+ .doTest();
+ }
+}
diff --git a/projects/standalone/src/main/java/cc/tweaked/standalone/Main.java b/projects/standalone/src/main/java/cc/tweaked/standalone/Main.java
index 35411959f..ad96dce4d 100644
--- a/projects/standalone/src/main/java/cc/tweaked/standalone/Main.java
+++ b/projects/standalone/src/main/java/cc/tweaked/standalone/Main.java
@@ -20,6 +20,7 @@ import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.core.util.Colour;
import org.apache.commons.cli.*;
import org.jetbrains.annotations.Contract;
+import org.jspecify.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.opengl.GL;
@@ -29,7 +30,6 @@ import org.lwjgl.system.MemoryStack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
diff --git a/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneComputerEnvironment.java b/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneComputerEnvironment.java
index 74527be6e..da10d46bd 100644
--- a/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneComputerEnvironment.java
+++ b/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneComputerEnvironment.java
@@ -9,10 +9,10 @@ import dan200.computercraft.core.computer.ComputerEnvironment;
import dan200.computercraft.core.filesystem.MemoryMount;
import dan200.computercraft.core.filesystem.WritableFileMount;
import dan200.computercraft.core.metrics.MetricsObserver;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
import java.nio.file.Path;
/**
diff --git a/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneGlobalEnvironment.java b/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneGlobalEnvironment.java
index c454645a8..a7a548be9 100644
--- a/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneGlobalEnvironment.java
+++ b/projects/standalone/src/main/java/cc/tweaked/standalone/StandaloneGlobalEnvironment.java
@@ -7,7 +7,7 @@ package cc.tweaked.standalone;
import dan200.computercraft.api.filesystem.Mount;
import dan200.computercraft.core.computer.GlobalEnvironment;
import dan200.computercraft.core.filesystem.FileMount;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/projects/web/src/builder/java/cc/tweaked/web/builder/PatchCobalt.java b/projects/web/src/builder/java/cc/tweaked/web/builder/PatchCobalt.java
index 6b623f4a5..644e6929e 100644
--- a/projects/web/src/builder/java/cc/tweaked/web/builder/PatchCobalt.java
+++ b/projects/web/src/builder/java/cc/tweaked/web/builder/PatchCobalt.java
@@ -4,13 +4,12 @@
package cc.tweaked.web.builder;
+import org.jspecify.annotations.Nullable;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
-import javax.annotation.Nullable;
-
import static org.objectweb.asm.Opcodes.*;
/**
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 23c50616c..0bd15b413 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
@@ -4,13 +4,13 @@
package cc.tweaked.web.builder;
+import org.jspecify.annotations.Nullable;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
-import javax.annotation.Nullable;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
diff --git a/projects/web/src/main/java/cc/tweaked/web/EmulatedComputer.java b/projects/web/src/main/java/cc/tweaked/web/EmulatedComputer.java
index c39467d74..66e760443 100644
--- a/projects/web/src/main/java/cc/tweaked/web/EmulatedComputer.java
+++ b/projects/web/src/main/java/cc/tweaked/web/EmulatedComputer.java
@@ -21,13 +21,13 @@ import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.core.filesystem.MemoryMount;
import dan200.computercraft.core.metrics.MetricsObserver;
import dan200.computercraft.core.terminal.Terminal;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.teavm.jso.JSObject;
import org.teavm.jso.core.JSString;
import org.teavm.jso.typedarrays.ArrayBuffer;
-import javax.annotation.Nullable;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Objects;
diff --git a/projects/web/src/main/java/cc/tweaked/web/EmulatorEnvironment.java b/projects/web/src/main/java/cc/tweaked/web/EmulatorEnvironment.java
index 7230cfa23..bd1d418e9 100644
--- a/projects/web/src/main/java/cc/tweaked/web/EmulatorEnvironment.java
+++ b/projects/web/src/main/java/cc/tweaked/web/EmulatorEnvironment.java
@@ -7,8 +7,8 @@ package cc.tweaked.web;
import cc.tweaked.web.js.Callbacks;
import dan200.computercraft.api.filesystem.Mount;
import dan200.computercraft.core.computer.GlobalEnvironment;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -21,7 +21,7 @@ final class EmulatorEnvironment implements GlobalEnvironment {
private final String version = Callbacks.getModVersion();
private @Nullable ResourceMount romMount;
- private @Nullable byte[] bios;
+ private byte @Nullable [] bios;
private EmulatorEnvironment() {
}
diff --git a/projects/web/src/main/java/cc/tweaked/web/ResourceMount.java b/projects/web/src/main/java/cc/tweaked/web/ResourceMount.java
index b6877dd24..bbbc803c8 100644
--- a/projects/web/src/main/java/cc/tweaked/web/ResourceMount.java
+++ b/projects/web/src/main/java/cc/tweaked/web/ResourceMount.java
@@ -7,8 +7,8 @@ package cc.tweaked.web;
import cc.tweaked.web.js.Callbacks;
import dan200.computercraft.core.apis.handles.ArrayByteChannel;
import dan200.computercraft.core.filesystem.AbstractInMemoryMount;
+import org.jspecify.annotations.Nullable;
-import javax.annotation.Nullable;
import java.nio.channels.SeekableByteChannel;
/**
@@ -43,7 +43,7 @@ final class ResourceMount extends AbstractInMemoryMount
protected static final class FileEntry extends AbstractInMemoryMount.FileEntry {
private final String path;
- private @Nullable byte[] contents;
+ private byte @Nullable [] contents;
FileEntry(String path) {
this.path = path;
diff --git a/projects/web/src/main/java/cc/tweaked/web/js/ComputerDisplay.java b/projects/web/src/main/java/cc/tweaked/web/js/ComputerDisplay.java
index ecd5b9a2f..2cc6c194d 100644
--- a/projects/web/src/main/java/cc/tweaked/web/js/ComputerDisplay.java
+++ b/projects/web/src/main/java/cc/tweaked/web/js/ComputerDisplay.java
@@ -4,10 +4,9 @@
package cc.tweaked.web.js;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.JSObject;
-import javax.annotation.Nullable;
-
/**
* The Javascript-side terminal which displays this computer.
*
diff --git a/projects/web/src/main/java/cc/tweaked/web/js/ComputerHandle.java b/projects/web/src/main/java/cc/tweaked/web/js/ComputerHandle.java
index 87fd462f7..687271b8a 100644
--- a/projects/web/src/main/java/cc/tweaked/web/js/ComputerHandle.java
+++ b/projects/web/src/main/java/cc/tweaked/web/js/ComputerHandle.java
@@ -4,13 +4,12 @@
package cc.tweaked.web.js;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.JSObject;
import org.teavm.jso.JSProperty;
import org.teavm.jso.core.JSString;
import org.teavm.jso.typedarrays.ArrayBuffer;
-import javax.annotation.Nullable;
-
/**
* A Javascript-facing interface for controlling computers.
*/
diff --git a/projects/web/src/main/java/cc/tweaked/web/js/JavascriptConv.java b/projects/web/src/main/java/cc/tweaked/web/js/JavascriptConv.java
index 713fc0934..46216c579 100644
--- a/projects/web/src/main/java/cc/tweaked/web/js/JavascriptConv.java
+++ b/projects/web/src/main/java/cc/tweaked/web/js/JavascriptConv.java
@@ -5,6 +5,7 @@
package cc.tweaked.web.js;
import org.jetbrains.annotations.Contract;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSByRef;
import org.teavm.jso.JSObject;
@@ -15,7 +16,6 @@ import org.teavm.jso.core.JSString;
import org.teavm.jso.typedarrays.ArrayBuffer;
import org.teavm.jso.typedarrays.Int8Array;
-import javax.annotation.Nullable;
import java.nio.ByteBuffer;
/**
@@ -29,7 +29,7 @@ public class JavascriptConv {
* @return The converted value.
*/
@Contract("null -> null; !null -> !null")
- public static @Nullable Object[] toJava(@Nullable JSObject[] value) {
+ public static @Nullable Object @Nullable [] toJava(@Nullable JSObject @Nullable [] value) {
if (value == null) return null;
var out = new Object[value.length];
for (var i = 0; i < value.length; i++) out[i] = toJava(value[i]);
diff --git a/projects/web/src/main/java/cc/tweaked/web/peripheral/AudioState.java b/projects/web/src/main/java/cc/tweaked/web/peripheral/AudioState.java
index 9e3f5838c..fc2194286 100644
--- a/projects/web/src/main/java/cc/tweaked/web/peripheral/AudioState.java
+++ b/projects/web/src/main/java/cc/tweaked/web/peripheral/AudioState.java
@@ -6,10 +6,10 @@ package cc.tweaked.web.peripheral;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaTable;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.webaudio.AudioBuffer;
import org.teavm.jso.webaudio.AudioContext;
-import javax.annotation.Nullable;
import java.util.Optional;
import static cc.tweaked.web.peripheral.SpeakerPeripheral.SAMPLE_RATE;
diff --git a/projects/web/src/main/java/cc/tweaked/web/peripheral/SpeakerPeripheral.java b/projects/web/src/main/java/cc/tweaked/web/peripheral/SpeakerPeripheral.java
index d4f57ad3b..930f70fd6 100644
--- a/projects/web/src/main/java/cc/tweaked/web/peripheral/SpeakerPeripheral.java
+++ b/projects/web/src/main/java/cc/tweaked/web/peripheral/SpeakerPeripheral.java
@@ -10,9 +10,9 @@ import dan200.computercraft.api.lua.LuaTable;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.webaudio.AudioContext;
-import javax.annotation.Nullable;
import java.util.Optional;
import static dan200.computercraft.api.lua.LuaValues.checkFinite;
diff --git a/projects/web/src/main/java/dan200/computercraft/core/apis/http/request/THttpRequest.java b/projects/web/src/main/java/dan200/computercraft/core/apis/http/request/THttpRequest.java
index 13f9d48ee..08a2081da 100644
--- a/projects/web/src/main/java/dan200/computercraft/core/apis/http/request/THttpRequest.java
+++ b/projects/web/src/main/java/dan200/computercraft/core/apis/http/request/THttpRequest.java
@@ -16,12 +16,12 @@ import dan200.computercraft.core.apis.http.ResourceGroup;
import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.teavm.jso.ajax.XMLHttpRequest;
import org.teavm.jso.typedarrays.ArrayBuffer;
-import javax.annotation.Nullable;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
diff --git a/projects/web/src/main/java/dan200/computercraft/core/apis/http/websocket/TWebsocket.java b/projects/web/src/main/java/dan200/computercraft/core/apis/http/websocket/TWebsocket.java
index 671eeb506..f9154cc5f 100644
--- a/projects/web/src/main/java/dan200/computercraft/core/apis/http/websocket/TWebsocket.java
+++ b/projects/web/src/main/java/dan200/computercraft/core/apis/http/websocket/TWebsocket.java
@@ -13,10 +13,10 @@ import dan200.computercraft.core.apis.http.ResourceGroup;
import dan200.computercraft.core.apis.http.options.Action;
import dan200.computercraft.core.apis.http.options.Options;
import io.netty.handler.codec.http.HttpHeaders;
+import org.jspecify.annotations.Nullable;
import org.teavm.jso.typedarrays.Int8Array;
import org.teavm.jso.websocket.WebSocket;
-import javax.annotation.Nullable;
import java.net.URI;
import java.nio.ByteBuffer;
diff --git a/projects/web/src/main/java/dan200/computercraft/core/asm/MethodReflection.java b/projects/web/src/main/java/dan200/computercraft/core/asm/MethodReflection.java
index 96c3ed889..350bd268b 100644
--- a/projects/web/src/main/java/dan200/computercraft/core/asm/MethodReflection.java
+++ b/projects/web/src/main/java/dan200/computercraft/core/asm/MethodReflection.java
@@ -13,9 +13,9 @@ import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.peripheral.PeripheralType;
import dan200.computercraft.core.methods.LuaMethod;
import dan200.computercraft.core.methods.NamedMethod;
+import org.jspecify.annotations.Nullable;
import org.teavm.metaprogramming.*;
-import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
diff --git a/projects/web/src/main/java/dan200/computercraft/core/asm/StaticGenerator.java b/projects/web/src/main/java/dan200/computercraft/core/asm/StaticGenerator.java
index dddf9a7af..945c86246 100644
--- a/projects/web/src/main/java/dan200/computercraft/core/asm/StaticGenerator.java
+++ b/projects/web/src/main/java/dan200/computercraft/core/asm/StaticGenerator.java
@@ -11,12 +11,12 @@ import com.google.common.primitives.Primitives;
import com.google.common.reflect.TypeToken;
import dan200.computercraft.api.lua.*;
import dan200.computercraft.core.methods.LuaMethod;
+import org.jspecify.annotations.Nullable;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Type;
import org.teavm.metaprogramming.ReflectClass;
-import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.nio.ByteBuffer;
@@ -124,8 +124,7 @@ public final class StaticGenerator {
}
}
- @Nullable
- private byte[] generate(String className, Class> target, Method targetMethod, boolean unsafe) {
+ private byte @Nullable [] generate(String className, Class> target, Method targetMethod, boolean unsafe) {
var internalName = className.replace(".", "/");
// Construct a public final class which extends Object and implements MethodInstance.Delegate
@@ -207,8 +206,7 @@ public final class StaticGenerator {
return cw.toByteArray();
}
- @Nullable
- private Boolean loadArg(MethodVisitor mw, Class> target, Method method, boolean unsafe, java.lang.reflect.Type genericArg, int argIndex) {
+ private @Nullable Boolean loadArg(MethodVisitor mw, Class> target, Method method, boolean unsafe, java.lang.reflect.Type genericArg, int argIndex) {
if (genericArg == target) {
mw.visitVarInsn(ALOAD, 1);
mw.visitTypeInsn(CHECKCAST, Type.getInternalName(target));