Просмотр исходного кода

实体类禁止声明为泛型实体类 (#544)

susices 2 лет назад
Родитель
Сommit
51f226cf00

+ 15 - 1
Share/Analyzer/Analyzer/EntityClassDeclarationAnalyzer.cs

@@ -1,4 +1,5 @@
 using System.Collections.Immutable;
+using System.Linq;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis.Diagnostics;
 
@@ -8,7 +9,7 @@ namespace ET.Analyzer
      [DiagnosticAnalyzer(LanguageNames.CSharp)]
      public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer
      {
-         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule);
+         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule,EntityCannotDeclareGenericTypeRule.Rule);
 
          public override void Initialize(AnalysisContext context)
          {
@@ -50,6 +51,19 @@ namespace ET.Analyzer
                      Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.EntityType);
                      context.ReportDiagnostic(diagnostic);
                  }
+                 return;
+             }
+
+             var baseType = namedTypeSymbol.BaseType?.ToString();
+             if (baseType == Definition.EntityType || baseType == Definition.LSEntityType)
+             {
+                 if (namedTypeSymbol.IsGenericType)
+                 {
+                     var entitySyntax = namedTypeSymbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax();
+                     Diagnostic diagnostic = Diagnostic.Create(EntityCannotDeclareGenericTypeRule.Rule, entitySyntax?.GetLocation(),
+                         namedTypeSymbol.Name);
+                     context.ReportDiagnostic(diagnostic);
+                 }
              }
          }
      }

+ 2 - 0
Share/Analyzer/Config/DiagnosticIds.cs

@@ -58,5 +58,7 @@
         public const string EntityHashCodeAnalyzerRuleId = "ET0027";
 
         public const string EntityComponentChildAnalyzerRuleId = "ET0028";
+
+        public const string EntityCannotDeclareGenericTypeRuleId = "ET0029";
     }
 }

+ 18 - 0
Share/Analyzer/Config/DiagnosticRules.cs

@@ -413,4 +413,22 @@ namespace ET.Analyzer
                     true,
                     Description);
     }
+    
+    public static class EntityCannotDeclareGenericTypeRule
+    {
+        private const string Title = "实体类禁止声明为泛型实体类";
+
+        private const string MessageFormat = "实体类:{0} 禁止声明为泛型实体类";
+
+        private const string Description = "实体类禁止声明为泛型实体类.";
+
+        public static readonly DiagnosticDescriptor Rule =
+                new DiagnosticDescriptor(DiagnosticIds.EntityCannotDeclareGenericTypeRuleId,
+                    Title,
+                    MessageFormat,
+                    DiagnosticCategories.All,
+                    DiagnosticSeverity.Error,
+                    true,
+                    Description);
+    }
 }