summaryrefslogtreecommitdiff
path: root/src/SMAPI.Toolkit
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Toolkit')
-rw-r--r--src/SMAPI.Toolkit/SemanticVersion.cs61
1 files changed, 38 insertions, 23 deletions
diff --git a/src/SMAPI.Toolkit/SemanticVersion.cs b/src/SMAPI.Toolkit/SemanticVersion.cs
index 41ae12eb..cea8c447 100644
--- a/src/SMAPI.Toolkit/SemanticVersion.cs
+++ b/src/SMAPI.Toolkit/SemanticVersion.cs
@@ -1,6 +1,5 @@
-#nullable disable
-
using System;
+using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
using StardewModdingAPI.Toolkit.Framework;
@@ -40,10 +39,10 @@ namespace StardewModdingAPI.Toolkit
public int PlatformRelease { get; }
/// <inheritdoc />
- public string PrereleaseTag { get; }
+ public string? PrereleaseTag { get; }
/// <inheritdoc />
- public string BuildMetadata { get; }
+ public string? BuildMetadata { get; }
/*********
@@ -56,7 +55,7 @@ namespace StardewModdingAPI.Toolkit
/// <param name="platformRelease">The platform-specific version (if applicable).</param>
/// <param name="prereleaseTag">An optional prerelease tag.</param>
/// <param name="buildMetadata">Optional build metadata. This is ignored when determining version precedence.</param>
- public SemanticVersion(int major, int minor, int patch, int platformRelease = 0, string prereleaseTag = null, string buildMetadata = null)
+ public SemanticVersion(int major, int minor, int patch, int platformRelease = 0, string? prereleaseTag = null, string? buildMetadata = null)
{
this.MajorVersion = major;
this.MinorVersion = minor;
@@ -106,7 +105,7 @@ namespace StardewModdingAPI.Toolkit
}
/// <inheritdoc />
- public int CompareTo(ISemanticVersion other)
+ public int CompareTo(ISemanticVersion? other)
{
return other == null
? 1
@@ -114,7 +113,7 @@ namespace StardewModdingAPI.Toolkit
}
/// <inheritdoc />
- public bool Equals(ISemanticVersion other)
+ public bool Equals(ISemanticVersion? other)
{
return other != null && this.CompareTo(other) == 0;
}
@@ -126,15 +125,15 @@ namespace StardewModdingAPI.Toolkit
}
/// <inheritdoc />
- public bool IsOlderThan(ISemanticVersion other)
+ public bool IsOlderThan(ISemanticVersion? other)
{
return this.CompareTo(other) < 0;
}
/// <inheritdoc />
- public bool IsOlderThan(string other)
+ public bool IsOlderThan(string? other)
{
- ISemanticVersion otherVersion = other != null
+ ISemanticVersion? otherVersion = other != null
? new SemanticVersion(other, allowNonStandard: true)
: null;
@@ -142,15 +141,15 @@ namespace StardewModdingAPI.Toolkit
}
/// <inheritdoc />
- public bool IsNewerThan(ISemanticVersion other)
+ public bool IsNewerThan(ISemanticVersion? other)
{
return this.CompareTo(other) > 0;
}
/// <inheritdoc />
- public bool IsNewerThan(string other)
+ public bool IsNewerThan(string? other)
{
- ISemanticVersion otherVersion = other != null
+ ISemanticVersion? otherVersion = other != null
? new SemanticVersion(other, allowNonStandard: true)
: null;
@@ -158,18 +157,18 @@ namespace StardewModdingAPI.Toolkit
}
/// <inheritdoc />
- public bool IsBetween(ISemanticVersion min, ISemanticVersion max)
+ public bool IsBetween(ISemanticVersion? min, ISemanticVersion? max)
{
return this.CompareTo(min) >= 0 && this.CompareTo(max) <= 0;
}
/// <inheritdoc />
- public bool IsBetween(string min, string max)
+ public bool IsBetween(string? min, string? max)
{
- ISemanticVersion minVersion = min != null
+ ISemanticVersion? minVersion = min != null
? new SemanticVersion(min, allowNonStandard: true)
: null;
- ISemanticVersion maxVersion = max != null
+ ISemanticVersion? maxVersion = max != null
? new SemanticVersion(max, allowNonStandard: true)
: null;
@@ -199,7 +198,12 @@ namespace StardewModdingAPI.Toolkit
/// <param name="version">The version string.</param>
/// <param name="parsed">The parsed representation.</param>
/// <returns>Returns whether parsing the version succeeded.</returns>
- public static bool TryParse(string version, out ISemanticVersion parsed)
+ public static bool TryParse(string? version,
+#if NET5_0_OR_GREATER
+ [NotNullWhen(true)]
+#endif
+ out ISemanticVersion? parsed
+ )
{
return SemanticVersion.TryParse(version, allowNonStandard: false, out parsed);
}
@@ -209,8 +213,19 @@ namespace StardewModdingAPI.Toolkit
/// <param name="allowNonStandard">Whether to allow non-standard extensions to semantic versioning.</param>
/// <param name="parsed">The parsed representation.</param>
/// <returns>Returns whether parsing the version succeeded.</returns>
- public static bool TryParse(string version, bool allowNonStandard, out ISemanticVersion parsed)
+ public static bool TryParse(string? version, bool allowNonStandard,
+#if NET5_0_OR_GREATER
+ [NotNullWhen(true)]
+#endif
+ out ISemanticVersion? parsed
+ )
{
+ if (version == null)
+ {
+ parsed = null;
+ return false;
+ }
+
try
{
parsed = new SemanticVersion(version, allowNonStandard);
@@ -229,7 +244,7 @@ namespace StardewModdingAPI.Toolkit
*********/
/// <summary>Get a normalized prerelease or build tag.</summary>
/// <param name="tag">The tag to normalize.</param>
- private string GetNormalizedTag(string tag)
+ private string? GetNormalizedTag(string? tag)
{
tag = tag?.Trim();
return !string.IsNullOrWhiteSpace(tag) ? tag : null;
@@ -241,7 +256,7 @@ namespace StardewModdingAPI.Toolkit
/// <param name="otherPatch">The patch version to compare with this instance.</param>
/// <param name="otherPlatformRelease">The non-standard platform release to compare with this instance.</param>
/// <param name="otherTag">The prerelease tag to compare with this instance.</param>
- private int CompareTo(int otherMajor, int otherMinor, int otherPatch, int otherPlatformRelease, string otherTag)
+ private int CompareTo(int otherMajor, int otherMinor, int otherPatch, int otherPlatformRelease, string? otherTag)
{
const int same = 0;
const int curNewer = 1;
@@ -270,8 +285,8 @@ namespace StardewModdingAPI.Toolkit
return curOlder;
// compare two prerelease tag values
- string[] curParts = this.PrereleaseTag.Split('.', '-');
- string[] otherParts = otherTag.Split('.', '-');
+ string[] curParts = this.PrereleaseTag?.Split('.', '-') ?? Array.Empty<string>();
+ string[] otherParts = otherTag?.Split('.', '-') ?? Array.Empty<string>();
int length = Math.Max(curParts.Length, otherParts.Length);
for (int i = 0; i < length; i++)
{