From bef616f5d630c98567882473cb3ab92fabaec3ab Mon Sep 17 00:00:00 2001 From: VeyronSakai Date: Thu, 18 Apr 2024 17:11:34 +0900 Subject: [PATCH 1/4] Suppress ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index a3cfba9..80db3f6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -231,6 +231,8 @@ csharp_preserve_single_line_statements = true # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = warning +resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting = none + [src/{Compilers,ExpressionEvaluator,Scripting}/**Test**/*.{cs,vb}] # IDE0060: Remove unused parameter @@ -279,6 +281,7 @@ dotnet_diagnostic.IDE2005.severity = warning # csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental dotnet_diagnostic.IDE2006.severity = warning + [src/{VisualStudio}/**/*.{cs,vb}] # CA1822: Make member static # There is a risk of accidentally breaking an internal API that partners rely on though IVT. From 462f3c9a097597118b1d94407f485f9010a7ad79 Mon Sep 17 00:00:00 2001 From: VeyronSakai Date: Thu, 18 Apr 2024 17:12:27 +0900 Subject: [PATCH 2/4] Add InjectAttributeCodeFixProvider --- .../VContainerAnalyzer/VContainerAnalyzer.dll | Bin 13824 -> 19456 bytes .../VContainerAnalyzer.dll.meta | 23 +---- .../InjectAttributeCodeFixProvider.cs | 96 ++++++++++++++++++ 3 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 VContainerAnalyzer/CodeFixProviders/InjectAttributeCodeFixProvider.cs diff --git a/VContainerAnalyzer.Unity/Assets/Plugins/VContainerAnalyzer/VContainerAnalyzer.dll b/VContainerAnalyzer.Unity/Assets/Plugins/VContainerAnalyzer/VContainerAnalyzer.dll index 9fd3b0a42a2146b1704cc1f9674b43f9bea9eaa7..ebfc4a93111498e1ccfcef6a0797fab26da07bca 100644 GIT binary patch literal 19456 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 P`vHE}`Cj?|7lHo+F FixableDiagnosticIds { get; } = ImmutableArray.Create(Rules.Rule0002.Id); + + public override FixAllProvider GetFixAllProvider() + { + return WellKnownFixAllProviders.BatchFixer; + } + + public override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context + .Document + .GetSyntaxRootAsync(context.CancellationToken) + .ConfigureAwait(false); + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var declaration = root? + .FindToken(diagnosticSpan.Start) + .Parent? + .AncestorsAndSelf() + .OfType() + .FirstOrDefault(); + + if (declaration == null) + { + return; + } + + if (declaration is not FieldDeclarationSyntax && declaration is not PropertyDeclarationSyntax) + { + return; + } + + context.RegisterCodeFix( + CodeAction.Create( + "Remove InjectAttribute", + cancellationToken => + RemoveInjectAttribute(context.Document, declaration, cancellationToken), + FixableDiagnosticIds.Single()), + context.Diagnostics); + } + + private static async Task RemoveInjectAttribute(Document document, MemberDeclarationSyntax declaration, + CancellationToken cancellationToken) + { + var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); + var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); + var newAttributeLists = new List(); + + foreach (var attributeList in declaration.AttributeLists) + { + var nodesToRemove = new List(); + + foreach (var attribute in attributeList.Attributes) + { + var attributeType = model?.GetTypeInfo(attribute).Type; + if (attributeType != null && attributeType.IsVContainerInjectAttribute()) + { + nodesToRemove.Add(attribute); + } + } + + var newAttributes = attributeList.RemoveNodes(nodesToRemove, SyntaxRemoveOptions.KeepNoTrivia); + if (newAttributes.Attributes.Any()) + { + newAttributeLists.Add(newAttributes); + } + } + + var newDeclaration = declaration + .WithAttributeLists(SyntaxFactory.List(newAttributeLists)) + .WithLeadingTrivia(declaration.GetLeadingTrivia()); + + var newRoot = root?.ReplaceNode(declaration, newDeclaration); + return newRoot == null ? document : document.WithSyntaxRoot(newRoot); + } +} From cbd7a21840d6045e2dc17c4204ecd0a7b97aa851 Mon Sep 17 00:00:00 2001 From: VeyronSakai Date: Thu, 18 Apr 2024 17:13:22 +0900 Subject: [PATCH 3/4] Add tests for InjectAttributeCodeFixProvider --- VContainerAnalyzer.Test/FieldAnalyzerTest.cs | 2 +- VContainerAnalyzer.Test/Helper.cs | 36 +++++++++++++++---- .../InjectAttributeCodeFixProviderTest.cs | 27 ++++++++++++++ .../PropertyAnalyzerTest.cs | 2 +- .../TestData/FieldInjectionClassFixed.txt | 13 +++++++ 5 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 VContainerAnalyzer.Test/InjectAttributeCodeFixProviderTest.cs create mode 100644 VContainerAnalyzer.Test/TestData/FieldInjectionClassFixed.txt diff --git a/VContainerAnalyzer.Test/FieldAnalyzerTest.cs b/VContainerAnalyzer.Test/FieldAnalyzerTest.cs index 5dbaf09..5b9ebed 100644 --- a/VContainerAnalyzer.Test/FieldAnalyzerTest.cs +++ b/VContainerAnalyzer.Test/FieldAnalyzerTest.cs @@ -30,7 +30,7 @@ public async Task EmptySourceCode_NoDiagnosticReport() [Test] public async ValueTask Analyze_FieldInjection_ReportDiagnostic() { - var source = Helper.ReadCodes("FieldInjectionClass.cs", "EmptyClassStub.cs"); + var source = Helper.GetFileContentTexts("FieldInjectionClass.cs", "EmptyClassStub.cs"); var analyzer = new FieldAnalyzer(); var diagnostics = await DiagnosticAnalyzerRunner.Run(analyzer, source); diff --git a/VContainerAnalyzer.Test/Helper.cs b/VContainerAnalyzer.Test/Helper.cs index 285aa5a..4336349 100644 --- a/VContainerAnalyzer.Test/Helper.cs +++ b/VContainerAnalyzer.Test/Helper.cs @@ -1,19 +1,24 @@ // Copyright (c) 2020-2024 VeyronSakai. // This software is released under the MIT License. +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; namespace VContainerAnalyzer.Test; -public static class Helper +internal static class Helper { - private const string VContainerDirectory = "VContainer"; + private const string TestDataDirPath = "../../../TestData"; + private const string VContainerDirectoryName = "VContainer"; private static IEnumerable VContainerSourcePaths { get; } = - GetVContainerFiles.Select(file => $"{Path.Combine(VContainerDirectory, file)}").ToArray(); + GetVContainerFiles.Select(file => $"{Path.Combine(VContainerDirectoryName, file)}").ToArray(); private static IEnumerable GetVContainerFiles => [ @@ -25,11 +30,30 @@ public static class Helper "InjectAttribute.cs", ]; - public static string[] ReadCodes(params string[] sources) + internal static string[] GetFileContentTexts(params string[] sourcePaths) { - const string TestDataDirPath = "../../../TestData"; - return sources + return sourcePaths .Concat(VContainerSourcePaths) .Select(file => File.ReadAllText($"{TestDataDirPath}/{file}", Encoding.UTF8)).ToArray(); } + + internal static string GetJoinedFilesContentText(params string[] sources) + { + var fileBodyBuilder = new StringBuilder(); + var usingStatementsBuilder = new StringBuilder(); + + foreach (var filePath in sources.Concat(VContainerSourcePaths)) + { + var fileContent = File.ReadAllText($"{TestDataDirPath}/{filePath}", Encoding.UTF8); + var tree = CSharpSyntaxTree.ParseText(fileContent); + var root = tree.GetRoot(); + var usingDirectives = root.DescendantNodes().OfType().ToList(); + var newRoot = root.RemoveNodes(usingDirectives, SyntaxRemoveOptions.KeepNoTrivia); + var usingStatements = string.Join(Environment.NewLine, usingDirectives.Select(u => u.ToFullString())); + fileBodyBuilder.Append(newRoot?.ToFullString()); + usingStatementsBuilder.Append(usingStatements); + } + + return usingStatementsBuilder.Append(fileBodyBuilder).ToString(); + } } diff --git a/VContainerAnalyzer.Test/InjectAttributeCodeFixProviderTest.cs b/VContainerAnalyzer.Test/InjectAttributeCodeFixProviderTest.cs new file mode 100644 index 0000000..50f1695 --- /dev/null +++ b/VContainerAnalyzer.Test/InjectAttributeCodeFixProviderTest.cs @@ -0,0 +1,27 @@ +// Copyright (c) 2020-2024 VeyronSakai. +// This software is released under the MIT License. + +using System.Threading.Tasks; +using NUnit.Framework; +using Verify = + Microsoft.CodeAnalysis.CSharp.Testing.NUnit.CodeFixVerifier; + +namespace VContainerAnalyzer.Test; + +[TestFixture] +public class InjectAttributeCodeFixProviderTest +{ + [Test] + public async Task TypeNameContainingLowercase_CodeFixed() + { + var source = Helper.GetJoinedFilesContentText("FieldInjectionClass.cs", "EmptyClassStub.cs"); + var fixedSource = Helper.GetJoinedFilesContentText("FieldInjectionClassFixed.txt", "EmptyClassStub.cs"); + + var expected = Verify.Diagnostic() + .WithSpan(22, 10, 22, 16) + .WithArguments("_field1"); + + await Verify.VerifyCodeFixAsync(source, expected, fixedSource); + } +} diff --git a/VContainerAnalyzer.Test/PropertyAnalyzerTest.cs b/VContainerAnalyzer.Test/PropertyAnalyzerTest.cs index d53b9d0..8e2055d 100644 --- a/VContainerAnalyzer.Test/PropertyAnalyzerTest.cs +++ b/VContainerAnalyzer.Test/PropertyAnalyzerTest.cs @@ -30,7 +30,7 @@ public async Task EmptySourceCode_NoDiagnosticReport() [Test] public async ValueTask Analyze_PropertyInjection_ReportDiagnostic() { - var source = Helper.ReadCodes("PropertyInjectionClass.cs", "EmptyClassStub.cs"); + var source = Helper.GetFileContentTexts("PropertyInjectionClass.cs", "EmptyClassStub.cs"); var analyzer = new PropertyAnalyzer(); var diagnostics = await DiagnosticAnalyzerRunner.Run(analyzer, source); diff --git a/VContainerAnalyzer.Test/TestData/FieldInjectionClassFixed.txt b/VContainerAnalyzer.Test/TestData/FieldInjectionClassFixed.txt new file mode 100644 index 0000000..5a32bbf --- /dev/null +++ b/VContainerAnalyzer.Test/TestData/FieldInjectionClassFixed.txt @@ -0,0 +1,13 @@ +// Copyright (c) 2020-2024 VeyronSakai. +// This software is released under the MIT License. + +using VContainer; + +namespace VContainerAnalyzer.Test.TestData +{ + public class FieldInjectionClass + { + private EmptyClassStub _field1; + private EmptyClassStub _field2; + } +} From 60410e05b2e48a724cd815650d91c8d1fe12a51f Mon Sep 17 00:00:00 2001 From: VeyronSakai Date: Thu, 18 Apr 2024 17:15:09 +0900 Subject: [PATCH 4/4] Add Shared Attribute --- .../VContainerAnalyzer/VContainerAnalyzer.dll | Bin 19456 -> 19456 bytes .../VContainerAnalyzer.dll.meta | 23 +++++++++++++++++- .../InjectAttributeCodeFixProvider.cs | 3 ++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/VContainerAnalyzer.Unity/Assets/Plugins/VContainerAnalyzer/VContainerAnalyzer.dll b/VContainerAnalyzer.Unity/Assets/Plugins/VContainerAnalyzer/VContainerAnalyzer.dll index ebfc4a93111498e1ccfcef6a0797fab26da07bca..be150fef2bafc4a4d3164adc58ac372189798388 100644 GIT binary patch delta 8580 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 delta 8440 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 FixableDiagnosticIds { get; } = ImmutableArray.Create(Rules.Rule0002.Id);