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"),