diff --git a/.checkstyle/checkstyle.xml b/.checkstyle/checkstyle.xml index bf884a0..245d331 100644 --- a/.checkstyle/checkstyle.xml +++ b/.checkstyle/checkstyle.xml @@ -101,6 +101,7 @@ + diff --git a/build.gradle.kts b/build.gradle.kts index d8da954..d938bc3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,6 +10,7 @@ plugins { dependencies { compileOnlyApi(libs.jetbrainsAnnotations) + compileOnlyApi(libs.jspecify) testImplementation(platform(libs.junit.bom)) testImplementation(libs.junit.api) testRuntimeOnly(libs.junit.engine) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e744a54..2ca06e0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ junit = "5.11.4" [libraries] jetbrainsAnnotations = "org.jetbrains:annotations:26.0.2" +jspecify = { module = "org.jspecify:jspecify", version = "1.0.0"} junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } junit-api = { module = "org.junit.jupiter:junit-jupiter-api" } junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine" } @@ -24,4 +25,4 @@ indra-crossdoc = { id = "net.kyori.indra.crossdoc", version.ref = "indra" } indra-licenser-spotless = { id = "net.kyori.indra.licenser.spotless", version.ref = "indra" } indra-publishing-sonatype = { id = "net.kyori.indra.publishing.sonatype", version.ref = "indra" } nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version = "2.0.0" } -spotless = "com.diffplug.spotless:7.0.2" \ No newline at end of file +spotless = "com.diffplug.spotless:7.0.2" diff --git a/src/main/java/net/kyori/option/Option.java b/src/main/java/net/kyori/option/Option.java index 6e4c52e..c289c2e 100644 --- a/src/main/java/net/kyori/option/Option.java +++ b/src/main/java/net/kyori/option/Option.java @@ -25,8 +25,7 @@ import net.kyori.option.value.ValueType; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A representation of a configurable option. @@ -80,7 +79,7 @@ static > Option enumOption(final String id, final Class * @return the flag id * @since 1.0.0 */ - @NotNull String id(); + String id(); /** * Get the type of the option value. @@ -90,7 +89,7 @@ static > Option enumOption(final String id, final Class * @deprecated for removal since 1.1.0, use {@link #valueType()} instead */ @Deprecated - default @NotNull Class type() { + default Class type() { return this.valueType().type(); } @@ -100,7 +99,7 @@ static > Option enumOption(final String id, final Class * @return the value type * @since 1.0.0 */ - @NotNull ValueType valueType(); + ValueType valueType(); /** * Get a default value for the option, if any is present. diff --git a/src/main/java/net/kyori/option/OptionImpl.java b/src/main/java/net/kyori/option/OptionImpl.java index 0e61017..de5bf7f 100644 --- a/src/main/java/net/kyori/option/OptionImpl.java +++ b/src/main/java/net/kyori/option/OptionImpl.java @@ -25,8 +25,7 @@ import java.util.Objects; import net.kyori.option.value.ValueType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; final class OptionImpl implements Option { @@ -34,19 +33,19 @@ final class OptionImpl implements Option { private final ValueType type; private final @Nullable V defaultValue; // excluded from equality comparisons, it does not form part of the option identity - OptionImpl(final @NotNull String id, final @NotNull ValueType type, final @Nullable V defaultValue) { + OptionImpl(final String id, final ValueType type, final @Nullable V defaultValue) { this.id = id; this.type = type; this.defaultValue = defaultValue; } @Override - public @NotNull String id() { + public String id() { return this.id; } @Override - public @NotNull ValueType valueType() { + public ValueType valueType() { return this.type; } diff --git a/src/main/java/net/kyori/option/OptionSchema.java b/src/main/java/net/kyori/option/OptionSchema.java index a2fc186..0fc48ee 100644 --- a/src/main/java/net/kyori/option/OptionSchema.java +++ b/src/main/java/net/kyori/option/OptionSchema.java @@ -25,8 +25,7 @@ import java.util.Set; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -45,7 +44,7 @@ public interface OptionSchema { * @return the global schema * @since 1.1.0 */ - static OptionSchema.@NotNull Mutable globalSchema() { + static OptionSchema.Mutable globalSchema() { return OptionSchemaImpl.Instances.GLOBAL; } @@ -58,7 +57,7 @@ public interface OptionSchema { * @return the mutable child schema * @since 1.1.0 */ - static OptionSchema.@NotNull Mutable childSchema(final @NotNull OptionSchema schema) { + static OptionSchema.Mutable childSchema(final OptionSchema schema) { final OptionSchemaImpl impl; if (schema instanceof OptionSchemaImpl.MutableImpl) { impl = (OptionSchemaImpl) ((Mutable) schema).frozenView(); @@ -76,7 +75,7 @@ public interface OptionSchema { * @return a mutable schema * @since 1.1.0 */ - static OptionSchema.@NotNull Mutable emptySchema() { + static OptionSchema.Mutable emptySchema() { return new OptionSchemaImpl(null).new MutableImpl(); } @@ -86,7 +85,7 @@ public interface OptionSchema { * @return known options * @since 1.1.0 */ - @NotNull Set> knownOptions(); + Set> knownOptions(); /** * Return whether the provided option is known within this scheam. @@ -95,7 +94,7 @@ public interface OptionSchema { * @return whether the option is known * @since 1.1.0 */ - boolean has(final @NotNull Option option); + boolean has(final Option option); /** * Create a builder for an unversioned option state containing only options within this schema. @@ -103,7 +102,7 @@ public interface OptionSchema { * @return the builder * @since 1.1.0 */ - OptionState.@NotNull Builder stateBuilder(); + OptionState.Builder stateBuilder(); /** * Create a builder for a versioned option state containing only values for options within this schema. @@ -111,7 +110,7 @@ public interface OptionSchema { * @return the builder * @since 1.1.0 */ - OptionState.@NotNull VersionedBuilder versionedStateBuilder(); + OptionState.VersionedBuilder versionedStateBuilder(); /** * Create an empty option state within this schema. @@ -138,7 +137,7 @@ interface Mutable extends OptionSchema { * @return the flag instance * @since 1.1.0 */ - @NotNull Option stringOption(final @NotNull String id, final @Nullable String defaultValue); + Option stringOption(final String id, final @Nullable String defaultValue); /** * Create an option with a boolean value type. @@ -150,7 +149,7 @@ interface Mutable extends OptionSchema { * @return the flag instance * @since 1.1.0 */ - @NotNull Option booleanOption(final @NotNull String id, final boolean defaultValue); + Option booleanOption(final String id, final boolean defaultValue); /** * Create an option with an integer value type. @@ -162,7 +161,7 @@ interface Mutable extends OptionSchema { * @return the flag instance * @since 1.1.0 */ - @NotNull Option intOption(final @NotNull String id, final int defaultValue); + Option intOption(final String id, final int defaultValue); /** * Create an option with a double value type. @@ -174,7 +173,7 @@ interface Mutable extends OptionSchema { * @return the flag instance * @since 1.1.0 */ - @NotNull Option doubleOption(final @NotNull String id, final double defaultValue); + Option doubleOption(final String id, final double defaultValue); /** * Create an option with an enum value type. @@ -188,7 +187,7 @@ interface Mutable extends OptionSchema { * @return the flag instance * @since 1.1.0 */ - > @NotNull Option enumOption(final @NotNull String id, final @NotNull Class enumClazz, final @Nullable E defaultValue); + > Option enumOption(final String id, final Class enumClazz, final @Nullable E defaultValue); /** * Return a view of this schema which does not allow consumers to register new options. @@ -198,6 +197,6 @@ interface Mutable extends OptionSchema { * @return the frozen view of this schema * @since 1.1.0 */ - @NotNull OptionSchema frozenView(); + OptionSchema frozenView(); } } diff --git a/src/main/java/net/kyori/option/OptionSchemaImpl.java b/src/main/java/net/kyori/option/OptionSchemaImpl.java index 9f82f8b..f0fbe04 100644 --- a/src/main/java/net/kyori/option/OptionSchemaImpl.java +++ b/src/main/java/net/kyori/option/OptionSchemaImpl.java @@ -30,8 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import net.kyori.option.value.ValueType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -47,23 +46,23 @@ final class OptionSchemaImpl implements OptionSchema { } @Override - public @NotNull Set> knownOptions() { + public Set> knownOptions() { return Collections.unmodifiableSet(new HashSet<>(this.options.values())); } @Override - public boolean has(final @NotNull Option option) { + public boolean has(final Option option) { final Option own = this.options.get(option.id()); return own != null && own.equals(option); } @Override - public OptionState.@NotNull Builder stateBuilder() { + public OptionState.Builder stateBuilder() { return new OptionStateImpl.BuilderImpl(this); } @Override - public OptionState.@NotNull VersionedBuilder versionedStateBuilder() { + public OptionState.VersionedBuilder versionedStateBuilder() { return new OptionStateImpl.VersionedBuilderImpl(this); } @@ -99,54 +98,54 @@ Option register(final String id, final ValueType type, final @Nullable } @Override - public @NotNull Option stringOption(final @NotNull String id, final @Nullable String defaultValue) { + public Option stringOption(final String id, final @Nullable String defaultValue) { return this.register(id, ValueType.stringType(), defaultValue); } @Override - public @NotNull Option booleanOption(final @NotNull String id, final boolean defaultValue) { + public Option booleanOption(final String id, final boolean defaultValue) { return this.register(id, ValueType.booleanType(), defaultValue); } @Override - public @NotNull Option intOption(final @NotNull String id, final int defaultValue) { + public Option intOption(final String id, final int defaultValue) { return this.register(id, ValueType.integerType(), defaultValue); } @Override - public @NotNull Option doubleOption(final @NotNull String id, final double defaultValue) { + public Option doubleOption(final String id, final double defaultValue) { return this.register(id, ValueType.doubleType(), defaultValue); } @Override - public @NotNull > Option enumOption(final @NotNull String id, final @NotNull Class enumClazz, final @Nullable E defaultValue) { + public > Option enumOption(final String id, final Class enumClazz, final @Nullable E defaultValue) { return this.register(id, ValueType.enumType(enumClazz), defaultValue); } @Override - public @NotNull OptionSchema frozenView() { + public OptionSchema frozenView() { return OptionSchemaImpl.this; } // base scheam methods @Override - public @NotNull Set> knownOptions() { + public Set> knownOptions() { return OptionSchemaImpl.this.knownOptions(); } @Override - public boolean has(final @NotNull Option option) { + public boolean has(final Option option) { return OptionSchemaImpl.this.has(option); } @Override - public OptionState.@NotNull Builder stateBuilder() { + public OptionState.Builder stateBuilder() { return OptionSchemaImpl.this.stateBuilder(); } @Override - public OptionState.@NotNull VersionedBuilder versionedStateBuilder() { + public OptionState.VersionedBuilder versionedStateBuilder() { return OptionSchemaImpl.this.versionedStateBuilder(); } diff --git a/src/main/java/net/kyori/option/OptionState.java b/src/main/java/net/kyori/option/OptionState.java index e0d4859..2a1cc3b 100644 --- a/src/main/java/net/kyori/option/OptionState.java +++ b/src/main/java/net/kyori/option/OptionState.java @@ -27,7 +27,7 @@ import java.util.function.Consumer; import net.kyori.option.value.ValueSource; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; /** * Collection of feature flags. @@ -56,7 +56,7 @@ static OptionState emptyOptionState() { * @deprecated for removal since 1.1.0, create states via {@link OptionSchema#stateBuilder()} instead */ @Deprecated - static @NotNull Builder optionState() { + static Builder optionState() { return OptionSchema.globalSchema().stateBuilder(); } @@ -68,7 +68,7 @@ static OptionState emptyOptionState() { * @deprecated for removal since 1.1.0, create states via {@link OptionSchema#versionedStateBuilder()} instead */ @Deprecated - static @NotNull VersionedBuilder versionedOptionState() { + static VersionedBuilder versionedOptionState() { return OptionSchema.globalSchema().versionedStateBuilder(); } @@ -78,7 +78,7 @@ static OptionState emptyOptionState() { * @return the option schema * @since 1.1.0 */ - @NotNull OptionSchema schema(); + OptionSchema schema(); /** * Get whether this state contains a certain option at all. @@ -87,7 +87,7 @@ static OptionState emptyOptionState() { * @return whether the option has been touched. * @since 1.0.0 */ - boolean has(final @NotNull Option option); + boolean has(final Option option); /** * Get the value set for a certain option. @@ -97,7 +97,7 @@ static OptionState emptyOptionState() { * @param the value type * @since 1.0.0 */ - V value(final @NotNull Option option); + @Nullable V value(final Option option); /** * A composite option set. @@ -114,7 +114,7 @@ interface Versioned extends OptionState { * @return the child sets that exist * @since 1.0.0 */ - @NotNull Map childStates(); + Map childStates(); /** * Request a view of this option state showing only option values available at versions up to and including {@code version}. @@ -123,7 +123,7 @@ interface Versioned extends OptionState { * @return a limited view of this set * @since 1.0.0 */ - @NotNull Versioned at(final int version); + Versioned at(final int version); } /** @@ -142,7 +142,7 @@ interface Builder { * @param the value type * @since 1.0.0 */ - @NotNull Builder value(final @NotNull Option option, final @NotNull V value); + Builder value(final Option option, final V value); /** * Apply all values from the existing option state. @@ -151,7 +151,7 @@ interface Builder { * @return this builder * @since 1.0.0 */ - @NotNull Builder values(final @NotNull OptionState existing); + Builder values(final OptionState existing); /** * Set a value for all options within the {@link #schema()} where a value is provided by the {@code source}. @@ -160,7 +160,7 @@ interface Builder { * @return this builder * @since 1.1.0 */ - @NotNull Builder values(final @NotNull ValueSource source); + Builder values(final ValueSource source); /** * Create a completed option state. @@ -168,7 +168,7 @@ interface Builder { * @return the built state * @since 1.0.0 */ - @NotNull OptionState build(); + OptionState build(); } /** @@ -186,7 +186,7 @@ interface VersionedBuilder { * @return this builder * @since 1.0.0 */ - @NotNull VersionedBuilder version(final int version, final @NotNull Consumer versionBuilder); + VersionedBuilder version(final int version, final Consumer versionBuilder); /** * Create a completed versioned option state. @@ -194,6 +194,6 @@ interface VersionedBuilder { * @return the built versioned state * @since 1.0.0 */ - @NotNull Versioned build(); + Versioned build(); } } diff --git a/src/main/java/net/kyori/option/OptionStateImpl.java b/src/main/java/net/kyori/option/OptionStateImpl.java index 3258a31..804c6c3 100644 --- a/src/main/java/net/kyori/option/OptionStateImpl.java +++ b/src/main/java/net/kyori/option/OptionStateImpl.java @@ -31,8 +31,7 @@ import java.util.TreeMap; import java.util.function.Consumer; import net.kyori.option.value.ValueSource; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -46,17 +45,17 @@ final class OptionStateImpl implements OptionState { } @Override - public @NotNull OptionSchema schema() { + public OptionSchema schema() { return this.schema; } @Override - public boolean has(final @NotNull Option option) { + public boolean has(final Option option) { return this.values.containsKey(requireNonNull(option, "flag")); } @Override - public V value(final @NotNull Option option) { + public @Nullable V value(final Option option) { final V value = option.valueType().type().cast(this.values.get(requireNonNull(option, "flag"))); return value == null ? option.defaultValue() : value; } @@ -95,27 +94,27 @@ static final class VersionedImpl implements Versioned { } @Override - public @NotNull OptionSchema schema() { + public OptionSchema schema() { return this.schema; } @Override - public boolean has(final @NotNull Option option) { + public boolean has(final Option option) { return this.filtered.has(option); } @Override - public V value(final @NotNull Option option) { + public @Nullable V value(final Option option) { return this.filtered.value(option); } @Override - public @NotNull Map childStates() { + public Map childStates() { return Collections.unmodifiableSortedMap(this.sets.headMap(this.targetVersion + 1)); } @Override - public @NotNull Versioned at(final int version) { + public Versioned at(final int version) { return new VersionedImpl(this.schema, this.sets, version, flattened(this.schema, this.sets, version)); } @@ -170,14 +169,14 @@ static final class BuilderImpl implements OptionState.Builder { } @Override - public @NotNull OptionState build() { + public OptionState build() { if (this.values.isEmpty()) return this.schema.emptyState(); return new OptionStateImpl(this.schema, this.values); } @Override - public @NotNull Builder value(final @NotNull Option option, final @NotNull V value) { + public Builder value(final Option option, final V value) { if (!this.schema.has(option)) { throw new IllegalStateException("Option '" + option.id() + "' was not present in active schema"); } @@ -200,7 +199,7 @@ private void putAll(final Map, Object> values) { } @Override - public @NotNull Builder values(final @NotNull OptionState existing) { + public Builder values(final OptionState existing) { if (existing instanceof OptionStateImpl) { this.putAll(((OptionStateImpl) existing).values); } else if (existing instanceof VersionedImpl) { @@ -212,7 +211,7 @@ private void putAll(final Map, Object> values) { } @Override - public @NotNull Builder values(final @NotNull ValueSource source) { + public Builder values(final ValueSource source) { for (final Option opt : this.schema.knownOptions()) { final Object value = source.value(opt); if (value != null) { @@ -228,12 +227,12 @@ static final class VersionedBuilderImpl implements OptionState.VersionedBuilder private final OptionSchema schema; private final Map builders = new TreeMap<>(); - VersionedBuilderImpl(final @NotNull OptionSchema schema) { + VersionedBuilderImpl(final OptionSchema schema) { this.schema = schema; } @Override - public OptionState.@NotNull Versioned build() { + public OptionState.Versioned build() { if (this.builders.isEmpty()) { return new VersionedImpl(this.schema, Collections.emptySortedMap(), 0, this.schema.emptyState()); } @@ -247,7 +246,7 @@ static final class VersionedBuilderImpl implements OptionState.VersionedBuilder } @Override - public @NotNull VersionedBuilder version(final int version, final @NotNull Consumer versionBuilder) { + public VersionedBuilder version(final int version, final Consumer versionBuilder) { requireNonNull(versionBuilder, "versionBuilder") .accept(this.builders.computeIfAbsent(version, $ -> new OptionStateImpl.BuilderImpl(this.schema))); return this; diff --git a/src/main/java/net/kyori/option/package-info.java b/src/main/java/net/kyori/option/package-info.java index ed4360c..3ae4948 100644 --- a/src/main/java/net/kyori/option/package-info.java +++ b/src/main/java/net/kyori/option/package-info.java @@ -1,4 +1,5 @@ /** * Runtime option system. */ +@org.jspecify.annotations.NullMarked package net.kyori.option; diff --git a/src/main/java/net/kyori/option/value/ValueSource.java b/src/main/java/net/kyori/option/value/ValueSource.java index 050f24c..44d5625 100644 --- a/src/main/java/net/kyori/option/value/ValueSource.java +++ b/src/main/java/net/kyori/option/value/ValueSource.java @@ -24,8 +24,7 @@ package net.kyori.option.value; import net.kyori.option.Option; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A source for external option values. @@ -42,7 +41,7 @@ public interface ValueSource { * @return an environment variable-backed value source with no prefix * @since 1.1.0 */ - static @NotNull ValueSource environmentVariable() { + static ValueSource environmentVariable() { return environmentVariable(""); } @@ -56,7 +55,7 @@ public interface ValueSource { * @return an environment variable-backed value source * @since 1.1.0 */ - static @NotNull ValueSource environmentVariable(final @NotNull String prefix) { + static ValueSource environmentVariable(final String prefix) { return new ValueSources.EnvironmentVariable(prefix); } @@ -68,7 +67,7 @@ public interface ValueSource { * @return a system property-backed value source with no prefix * @since 1.1.0 */ - static @NotNull ValueSource systemProperty() { + static ValueSource systemProperty() { return systemProperty(""); } @@ -82,7 +81,7 @@ public interface ValueSource { * @return a system property-backed value source * @since 1.1.0 */ - static @NotNull ValueSource systemProperty(final @NotNull String prefix) { + static ValueSource systemProperty(final String prefix) { return new ValueSources.SystemProperty(prefix); } @@ -94,5 +93,5 @@ public interface ValueSource { * @param the value type * @since 1.1.0 */ - @Nullable T value(final @NotNull Option option); + @Nullable T value(final Option option); } diff --git a/src/main/java/net/kyori/option/value/ValueSources.java b/src/main/java/net/kyori/option/value/ValueSources.java index 2643bbf..b05ada6 100644 --- a/src/main/java/net/kyori/option/value/ValueSources.java +++ b/src/main/java/net/kyori/option/value/ValueSources.java @@ -27,8 +27,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import net.kyori.option.Option; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; final class ValueSources { static final ValueSource ENVIRONMENT = new EnvironmentVariable(""); @@ -48,7 +47,7 @@ static final class EnvironmentVariable implements ValueSource { } @Override - public @Nullable T value(final @NotNull Option option) { + public @Nullable T value(final Option option) { final StringBuffer buf = new StringBuffer(option.id().length() + this.prefix.length()); buf.append(this.prefix); final Matcher match = ENVIRONMENT_SUBST_PATTERN.matcher(option.id()); @@ -77,7 +76,7 @@ static final class SystemProperty implements ValueSource { } @Override - public @Nullable T value(final @NotNull Option option) { + public @Nullable T value(final Option option) { final StringBuffer buf = new StringBuffer(option.id().length() + this.prefix.length()); buf.append(this.prefix); final Matcher match = SYSTEM_PROP_SUBST_PATTERN.matcher(option.id()); diff --git a/src/main/java/net/kyori/option/value/ValueType.java b/src/main/java/net/kyori/option/value/ValueType.java index ad1cf68..5a4a7ff 100644 --- a/src/main/java/net/kyori/option/value/ValueType.java +++ b/src/main/java/net/kyori/option/value/ValueType.java @@ -23,8 +23,6 @@ */ package net.kyori.option.value; -import org.jetbrains.annotations.NotNull; - import static java.util.Objects.requireNonNull; /** @@ -40,7 +38,7 @@ public interface ValueType { * @return a value type for string values * @since 1.1.0 */ - static @NotNull ValueType stringType() { + static ValueType stringType() { return ValueTypeImpl.Types.STRING; } @@ -50,7 +48,7 @@ public interface ValueType { * @return a value type for boolean values * @since 1.1.0 */ - static @NotNull ValueType booleanType() { + static ValueType booleanType() { return ValueTypeImpl.Types.BOOLEAN; } @@ -60,7 +58,7 @@ public interface ValueType { * @return a value type for integer values * @since 1.1.0 */ - static @NotNull ValueType integerType() { + static ValueType integerType() { return ValueTypeImpl.Types.INT; } @@ -70,7 +68,7 @@ public interface ValueType { * @return a value type for double values * @since 1.1.0 */ - static @NotNull ValueType doubleType() { + static ValueType doubleType() { return ValueTypeImpl.Types.DOUBLE; } @@ -82,7 +80,7 @@ public interface ValueType { * @return a value type for enum values * @since 1.1.0 */ - static > @NotNull ValueType enumType(final @NotNull Class enumClazz) { + static > ValueType enumType(final Class enumClazz) { return new ValueTypeImpl.EnumType<>(requireNonNull(enumClazz, "enumClazz")); } @@ -92,7 +90,7 @@ public interface ValueType { * @return the object type of the value * @since 1.1.0 */ - @NotNull Class type(); + Class type(); /** * Extract a value of this type from a plain string. @@ -102,5 +100,5 @@ public interface ValueType { * @throws IllegalArgumentException if the value is not of an appropriate type * @since 1.1.0 */ - @NotNull T parse(final @NotNull String plainValue) throws IllegalArgumentException; + T parse(final String plainValue) throws IllegalArgumentException; } diff --git a/src/main/java/net/kyori/option/value/ValueTypeImpl.java b/src/main/java/net/kyori/option/value/ValueTypeImpl.java index b82799f..f11e9de 100644 --- a/src/main/java/net/kyori/option/value/ValueTypeImpl.java +++ b/src/main/java/net/kyori/option/value/ValueTypeImpl.java @@ -26,18 +26,17 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; abstract class ValueTypeImpl implements ValueType { private final Class type; - ValueTypeImpl(final @NotNull Class type) { + ValueTypeImpl(final Class type) { this.type = type; } @Override - public @NotNull Class type() { + public Class type() { return this.type; } @@ -51,13 +50,13 @@ private Types() { static ValueType STRING = new ValueTypeImpl(String.class) { @Override - public @NotNull String parse(final @NotNull String plainValue) throws IllegalArgumentException { + public String parse(final String plainValue) throws IllegalArgumentException { return plainValue; } }; static ValueType BOOLEAN = new ValueTypeImpl(Boolean.class) { @Override - public @NotNull Boolean parse(final @NotNull String plainValue) throws IllegalArgumentException { + public Boolean parse(final String plainValue) throws IllegalArgumentException { if (plainValue.equalsIgnoreCase("true")) { return Boolean.TRUE; } else if (plainValue.equalsIgnoreCase("false")) { @@ -69,7 +68,7 @@ private Types() { }; static ValueType INT = new ValueTypeImpl(Integer.class) { @Override - public @NotNull Integer parse(final @NotNull String plainValue) throws IllegalArgumentException { + public Integer parse(final String plainValue) throws IllegalArgumentException { try { return Integer.decode(plainValue); } catch (final NumberFormatException ex) { @@ -79,7 +78,7 @@ private Types() { }; static ValueType DOUBLE = new ValueTypeImpl(Double.class) { @Override - public @NotNull Double parse(final @NotNull String plainValue) throws IllegalArgumentException { + public Double parse(final String plainValue) throws IllegalArgumentException { try { return Double.parseDouble(plainValue); } catch (final NumberFormatException ex) { @@ -92,7 +91,7 @@ private Types() { static final class EnumType> extends ValueTypeImpl { private final Map values = new HashMap<>(); - EnumType(final @NotNull Class type) { + EnumType(final Class type) { super(type); for (final E entry : type.getEnumConstants()) { this.values.put(entry.name().toLowerCase(Locale.ROOT), entry); @@ -100,7 +99,7 @@ static final class EnumType> extends ValueTypeImpl { } @Override - public @NotNull E parse(final @NotNull String plainValue) throws IllegalArgumentException { + public E parse(final String plainValue) throws IllegalArgumentException { final E result = this.values.get(plainValue.toLowerCase(Locale.ROOT)); if (result == null) { throw doNotKnowHowToTurn(plainValue, this.type(), null); diff --git a/src/main/java/net/kyori/option/value/package-info.java b/src/main/java/net/kyori/option/value/package-info.java index c3d11d8..6069c57 100644 --- a/src/main/java/net/kyori/option/value/package-info.java +++ b/src/main/java/net/kyori/option/value/package-info.java @@ -3,4 +3,5 @@ * * @since 1.1.0 */ +@org.jspecify.annotations.NullMarked package net.kyori.option.value; diff --git a/src/main/java9/module-info.java b/src/main/java9/module-info.java index 73543f0..6d4da08 100644 --- a/src/main/java9/module-info.java +++ b/src/main/java9/module-info.java @@ -1,7 +1,9 @@ /** * Feature flag system. */ +@org.jspecify.annotations.NullMarked module net.kyori.option { + requires static transitive org.jspecify; requires static transitive org.jetbrains.annotations; exports net.kyori.option; diff --git a/src/test/java/net/kyori/option/OptionConfigTest.java b/src/test/java/net/kyori/option/OptionConfigTest.java index 7ffec86..e6280a0 100644 --- a/src/test/java/net/kyori/option/OptionConfigTest.java +++ b/src/test/java/net/kyori/option/OptionConfigTest.java @@ -23,7 +23,6 @@ */ package net.kyori.option; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -173,7 +172,7 @@ void testVersionBetweenSteps() { assertEquals(true, versioned.value(TWO)); } - private static @NotNull String key(final String path) { + private static String key(final String path) { return "option:test/" + path; } }