diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f1e80c2..2aa7885 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -24,12 +24,6 @@ jobs:
dotnet-version: |
8.0.x
9.0.x
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v5
- with:
- dotnet-quality: 'preview'
- dotnet-version: |
10.0.x
- name: Restore dependencies
@@ -37,7 +31,7 @@ jobs:
- name: Build
run: dotnet build -c Release --no-restore
- name: Test
- run: dotnet test -c Release --no-build
+ run: dotnet test -c Release --no-build -- --coverage --coverage-output-format cobertura --coverage-output coverage.cobertura.xml
- name: Upload coverage reports to Codecov with GitHub Action
uses: codecov/codecov-action@v5
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f3e1738..3068bcf 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -6,11 +6,11 @@ on:
tags:
- '**'
-permissions:
- contents: write
-
jobs:
release:
+ permissions:
+ id-token: write # enable GitHub OIDC token issuance for this job
+ contents: write # enable github releases
runs-on: ubuntu-latest
@@ -23,12 +23,6 @@ jobs:
dotnet-version: |
8.0.x
9.0.x
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v5
- with:
- dotnet-quality: 'preview'
- dotnet-version: |
10.0.x
- name: Restore dependencies
@@ -38,8 +32,15 @@ jobs:
- name: Package
run: dotnet pack -c Release --no-build --property:PackageOutputPath=../../nupkgs
+
+ - name: NuGet login (OIDC → temp API key)
+ uses: NuGet/login@v1
+ id: login
+ with:
+ user: viceroypenguin
+
- name: Push to Nuget
- run: dotnet nuget push "./nupkgs/*.nupkg" --source "https://api.nuget.org/v3/index.json" --api-key ${{ secrets.NUGETPUBLISHKEY }}
+ run: dotnet nuget push "./nupkgs/*.nupkg" --source "https://api.nuget.org/v3/index.json" --api-key ${{ steps.login.outputs.NUGET_API_KEY }}
- name: Create Release
uses: ncipollo/release-action@v1
diff --git a/Directory.Build.props b/Directory.Build.props
index a3a58a3..04c088c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -14,6 +14,8 @@
false
false
+
+ true
@@ -33,8 +35,5 @@
true
true
- true
- true
- opencover
diff --git a/Directory.Packages.props b/Directory.Packages.props
index e10cb67..7804fa4 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,50 +4,53 @@
-
-
-
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
-
+
+
+
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
-
-
+
+
+
diff --git a/src/Common/ITypeSymbolExtensions.cs b/src/Common/ITypeSymbolExtensions.cs
index 6240e0b..c1ef6c0 100644
--- a/src/Common/ITypeSymbolExtensions.cs
+++ b/src/Common/ITypeSymbolExtensions.cs
@@ -185,9 +185,9 @@ typeSymbol is INamedTypeSymbol
{
Name: "System",
ContainingNamespace.IsGlobalNamespace: true,
- }
- }
- }
+ },
+ },
+ },
};
public static IReadOnlyList<(string? Target, IObjectCreationOperation Attribute)> GetTargetedAttributes(
diff --git a/src/Immediate.Validations.Analyzers/AssemblyBehaviorAnalyzer.cs b/src/Immediate.Validations.Analyzers/AssemblyBehaviorAnalyzer.cs
index 18d2d0d..81604c7 100644
--- a/src/Immediate.Validations.Analyzers/AssemblyBehaviorAnalyzer.cs
+++ b/src/Immediate.Validations.Analyzers/AssemblyBehaviorAnalyzer.cs
@@ -20,7 +20,7 @@ public sealed class AssemblyBehaviorAnalyzer : DiagnosticAnalyzer
);
public override ImmutableArray SupportedDiagnostics { get; } =
- ImmutableArray.Create(
+ ImmutableArray.Create(
[
AssemblyBehaviorsShouldUseValidation,
]);
@@ -79,7 +79,7 @@ private static void AnalyzeOperation(OperationAnalysisContext context)
},
},
},
- ChildOperations.Count: 2
+ ChildOperations.Count: 2,
}
|| array.ChildOperations.ElementAt(1) is not IArrayInitializerOperation aio)
{
diff --git a/src/Immediate.Validations.Analyzers/InvalidAttributeTargetSuppressor.cs b/src/Immediate.Validations.Analyzers/InvalidAttributeTargetSuppressor.cs
index 18bc981..7119b1b 100644
--- a/src/Immediate.Validations.Analyzers/InvalidAttributeTargetSuppressor.cs
+++ b/src/Immediate.Validations.Analyzers/InvalidAttributeTargetSuppressor.cs
@@ -11,9 +11,9 @@ public sealed class InvalidAttributeTargetSuppressor : DiagnosticSuppressor
public override ImmutableArray SupportedSuppressions =>
ImmutableArray.Create([
new SuppressionDescriptor(
- id: $"InvalidAttributeTargetSuppression",
+ id: "InvalidAttributeTargetSuppression",
suppressedDiagnosticId: "CS0658",
- justification: $"Suppress invalid attribute target when used for validation."
+ justification: "Suppress invalid attribute target when used for validation."
),
]);
@@ -32,7 +32,7 @@ public override void ReportSuppressions(SuppressionAnalysisContext context)
.FindNode(diagnostic.Location.SourceSpan) is not AttributeTargetSpecifierSyntax
{
Identifier.ValueText: "element",
- Parent.Parent: SyntaxNode declarationSyntax
+ Parent.Parent: SyntaxNode declarationSyntax,
})
{
continue;
@@ -43,13 +43,13 @@ public override void ReportSuppressions(SuppressionAnalysisContext context)
IPropertySymbol
{
ContainingType: INamedTypeSymbol ct1,
- Type: ITypeSymbol pt1
+ Type: ITypeSymbol pt1,
} => (true, ct1, pt1),
IParameterSymbol
{
ContainingType: INamedTypeSymbol ct1,
- Type: ITypeSymbol pt1
+ Type: ITypeSymbol pt1,
} => (true, ct1, pt1),
_ => (false, null, null),
diff --git a/src/Immediate.Validations.Analyzers/ValidateClassAnalyzer.cs b/src/Immediate.Validations.Analyzers/ValidateClassAnalyzer.cs
index 191f70b..c94146a 100644
--- a/src/Immediate.Validations.Analyzers/ValidateClassAnalyzer.cs
+++ b/src/Immediate.Validations.Analyzers/ValidateClassAnalyzer.cs
@@ -330,7 +330,7 @@ CancellationToken token
if (argument.Value is not IArrayCreationOperation
{
- Initializer.ElementValues: { } elements
+ Initializer.ElementValues: { } elements,
})
{
return;
@@ -357,7 +357,7 @@ CancellationToken token
if (initializer is not ISimpleAssignmentOperation
{
- Target: IPropertyReferenceOperation { Property: { } property }
+ Target: IPropertyReferenceOperation { Property: { } property },
})
{
return;
@@ -493,7 +493,7 @@ List members
.FirstOrDefault(
ims => ims is IMethodSymbol
{
- Parameters: []
+ Parameters: [],
}
);
diff --git a/src/Immediate.Validations.Generators/Utility.cs b/src/Immediate.Validations.Generators/Utility.cs
index 176841b..ccbedd5 100644
--- a/src/Immediate.Validations.Generators/Utility.cs
+++ b/src/Immediate.Validations.Generators/Utility.cs
@@ -12,7 +12,7 @@ public static Template GetTemplate(string name)
.GetExecutingAssembly()
.GetManifestResourceStream(
$"Immediate.Validations.Generators.Templates.{name}.sbntxt"
- )!;
+ );
using var reader = new StreamReader(stream);
return Template.Parse(reader.ReadToEnd());
diff --git a/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs b/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs
index add2472..fb39da0 100644
--- a/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs
+++ b/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs
@@ -411,7 +411,7 @@ IObjectCreationOperation attribute
IsGenericMethod = validateMethod.IsGenericMethod,
IsNullable = targetParameterType is { IsReferenceType: true, NullableAnnotation: NullableAnnotation.Annotated }
or { OriginalDefinition.SpecialType: SpecialType.System_Nullable_T },
- Arguments = parameters.ToEquatableReadOnlyList()!,
+ Arguments = parameters.ToEquatableReadOnlyList(),
Message = attribute.GetMessage(),
};
}
@@ -455,7 +455,7 @@ ITypeSymbol targetPropertyType
if (argument.Value is not IArrayCreationOperation
{
- Initializer.ElementValues: { } elements
+ Initializer.ElementValues: { } elements,
})
{
return null;
@@ -511,7 +511,7 @@ ITypeSymbol targetPropertyType
if (initializer is not ISimpleAssignmentOperation
{
- Target: IPropertyReferenceOperation { Property: { } property }
+ Target: IPropertyReferenceOperation { Property: { } property },
})
{
return null;
@@ -623,7 +623,7 @@ ExpressionSyntax argumentExpressionSyntax
.FirstOrDefault(
ims => ims is IMethodSymbol
{
- Parameters: []
+ Parameters: [],
}
);
diff --git a/src/Immediate.Validations.Shared/ExpressionEvaluator.cs b/src/Immediate.Validations.Shared/ExpressionEvaluator.cs
index a47fa38..26c8dea 100644
--- a/src/Immediate.Validations.Shared/ExpressionEvaluator.cs
+++ b/src/Immediate.Validations.Shared/ExpressionEvaluator.cs
@@ -185,7 +185,7 @@ internal static class ExpressionEvaluator
? s_identityCheckedMethod.MakeGenericMethod(targetType)
: s_identityUncheckedMethod.MakeGenericMethod(targetType);
- return method.Invoke(null, [value!])!;
+ return method.Invoke(null, [value]);
}
private static T IdentityChecked(dynamic value) => checked((T)value);
diff --git a/tests/Immediate.Validations.FunctionalTests/Immediate.Validations.FunctionalTests.csproj b/tests/Immediate.Validations.FunctionalTests/Immediate.Validations.FunctionalTests.csproj
index 8454504..76a54ac 100644
--- a/tests/Immediate.Validations.FunctionalTests/Immediate.Validations.FunctionalTests.csproj
+++ b/tests/Immediate.Validations.FunctionalTests/Immediate.Validations.FunctionalTests.csproj
@@ -18,11 +18,10 @@
-
-
+
diff --git a/tests/Immediate.Validations.Tests/AnalyzerTests/AnalyzerTestHelpers.cs b/tests/Immediate.Validations.Tests/AnalyzerTests/AnalyzerTestHelpers.cs
index 9856283..4976876 100644
--- a/tests/Immediate.Validations.Tests/AnalyzerTests/AnalyzerTestHelpers.cs
+++ b/tests/Immediate.Validations.Tests/AnalyzerTests/AnalyzerTestHelpers.cs
@@ -20,12 +20,7 @@ public static CSharpAnalyzerTest CreateAnalyzerTest<
TestState =
{
Sources = { inputSource },
- ReferenceAssemblies = new ReferenceAssemblies(
- "net8.0",
- new PackageIdentity(
- "Microsoft.NETCore.App.Ref",
- "8.0.0"),
- Path.Combine("ref", "net8.0")),
+ ReferenceAssemblies = Utility.ReferenceAssemblies,
},
};
@@ -113,13 +108,7 @@ public static CSharpSuppressorTest CreateSuppresso
var test = new CSharpSuppressorTest
{
TestCode = inputSource,
- ReferenceAssemblies = new ReferenceAssemblies(
- "net8.0",
- new PackageIdentity(
- "Microsoft.NETCore.App.Ref",
- "8.0.0"),
- Path.Combine("ref", "net8.0")
- ),
+ ReferenceAssemblies = Utility.ReferenceAssemblies,
CompilerDiagnostics = CompilerDiagnostics.Warnings,
DisabledDiagnostics =
{
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/AddAdditionalValidationsCodeRefactoringProviderTests.cs b/tests/Immediate.Validations.Tests/CodeFixTests/AddAdditionalValidationsCodeRefactoringProviderTests.cs
index 9e886a8..193d837 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/AddAdditionalValidationsCodeRefactoringProviderTests.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/AddAdditionalValidationsCodeRefactoringProviderTests.cs
@@ -31,14 +31,14 @@ private static void AdditionalValidations(ValidationResult errors, Data target)
[Fact]
public async Task NoRefactorOnNonValidatedClass() =>
await CodeRefactoringTestHelper.CreateCodeRefactoringTest(
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed record {|Refactoring:Data|}
{
}
""",
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed record Data
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/AddValidateMethodCodefixProviderTests.cs b/tests/Immediate.Validations.Tests/CodeFixTests/AddValidateMethodCodefixProviderTests.cs
index 720d696..0302da2 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/AddValidateMethodCodefixProviderTests.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/AddValidateMethodCodefixProviderTests.cs
@@ -8,7 +8,7 @@ public sealed class AddValidateMethodCodefixProviderTests
[Fact]
public async Task AddValidateMethod() =>
await CodeFixTestHelper.CreateCodeFixTest(
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class {|IV0001:TestAttribute|} : ValidatorAttribute
@@ -16,7 +16,7 @@ public sealed class {|IV0001:TestAttribute|} : ValidatorAttribute
public const string DefaultMessage = "";
}
""",
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class TestAttribute : ValidatorAttribute
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/CodeFixTestHelper.cs b/tests/Immediate.Validations.Tests/CodeFixTests/CodeFixTestHelper.cs
index b53f3ce..5a20f38 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/CodeFixTestHelper.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/CodeFixTestHelper.cs
@@ -34,12 +34,7 @@ public static CSharpCodeFixTest CreateCode
{
Sources = { inputSource },
AnalyzerConfigFiles = { { ("/.editorconfig", EditorConfig) } },
- ReferenceAssemblies = new ReferenceAssemblies(
- "net8.0",
- new PackageIdentity(
- "Microsoft.NETCore.App.Ref",
- "8.0.0"),
- Path.Combine("ref", "net8.0")),
+ ReferenceAssemblies = Utility.ReferenceAssemblies,
},
FixedState = { MarkupHandling = MarkupMode.IgnoreFixable, Sources = { fixedSource } },
};
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/CodeRefactoringTestHelper.cs b/tests/Immediate.Validations.Tests/CodeFixTests/CodeRefactoringTestHelper.cs
index 5bb8ba0..999a0b3 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/CodeRefactoringTestHelper.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/CodeRefactoringTestHelper.cs
@@ -32,12 +32,7 @@ public static CSharpCodeRefactoringTest CreateCod
{
Sources = { inputSource },
AnalyzerConfigFiles = { { ("/.editorconfig", EditorConfig) } },
- ReferenceAssemblies = new ReferenceAssemblies(
- "net8.0",
- new PackageIdentity(
- "Microsoft.NETCore.App.Ref",
- "8.0.0"),
- Path.Combine("ref", "net8.0")),
+ ReferenceAssemblies = Utility.ReferenceAssemblies,
},
FixedState = { MarkupHandling = MarkupMode.IgnoreFixable, Sources = { fixedSource } },
};
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/CorrectValidatePropertyReturnTypeCodefixProviderTests.cs b/tests/Immediate.Validations.Tests/CodeFixTests/CorrectValidatePropertyReturnTypeCodefixProviderTests.cs
index f9184bc..fca8389 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/CorrectValidatePropertyReturnTypeCodefixProviderTests.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/CorrectValidatePropertyReturnTypeCodefixProviderTests.cs
@@ -8,7 +8,7 @@ public sealed class CorrectValidatePropertyReturnTypeCodefixProviderTests
[Fact]
public async Task CorrectValidatePropertyReturnType() =>
await CodeFixTestHelper.CreateCodeFixTest(
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class TestAttribute : ValidatorAttribute
@@ -18,7 +18,7 @@ public sealed class TestAttribute : ValidatorAttribute
public const string DefaultMessage = "";
}
""",
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class TestAttribute : ValidatorAttribute
diff --git a/tests/Immediate.Validations.Tests/CodeFixTests/MakeValidatePropertyMethodStaticCodefixProviderTests.cs b/tests/Immediate.Validations.Tests/CodeFixTests/MakeValidatePropertyMethodStaticCodefixProviderTests.cs
index 4332504..c076369 100644
--- a/tests/Immediate.Validations.Tests/CodeFixTests/MakeValidatePropertyMethodStaticCodefixProviderTests.cs
+++ b/tests/Immediate.Validations.Tests/CodeFixTests/MakeValidatePropertyMethodStaticCodefixProviderTests.cs
@@ -8,7 +8,7 @@ public sealed class MakeValidatePropertyMethodStaticCodefixProviderTests
[Fact]
public async Task MakeValidatePropertyMethodStatic() =>
await CodeFixTestHelper.CreateCodeFixTest(
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class TestAttribute : ValidatorAttribute
@@ -18,7 +18,7 @@ public sealed class TestAttribute : ValidatorAttribute
public const string DefaultMessage = "";
}
""",
- $$"""
+ """
namespace Immediate.Validations.Shared;
public sealed class TestAttribute : ValidatorAttribute
diff --git a/tests/Immediate.Validations.Tests/GeneratorTests/GeneratorTestHelper.cs b/tests/Immediate.Validations.Tests/GeneratorTests/GeneratorTestHelper.cs
index aa3c7cd..6502302 100644
--- a/tests/Immediate.Validations.Tests/GeneratorTests/GeneratorTestHelper.cs
+++ b/tests/Immediate.Validations.Tests/GeneratorTests/GeneratorTestHelper.cs
@@ -10,15 +10,15 @@ public static class GeneratorTestHelper
{
public static GeneratorDriverRunResult RunGenerator([StringSyntax("c#-test")] string source)
{
- var syntaxTree = CSharpSyntaxTree.ParseText(source);
+ var syntaxTree = CSharpSyntaxTree.ParseText(source, cancellationToken: TestContext.Current.CancellationToken);
var compilation = CSharpCompilation.Create(
assemblyName: "Tests",
syntaxTrees: [syntaxTree],
references:
[
- .. Basic.Reference.Assemblies.Net80.References.All,
- .. Utility.GetMetadataReferences(),
+ ..Utility.NetCoreAssemblies,
+ ..Utility.GetMetadataReferences(),
],
options: new(
outputKind: OutputKind.DynamicallyLinkedLibrary,
@@ -29,7 +29,7 @@ .. Utility.GetMetadataReferences(),
)
);
- var clone = compilation.Clone().AddSyntaxTrees(CSharpSyntaxTree.ParseText("// dummy"));
+ var clone = compilation.Clone().AddSyntaxTrees(CSharpSyntaxTree.ParseText("// dummy", cancellationToken: TestContext.Current.CancellationToken));
GeneratorDriver driver = CSharpGeneratorDriver.Create(
generators: [new ImmediateValidationsGenerator().AsSourceGenerator()],
@@ -54,12 +54,13 @@ Compilation compilation
.RunGeneratorsAndUpdateCompilation(
compilation,
out var outputCompilation,
- out var diagnostics
+ out var diagnostics,
+ TestContext.Current.CancellationToken
);
Assert.Empty(
outputCompilation
- .GetDiagnostics()
+ .GetDiagnostics(TestContext.Current.CancellationToken)
.Where(d => d.Severity is DiagnosticSeverity.Error or DiagnosticSeverity.Warning)
);
diff --git a/tests/Immediate.Validations.Tests/Immediate.Validations.Tests.csproj b/tests/Immediate.Validations.Tests/Immediate.Validations.Tests.csproj
index 64ec5b2..77b13a5 100644
--- a/tests/Immediate.Validations.Tests/Immediate.Validations.Tests.csproj
+++ b/tests/Immediate.Validations.Tests/Immediate.Validations.Tests.csproj
@@ -1,7 +1,7 @@
-
+
- net8.0
+ net8.0;net9.0;net10.0
Exe
<_SkipUpgradeNetAnalyzersNuGetWarning>true
@@ -11,22 +11,32 @@
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -36,7 +46,12 @@
-
+
+
+
+
diff --git a/tests/Immediate.Validations.Tests/Utility.cs b/tests/Immediate.Validations.Tests/Utility.cs
index d6b0063..3b0c179 100644
--- a/tests/Immediate.Validations.Tests/Utility.cs
+++ b/tests/Immediate.Validations.Tests/Utility.cs
@@ -1,10 +1,24 @@
using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Testing;
namespace Immediate.Validations.Tests;
internal static class Utility
{
- public static MetadataReference[] GetMetadataReferences() =>
+#if NET8_0
+ public static ReferenceAssemblies ReferenceAssemblies => ReferenceAssemblies.Net.Net80;
+ public static IEnumerable NetCoreAssemblies => Basic.Reference.Assemblies.Net80.References.All;
+#elif NET9_0
+ public static ReferenceAssemblies ReferenceAssemblies => ReferenceAssemblies.Net.Net90;
+ public static IEnumerable NetCoreAssemblies => Basic.Reference.Assemblies.Net90.References.All;
+#elif NET10_0
+ public static ReferenceAssemblies ReferenceAssemblies => ReferenceAssemblies.Net.Net100;
+ public static IEnumerable NetCoreAssemblies => Basic.Reference.Assemblies.Net100.References.All;
+#else
+#error .net version not yet implemented
+#endif
+
+ public static IEnumerable GetMetadataReferences() =>
[
MetadataReference.CreateFromFile("./Immediate.Handlers.Shared.dll"),
MetadataReference.CreateFromFile("./Immediate.Validations.Shared.dll"),