123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using System.Collections.Immutable;
- using System.Composition;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using Microsoft.CodeAnalysis;
- using Microsoft.CodeAnalysis.CodeActions;
- using Microsoft.CodeAnalysis.CodeFixes;
- using Microsoft.CodeAnalysis.CSharp;
- using Microsoft.CodeAnalysis.CSharp.Syntax;
- using Microsoft.CodeAnalysis.Formatting;
- namespace ET.Analyzer
- {
- [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(EntityFiledAccessCodeFixProvider)), Shared]
- public class EntityFiledAccessCodeFixProvider: CodeFixProvider
- {
- public sealed override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(DiagnosticIds.EntityFiledAccessAnalyzerRuleId);
-
- public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
-
- public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
- {
- SyntaxNode? root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
-
- Diagnostic diagnostic = context.Diagnostics.First();
- Microsoft.CodeAnalysis.Text.TextSpan diagnosticSpan = diagnostic.Location.SourceSpan;
-
- diagnostic.Properties.TryGetValue("FriendOfType", out string? frienClassType);
- if (frienClassType==null)
- {
- return;
- }
-
- ClassDeclarationSyntax? classDeclaration = root?.FindToken(diagnosticSpan.Start).Parent?.AncestorsAndSelf().OfType<ClassDeclarationSyntax>().First();
-
- CodeAction action = CodeAction.Create(
- "Add FriendOf Attribute",
- c => AddFriendOfAttributeAsync(context.Document, classDeclaration,frienClassType, c),
- equivalenceKey: nameof(EntityFiledAccessCodeFixProvider));
-
- context.RegisterCodeFix(action, diagnostic);
- }
- private static async Task<Document> AddFriendOfAttributeAsync(Document document, ClassDeclarationSyntax? classDeclaration, string friendOfType, CancellationToken cancellationToken)
- {
-
- AttributeArgumentSyntax attributeArgument = SyntaxFactory.AttributeArgument(SyntaxFactory.TypeOfExpression(SyntaxFactory.ParseTypeName(friendOfType)));
- AttributeSyntax attributeSyntax = SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("FriendOfAttribute"))
- .WithArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList(attributeArgument)));
-
- SyntaxList<AttributeListSyntax>? attributes = classDeclaration?.AttributeLists.Add(
- SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(attributeSyntax)).NormalizeWhitespace());
- if (attributes == null)
- {
- return document;
- }
-
- ClassDeclarationSyntax? newClassDeclaration = classDeclaration?.WithAttributeLists(attributes.Value).WithAdditionalAnnotations(Formatter.Annotation);
- SyntaxNode? root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
- if (root==null ||classDeclaration==null || newClassDeclaration==null )
- {
- return document;
- }
-
- var newRoot = root.ReplaceNode(classDeclaration, newClassDeclaration);
-
-
- return document.WithSyntaxRoot(newRoot);
- }
- }
- }
|