瀏覽代碼

添加分析器 实体类禁止同时标记为Component和Child (#524)

susices 2 年之前
父節點
當前提交
7311a19c84

+ 18 - 1
Share/Analyzer/Analyzer/EntityMemberDeclarationAnalyzer.cs

@@ -13,7 +13,7 @@ namespace ET.Analyzer
     public class EntityMemberDeclarationAnalyzer: DiagnosticAnalyzer
     {
         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>ImmutableArray.Create(EntityDelegateDeclarationAnalyzerRule.Rule,
-            EntityFieldDeclarationInEntityAnalyzerRule.Rule, LSEntityFloatMemberAnalyzer.Rule);
+            EntityFieldDeclarationInEntityAnalyzerRule.Rule, LSEntityFloatMemberAnalyzer.Rule, EntityComponentChildAnalyzerRule.Rule);
         
         public override void Initialize(AnalysisContext context)
         {
@@ -53,11 +53,13 @@ namespace ET.Analyzer
             {
                 AnalyzeDelegateMember(context, namedTypeSymbol);
                 AnalyzeEntityMember(context, namedTypeSymbol);
+                AnalyzeComponentChildAttr(context, namedTypeSymbol);
             }else if (baseType == Definition.LSEntityType)
             {
                 AnalyzeDelegateMember(context, namedTypeSymbol);
                 AnalyzeEntityMember(context, namedTypeSymbol);
                 AnalyzeFloatMemberInLSEntity(context,namedTypeSymbol);
+                AnalyzeComponentChildAttr(context, namedTypeSymbol);
             }
         }
 
@@ -209,6 +211,21 @@ namespace ET.Analyzer
 
             return false;
         }
+
+        /// <summary>
+        /// 实体类是否同时标记为component child
+        /// </summary>
+        private void AnalyzeComponentChildAttr(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        {
+            bool hasComponentOf = namedTypeSymbol.HasAttribute(Definition.ComponentOfAttribute);
+            bool hasChildOf = namedTypeSymbol.HasAttribute(Definition.ChildOfAttribute);
+            if (hasComponentOf && hasChildOf)
+            {
+                var syntax = namedTypeSymbol.DeclaringSyntaxReferences.First().GetSyntax() as ClassDeclarationSyntax;
+                Diagnostic diagnostic = Diagnostic.Create(EntityComponentChildAnalyzerRule.Rule, syntax?.Identifier.GetLocation(),namedTypeSymbol.Name);
+                context.ReportDiagnostic(diagnostic);
+            }
+        }
     }
 }
 

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

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

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

@@ -395,4 +395,22 @@ namespace ET.Analyzer
                     true,
                     Description);
     }
+    
+    public static class EntityComponentChildAnalyzerRule
+    {
+        private const string Title = "实体类禁止同时标记为Component和Child";
+
+        private const string MessageFormat = "实体类:{0} 禁止同时标记为Component和Child";
+
+        private const string Description = "实体类禁止同时标记为Component和Child.";
+
+        public static readonly DiagnosticDescriptor Rule =
+                new DiagnosticDescriptor(DiagnosticIds.EntityComponentChildAnalyzerRuleId,
+                    Title,
+                    MessageFormat,
+                    DiagnosticCategories.All,
+                    DiagnosticSeverity.Error,
+                    true,
+                    Description);
+    }
 }

+ 0 - 1
Unity/Assets/Scripts/Codes/Model/Share/LockStep/LSWorld.cs

@@ -26,7 +26,6 @@ namespace ET
 
     [EnableMethod]
     [ChildOf]
-    [ComponentOf]
     [MemoryPackable]
     public partial class LSWorld: Entity, IAwake, IScene
     {