CSLA.NET 6.0.0
CSLA .NET is a software development framework that helps you build a reusable, maintainable object-oriented business layer for your app.
IsOperationMethodPublicMakeNonPublicCodeFix.cs
Go to the documentation of this file.
1using System.Collections.Immutable;
2using System.Composition;
3using System.Linq;
4using System.Threading.Tasks;
5using Microsoft.CodeAnalysis;
6using Microsoft.CodeAnalysis.CodeFixes;
7using Microsoft.CodeAnalysis.CSharp.Syntax;
8using Microsoft.CodeAnalysis.CSharp;
9using Microsoft.CodeAnalysis.CodeActions;
10
11namespace Csla.Analyzers
12{
13 [ExportCodeFixProvider(LanguageNames.CSharp)]
14 [Shared]
16 : CodeFixProvider
17 {
18 public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(Constants.AnalyzerIdentifiers.IsOperationMethodPublic);
19
20 public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
21
22 public override async Task RegisterCodeFixesAsync(CodeFixContext context)
23 {
24 var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
25
26 context.CancellationToken.ThrowIfCancellationRequested();
27
28 var diagnostic = context.Diagnostics.First();
29 var methodNode = root.FindNode(diagnostic.Location.SourceSpan) as MethodDeclarationSyntax;
30
31 context.CancellationToken.ThrowIfCancellationRequested();
32
33 RegisterNewCodeFix(
34 context, root, methodNode, SyntaxKind.PrivateKeyword,
35 IsOperationMethodPublicAnalyzerMakeNonPublicCodeFixConstants.PrivateDescription, diagnostic);
36 RegisterNewCodeFix(
37 context, root, methodNode, SyntaxKind.InternalKeyword,
38 IsOperationMethodPublicAnalyzerMakeNonPublicCodeFixConstants.InternalDescription, diagnostic);
39
40 var isSealed = bool.Parse(diagnostic.Properties[IsOperationMethodPublicAnalyzerConstants.IsSealed]);
41
42 if (!isSealed)
43 {
44 RegisterNewCodeFix(
45 context, root, methodNode, SyntaxKind.ProtectedKeyword,
46 IsOperationMethodPublicAnalyzerMakeNonPublicCodeFixConstants.ProtectedDescription, diagnostic);
47 }
48 }
49
50 private static void RegisterNewCodeFix(CodeFixContext context, SyntaxNode root, MethodDeclarationSyntax methodNode,
51 SyntaxKind visibility, string description, Diagnostic diagnostic)
52 {
53 var publicModifier = methodNode.Modifiers.Where(_ => _.IsKind(SyntaxKind.PublicKeyword)).First();
54 var visibilityNode = SyntaxFactory.Token(publicModifier.LeadingTrivia, visibility,
55 publicModifier.TrailingTrivia);
56 var modifiers = methodNode.Modifiers.Replace(publicModifier, visibilityNode);
57 var newwMethodNode = methodNode.WithModifiers(modifiers);
58 var newRoot = root.ReplaceNode(methodNode, newwMethodNode);
59
60 context.RegisterCodeFix(
61 CodeAction.Create(description,
62 _ => Task.FromResult(context.Document.WithSyntaxRoot(newRoot)), description), diagnostic);
63 }
64 }
65}