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.
FindOperationsWithIncorrectReturnTypesAnalyzer.cs
Go to the documentation of this file.
2using Microsoft.CodeAnalysis;
3using Microsoft.CodeAnalysis.CSharp;
4using Microsoft.CodeAnalysis.CSharp.Syntax;
5using Microsoft.CodeAnalysis.Diagnostics;
6using System.Collections.Immutable;
7using System.Threading.Tasks;
8
9namespace Csla.Analyzers
10{
11 [DiagnosticAnalyzer(LanguageNames.CSharp)]
13 : DiagnosticAnalyzer
14 {
15 private static readonly DiagnosticDescriptor shouldOnlyReturnVoidOrTaskRule =
16 new DiagnosticDescriptor(
17 Constants.AnalyzerIdentifiers.FindOperationsWithIncorrectReturnTypes, FindOperationsWithIncorrectReturnTypesAnalyzerConstants.Title,
18 FindOperationsWithIncorrectReturnTypesAnalyzerConstants.Message, Constants.Categories.Design,
19 DiagnosticSeverity.Error, true,
20 helpLinkUri: HelpUrlBuilder.Build(
21 Constants.AnalyzerIdentifiers.FindOperationsWithIncorrectReturnTypes, nameof(FindOperationsWithIncorrectReturnTypesAnalyzer)));
22
23 public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
24 ImmutableArray.Create(shouldOnlyReturnVoidOrTaskRule);
25
26 public override void Initialize(AnalysisContext context)
27 {
28 context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);
29 context.EnableConcurrentExecution();
30 context.RegisterSyntaxNodeAction(AnalyzeMethodDeclaration, SyntaxKind.MethodDeclaration);
31 }
32
33 private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context)
34 {
35 var methodNode = (MethodDeclarationSyntax)context.Node;
36 var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodNode);
37 var typeSymbol = methodSymbol.ContainingType;
38
39 if (typeSymbol.IsStereotype() && methodSymbol.IsDataPortalOperation())
40 {
41 var taskType = context.Compilation.GetTypeByMetadataName(typeof(Task).FullName);
42 if(!(methodSymbol.ReturnsVoid || Equals(methodSymbol.ReturnType, taskType)))
43 {
44 context.ReportDiagnostic(Diagnostic.Create(
45 shouldOnlyReturnVoidOrTaskRule, methodSymbol.Locations[0]));
46 }
47 }
48 }
49 }
50}