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

添加分析器对Unity.Codes程序集支持

wenchao 2 лет назад
Родитель
Сommit
cb58e1ac3c
20 измененных файлов с 363 добавлено и 167 удалено
  1. 11 6
      Share/Analyzer/Analyzer/AddChildTypeAnalyzer.cs
  2. 0 5
      Share/Analyzer/Analyzer/AsyncMethodReturnTypeAnalyzer.cs
  3. 35 10
      Share/Analyzer/Analyzer/ClassDeclarationInHotfixAnalyzer.cs
  4. 28 11
      Share/Analyzer/Analyzer/ETTaskAnalyzer.cs
  5. 45 35
      Share/Analyzer/Analyzer/EntityClassDeclarationAnalyzer.cs
  6. 29 11
      Share/Analyzer/Analyzer/EntityComponentAnalyzer.cs
  7. 27 11
      Share/Analyzer/Analyzer/EntityFiledAccessAnalyzer.cs
  8. 37 13
      Share/Analyzer/Analyzer/EntityMemberDeclarationAnalyzer.cs
  9. 32 10
      Share/Analyzer/Analyzer/EntityMethodDeclarationAnalyzer.cs
  10. 33 10
      Share/Analyzer/Analyzer/HotfixProjectFieldDeclarationAnalyzer.cs
  11. 10 13
      Share/Analyzer/Analyzer/StaticClassCircularDependencyAnalyzer.cs
  12. 25 0
      Share/Analyzer/Config/AnalyzeAssembly.cs
  13. 1 1
      Share/Analyzer/Config/DiagnosticRules.cs
  14. 15 0
      Share/Analyzer/Extension/AnalyzerHelper.cs
  15. 1 0
      Unity/Assets/Scripts/HotfixView/Client/Demo/UI/UIHelper.cs
  16. 8 7
      Unity/Assets/Scripts/HotfixView/Client/LockStep/LSUnitViewSystem.cs
  17. 23 22
      Unity/Assets/Scripts/HotfixView/Client/LockStep/UI/UILSLogin/UILoginComponentSystem.cs
  18. 1 0
      Unity/Assets/Scripts/ModelView/Client/LockStep/UI/UILSRoom/UILSRoomComponent.cs
  19. 1 1
      Unity/Assets/Scripts/ModelView/Client/Module/Resource/ResourcesLoaderComponent.cs
  20. 1 1
      Unity/Assets/Scripts/ModelView/Client/Module/UI/UIComponent.cs

+ 11 - 6
Share/Analyzer/Analyzer/AddChildTypeAnalyzer.cs

@@ -22,16 +22,21 @@ namespace ET.Analyzer
 
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+            //context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+           context.RegisterCompilationStartAction((analysisContext =>
+           {
+               if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+               {
+                   analysisContext.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+               }else if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllModelHotfix))
+               {
+                   analysisContext.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+               }
+           }));
         }
 
         private void AnalyzeMemberAccessExpression(SyntaxNodeAnalysisContext context)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
-            {
-                return;
-            }
-
             if (!(context.Node is MemberAccessExpressionSyntax memberAccessExpressionSyntax))
             {
                 return;

+ 0 - 5
Share/Analyzer/Analyzer/AsyncMethodReturnTypeAnalyzer.cs

@@ -26,11 +26,6 @@ namespace ET.Analyzer
 
         private void Analyzer(SyntaxNodeAnalysisContext context)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.All))
-            {
-                return;
-            }
-
             IMethodSymbol? methodSymbol = null;
             
             if (context.Node is MethodDeclarationSyntax methodDeclarationSyntax)

+ 35 - 10
Share/Analyzer/Analyzer/ClassDeclarationInHotfixAnalyzer.cs

@@ -1,5 +1,8 @@
 using System.Collections.Immutable;
+using System.Linq;
 using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
 using Microsoft.CodeAnalysis.Diagnostics;
 
 namespace ET.Analyzer
@@ -30,21 +33,42 @@ namespace ET.Analyzer
 
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllHotfix))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllHotfix))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
 
-        private void Analyzer(SymbolAnalysisContext context)
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllHotfix))
+            foreach (var classDeclarationSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<ClassDeclarationSyntax>())
             {
-                return;
-            }
-
-            if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
-            {
-                return;
+                var classTypeSymbol = analysisContext.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
+                if (classTypeSymbol!=null)
+                {
+                    Analyzer(analysisContext, classTypeSymbol);
+                }
             }
-
+        }
+        
+        private void Analyzer(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        {
             if (namedTypeSymbol.IsStatic)
             {
                 return;
@@ -55,6 +79,7 @@ namespace ET.Analyzer
                 foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
                 {
                     Diagnostic diagnostic = Diagnostic.Create(Rule, declaringSyntaxReference.GetSyntax()?.GetLocation(), namedTypeSymbol.Name);
+                    //Diagnostic diagnostic = Diagnostic.Create(Rule, declaringSyntaxReference.GetSyntax()?.GetLocation(), context.SemanticModel.SyntaxTree.FilePath);
                     context.ReportDiagnostic(diagnostic);
                 }
             }

+ 28 - 11
Share/Analyzer/Analyzer/ETTaskAnalyzer.cs

@@ -21,21 +21,38 @@ namespace ET.Analyzer
             }
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression,SyntaxKind.SimpleMemberAccessExpression);
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllModelHotfix))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
-
-        private void AnalyzeMemberAccessExpression(SyntaxNodeAnalysisContext context)
+        
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
-            {
-                return;
-            }
-            
-            if (!(context.Node is MemberAccessExpressionSyntax memberAccessExpressionSyntax))
+            foreach (var memberAccessExpressionSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<MemberAccessExpressionSyntax>())
             {
-                return;
+                AnalyzeMemberAccessExpression(analysisContext, memberAccessExpressionSyntax);
             }
-            
+        }
+
+        private void AnalyzeMemberAccessExpression(SemanticModelAnalysisContext context, MemberAccessExpressionSyntax memberAccessExpressionSyntax)
+        {
             // 获取方法调用Syntax 对应的methodSymbol
             if (!(memberAccessExpressionSyntax?.Parent is InvocationExpressionSyntax invocationExpressionSyntax) ||
                 !(context.SemanticModel.GetSymbolInfo(invocationExpressionSyntax).Symbol is IMethodSymbol methodSymbol))

+ 45 - 35
Share/Analyzer/Analyzer/EntityClassDeclarationAnalyzer.cs

@@ -4,44 +4,54 @@ using Microsoft.CodeAnalysis.Diagnostics;
 
 namespace ET.Analyzer
 {
-    /*
-    [DiagnosticAnalyzer(LanguageNames.CSharp)]
-    public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer
-    {
-        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule);
+     
+     [DiagnosticAnalyzer(LanguageNames.CSharp)]
+     public class EntityClassDeclarationAnalyzer: DiagnosticAnalyzer
+     {
+         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(EntityClassDeclarationAnalyzerRule.Rule);
 
-        public override void Initialize(AnalysisContext context)
-        {
-            if (!AnalyzerGlobalSetting.EnableAnalyzer)
-            {
-                return;
-            }
+         public override void Initialize(AnalysisContext context)
+         {
+             if (!AnalyzerGlobalSetting.EnableAnalyzer)
+             {
+                 return;
+             }
 
-            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
-            context.EnableConcurrentExecution();
-            context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
-        }
+             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
+             context.EnableConcurrentExecution();
+             context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
+         }
 
-        private void Analyzer(SymbolAnalysisContext context)
-        {
-            if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
-            {
-                return;
-            }
+         private void Analyzer(SymbolAnalysisContext context)
+         {
+             if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
+             {
+                 return;
+             }
 
-            string? t = namedTypeSymbol.BaseType?.BaseType?.ToString();
-            if (t != Definition.EntityType && t != "ET.LSEntity")
-            {
-                return;
-            }
+             string? t = namedTypeSymbol.BaseType?.BaseType?.ToString();
 
-            foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
-            {
-                SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
-                Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name, context.Compilation.AssemblyName);
-                context.ReportDiagnostic(diagnostic);
-            }
-        }
-    }
-    */
+             if (t=="ET.LSEntity")
+             {
+                 foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
+                 {
+                     SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
+                     Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.LSEntityType );
+                     context.ReportDiagnostic(diagnostic);
+                 }
+                 return;
+             }
+
+             if (namedTypeSymbol.BaseType?.ToString()!="ET.LSEntity" && t == Definition.EntityType)
+             {
+                 foreach (SyntaxReference? declaringSyntaxReference in namedTypeSymbol.DeclaringSyntaxReferences)
+                 {
+                     SyntaxNode classSyntax = declaringSyntaxReference.GetSyntax();
+                     Diagnostic diagnostic = Diagnostic.Create(EntityClassDeclarationAnalyzerRule.Rule, classSyntax.GetLocation(), namedTypeSymbol.Name,Definition.EntityType);
+                     context.ReportDiagnostic(diagnostic);
+                 }
+             }
+         }
+     }
+     
 }

+ 29 - 11
Share/Analyzer/Analyzer/EntityComponentAnalyzer.cs

@@ -21,20 +21,39 @@ namespace ET.Analyzer
             }
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+            
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllModelHotfix))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
 
-        private void AnalyzeMemberAccessExpression(SyntaxNodeAnalysisContext context)
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
+            foreach (var memberAccessExpressionSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<MemberAccessExpressionSyntax>())
             {
-                return;
+                AnalyzeMemberAccessExpression(analysisContext, memberAccessExpressionSyntax);
             }
+        }
 
-            if (!(context.Node is MemberAccessExpressionSyntax memberAccessExpressionSyntax))
-            {
-                return;
-            }
+        private void AnalyzeMemberAccessExpression(SemanticModelAnalysisContext context, MemberAccessExpressionSyntax memberAccessExpressionSyntax)
+        {
             
             // 筛选出 Component函数syntax
             string methodName = memberAccessExpressionSyntax.Name.Identifier.Text;
@@ -60,7 +79,7 @@ namespace ET.Analyzer
             // 对于Entity基类会报错 除非标记了EnableAccessEntiyChild
             if (parentTypeSymbol.ToString() is Definition.EntityType or Definition.LSEntityType)
             {
-                HandleAcessEntityChild(context);
+                HandleAcessEntityChild(context,memberAccessExpressionSyntax);
                 return;
             }
 
@@ -214,9 +233,8 @@ namespace ET.Analyzer
             }
         }
         
-        private void HandleAcessEntityChild(SyntaxNodeAnalysisContext context)
+        private void HandleAcessEntityChild(SemanticModelAnalysisContext context, MemberAccessExpressionSyntax memberAccessExpressionSyntax)
         {
-            var memberAccessExpressionSyntax = context.Node as MemberAccessExpressionSyntax;
             //在方法体内
             var methodDeclarationSyntax = memberAccessExpressionSyntax?.GetNeareastAncestor<MethodDeclarationSyntax>();
             if (methodDeclarationSyntax!=null)

+ 27 - 11
Share/Analyzer/Analyzer/EntityFiledAccessAnalyzer.cs

@@ -33,23 +33,39 @@ namespace ET.Analyzer
 
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSyntaxNodeAction(this.AnalyzeMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression);
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllModelHotfix))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
-
-        private void AnalyzeMemberAccessExpression(SyntaxNodeAnalysisContext context)
+        
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModelHotfix))
-            {
-                return;
-            }
-
-            if (!(context.Node is MemberAccessExpressionSyntax memberAccessExpressionSyntax))
+            foreach (var memberAccessExpressionSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<MemberAccessExpressionSyntax>())
             {
-                return;
+                AnalyzeMemberAccessExpression(analysisContext, memberAccessExpressionSyntax);
             }
+        }
 
+        private void AnalyzeMemberAccessExpression(SemanticModelAnalysisContext context, MemberAccessExpressionSyntax memberAccessExpressionSyntax)
+        {
             // -----筛选出实体类的字段symbol-----
-
             ISymbol? filedSymbol = context.SemanticModel.GetSymbolInfo(memberAccessExpressionSyntax).Symbol;
             if (filedSymbol == null || !(filedSymbol is IFieldSymbol))
             {

+ 37 - 13
Share/Analyzer/Analyzer/EntityMemberDeclarationAnalyzer.cs

@@ -3,6 +3,8 @@ using System.Collections.Generic;
 using System.Collections.Immutable;
 using System.Linq;
 using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
 using Microsoft.CodeAnalysis.Diagnostics;
 
 namespace ET.Analyzer
@@ -21,21 +23,43 @@ namespace ET.Analyzer
             }
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllModel))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllModel))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
-
-        private void Analyzer(SymbolAnalysisContext context)
+        
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModel))
+            foreach (var classDeclarationSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<ClassDeclarationSyntax>())
             {
-                return;
-            }
-            
-            if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
-            {
-                return;
+                var classTypeSymbol = analysisContext.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
+                if (classTypeSymbol!=null)
+                {
+                    Analyzer(analysisContext, classTypeSymbol);
+                }
             }
+        }
 
+        private void Analyzer(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        {
+            
             var baseType = namedTypeSymbol.BaseType?.ToString();
             // 筛选出实体类
             if (baseType== Definition.EntityType)
@@ -53,7 +77,7 @@ namespace ET.Analyzer
         /// <summary>
         /// 检查委托成员
         /// </summary>
-        private void AnalyzeDelegateMember(SymbolAnalysisContext context,INamedTypeSymbol namedTypeSymbol)
+        private void AnalyzeDelegateMember(SemanticModelAnalysisContext context,INamedTypeSymbol namedTypeSymbol)
         {
             foreach (var member in namedTypeSymbol.GetMembers())
             {
@@ -87,7 +111,7 @@ namespace ET.Analyzer
         /// <summary>
         /// 检查实体成员
         /// </summary>
-        private void AnalyzeEntityMember(SymbolAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        private void AnalyzeEntityMember(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
         {
             foreach (var member in namedTypeSymbol.GetMembers())
             {
@@ -117,7 +141,7 @@ namespace ET.Analyzer
         /// <summary>
         /// 检查LSEntity中 是否有浮点数字段
         /// </summary>
-        private void AnalyzeFloatMemberInLSEntity(SymbolAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        private void AnalyzeFloatMemberInLSEntity(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
         {
             
             foreach (var member in namedTypeSymbol.GetMembers())

+ 32 - 10
Share/Analyzer/Analyzer/EntityMethodDeclarationAnalyzer.cs

@@ -38,21 +38,43 @@ namespace ET.Analyzer
 
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
+            
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllModel))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllModel))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
-
-        private void Analyzer(SymbolAnalysisContext context)
+        
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllModel))
+            foreach (var classDeclarationSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<ClassDeclarationSyntax>())
             {
-                return;
-            }
-            
-            if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
-            {
-                return;
+                var classTypeSymbol = analysisContext.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
+                if (classTypeSymbol!=null)
+                {
+                    Analyzer(analysisContext, classTypeSymbol);
+                }
             }
+        }
 
+        private void Analyzer(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        {
             // 筛选出实体类
             if (namedTypeSymbol.BaseType?.ToString() != Definition.EntityType && namedTypeSymbol.BaseType?.ToString() != Definition.LSEntityType)
             {

+ 33 - 10
Share/Analyzer/Analyzer/HotfixProjectFieldDeclarationAnalyzer.cs

@@ -1,5 +1,7 @@
 using System.Collections.Immutable;
 using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
 using Microsoft.CodeAnalysis.Diagnostics;
 
 namespace ET.Analyzer
@@ -30,21 +32,42 @@ namespace ET.Analyzer
 
             context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
             context.EnableConcurrentExecution();
-            context.RegisterSymbolAction(this.Analyzer, SymbolKind.NamedType);
+            context.RegisterCompilationStartAction((analysisContext =>
+            {
+                if (analysisContext.Compilation.AssemblyName==AnalyzeAssembly.UnityCodes)
+                {
+                    analysisContext.RegisterSemanticModelAction((modelAnalysisContext =>
+                    {
+                        if (AnalyzerHelper.IsSemanticModelNeedAnalyze(modelAnalysisContext.SemanticModel,UnityCodesPath.AllHotfix))
+                        {
+                            AnalyzeSemanticModel(modelAnalysisContext);
+                        }
+                        
+                    } ));
+                    return;
+                }
+                
+                if (AnalyzerHelper.IsAssemblyNeedAnalyze(analysisContext.Compilation.AssemblyName,AnalyzeAssembly.AllHotfix))
+                {
+                    analysisContext.RegisterSemanticModelAction((this.AnalyzeSemanticModel));
+                }
+            } ));
         }
-
-        private void Analyzer(SymbolAnalysisContext context)
+        
+        private void AnalyzeSemanticModel(SemanticModelAnalysisContext analysisContext)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllHotfix))
-            {
-                return;
-            }
-
-            if (!(context.Symbol is INamedTypeSymbol namedTypeSymbol))
+            foreach (var classDeclarationSyntax in analysisContext.SemanticModel.SyntaxTree.GetRoot().DescendantNodes<ClassDeclarationSyntax>())
             {
-                return;
+                var classTypeSymbol = analysisContext.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
+                if (classTypeSymbol!=null)
+                {
+                    Analyzer(analysisContext, classTypeSymbol);
+                }
             }
+        }
 
+        private void Analyzer(SemanticModelAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
+        {
             foreach (ISymbol? memberSymbol in namedTypeSymbol.GetMembers())
             {
                 // 筛选出属性成员

+ 10 - 13
Share/Analyzer/Analyzer/StaticClassCircularDependencyAnalyzer.cs

@@ -43,24 +43,21 @@ namespace ET.Analyzer
 
         private void CompilationStartAnalysis(CompilationStartAnalysisContext context)
         {
-            if (!AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllHotfix))
+            var dependencyMap = new ConcurrentDictionary<string, HashSet<string>>();
+            var staticClassSet = new HashSet<string>();
+            
+            if (context.Compilation.AssemblyName == AnalyzeAssembly.UnityCodes)
             {
+                context.RegisterSyntaxNodeAction(analysisContext => { this.StaticClassDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); }, SyntaxKind.InvocationExpression);
+                context.RegisterCompilationEndAction(analysisContext => { this.CircularDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); });
                 return;
             }
-
-            if (context.Compilation.AssemblyName == null)
+            
+            if (AnalyzerHelper.IsAssemblyNeedAnalyze(context.Compilation.AssemblyName, AnalyzeAssembly.AllHotfix))
             {
-                return;
+                context.RegisterSyntaxNodeAction(analysisContext => { this.StaticClassDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); }, SyntaxKind.InvocationExpression);
+                context.RegisterCompilationEndAction(analysisContext => { this.CircularDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); });
             }
-
-            var dependencyMap = new ConcurrentDictionary<string, HashSet<string>>();
-            var staticClassSet = new HashSet<string>();
-
-            context.RegisterSyntaxNodeAction(
-                analysisContext => { this.StaticClassDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); },
-                SyntaxKind.InvocationExpression);
-
-            context.RegisterCompilationEndAction(analysisContext => { this.CircularDependencyAnalyze(analysisContext, dependencyMap, staticClassSet); });
         }
 
         

+ 25 - 0
Share/Analyzer/Config/AnalyzeAssembly.cs

@@ -12,6 +12,8 @@
         private const string UnityModelView = "Unity.ModelView";
         private const string UnityHotfixView = "Unity.HotfixView";
 
+        public const string UnityCodes = "Unity.Codes";
+
         public static readonly string[] AllHotfix =
         {
             DotNetHotfix, UnityHotfix, UnityHotfixView, 
@@ -33,12 +35,35 @@
         {
             DotNetCore, DotNetModel, DotNetHotfix, 
             UnityCore, UnityModel, UnityHotfix, UnityModelView, UnityHotfixView, 
+            UnityCodes,
         };
 
         public static readonly string[] ServerModelHotfix =
         {
             DotNetModel,DotNetHotfix,
         };
+    }
+
+    public static class UnityCodesPath
+    {
+        private const string UnityModel = @"Unity\Assets\Scripts\Model\";
+        private const string UnityModelView = @"Unity\Assets\Scripts\ModelView\";
+        private const string UnityHotfix = @"Unity\Assets\Scripts\Hotfix\";
+        private const string UnityHotfixView = @"Unity\Assets\Scripts\HotfixView\";
+
+        public static readonly string[] AllModelHotfix =
+        {
+            UnityModel, UnityHotfix, UnityModelView, UnityHotfixView, 
+        };
+        
+        public static readonly string[] AllHotfix =
+        {
+            UnityHotfix, UnityHotfixView, 
+        };
 
+        public static readonly string[] AllModel =
+        {
+            UnityModel, UnityModelView
+        };
     }
 }

+ 1 - 1
Share/Analyzer/Config/DiagnosticRules.cs

@@ -223,7 +223,7 @@ namespace ET.Analyzer
     {
         private const string Title = "实体类限制多层继承";
 
-        private const string MessageFormat = "类: {0} 不能继承Entiy的子类 请直接继承Entity";
+        private const string MessageFormat = "类: {0} 不能继承{1}的子类 请直接继承{1}";
 
         private const string Description = "实体类限制多层继承.";
 

+ 15 - 0
Share/Analyzer/Extension/AnalyzerHelper.cs

@@ -398,5 +398,20 @@ namespace ET.Analyzer
 
             return namespaceName;
         }
+
+        /// <summary>
+        /// 根据语义模型的文件路径 判断是否需要分析
+        /// </summary>
+        public static bool IsSemanticModelNeedAnalyze(SemanticModel semanticModel, params string[] filePaths)
+        {
+            foreach (var filePath in filePaths)
+            {
+                if (semanticModel.SyntaxTree.FilePath.Contains(filePath))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
     }
 }

+ 1 - 0
Unity/Assets/Scripts/HotfixView/Client/Demo/UI/UIHelper.cs

@@ -2,6 +2,7 @@
 {
     public static class UIHelper
     {
+        [EnableAccessEntiyChild]
         public static async ETTask<UI> Create(Entity scene, string uiType, UILayer uiLayer)
         {
             return await scene.GetComponent<UIComponent>().Create(uiType, uiLayer);

+ 8 - 7
Unity/Assets/Scripts/HotfixView/Client/LockStep/LSUnitViewSystem.cs

@@ -4,6 +4,7 @@ using UnityEngine;
 
 namespace ET.Client
 {
+    [FriendOfAttribute(typeof(ET.LSUnitView))]
     public static partial class LSUnitViewSystem
     {
         [EntitySystem]
@@ -11,9 +12,9 @@ namespace ET.Client
         {
             self.GameObject = go;
             self.Transform = go.transform;
-            
+
         }
-        
+
         [LSEntitySystem]
         private static void LSRollback(this LSUnitView self)
         {
@@ -23,16 +24,16 @@ namespace ET.Client
             //self.t = 0;
             //self.totalTime = 0;
         }
-        
+
         [EntitySystem]
         private static void Update(this LSUnitView self)
         {
             LSUnit unit = self.GetUnit();
-            
+
             Vector3 unitPos = unit.Position.ToVector();
             const float speed = 6f;
             float speed2 = speed;// * self.Room().SpeedMultiply;
-            
+
             if (unitPos != self.Position)
             {
                 float distance = (unitPos - self.Position).magnitude;
@@ -41,8 +42,8 @@ namespace ET.Client
                 self.Position = unit.Position.ToVector();
                 self.Rotation = unit.Rotation.ToQuaternion();
             }
-            
-            
+
+
             LSInput input = unit.GetComponent<LSInputComponent>().LSInput;
             if (input.V != TSVector2.zero)
             {

+ 23 - 22
Unity/Assets/Scripts/HotfixView/Client/LockStep/UI/UILSLogin/UILoginComponentSystem.cs

@@ -3,27 +3,28 @@ using UnityEngine.UI;
 
 namespace ET.Client
 {
-	[FriendOf(typeof(UILoginComponent))]
-	public static partial class UILSLoginComponentSystem
-	{
-		[EntitySystem]
-		private static void Awake(this UILSLoginComponent self)
-		{
-			ReferenceCollector rc = self.GetParent<UI>().GameObject.GetComponent<ReferenceCollector>();
-			self.loginBtn = rc.Get<GameObject>("LoginBtn");
-			
-			self.loginBtn.GetComponent<Button>().onClick.AddListener(()=> { self.OnLogin(); });
-			self.account = rc.Get<GameObject>("Account");
-			self.password = rc.Get<GameObject>("Password");
-		}
+    [FriendOf(typeof(UILoginComponent))]
+    [FriendOfAttribute(typeof(ET.Client.UILSLoginComponent))]
+    public static partial class UILSLoginComponentSystem
+    {
+        [EntitySystem]
+        private static void Awake(this UILSLoginComponent self)
+        {
+            ReferenceCollector rc = self.GetParent<UI>().GameObject.GetComponent<ReferenceCollector>();
+            self.loginBtn = rc.Get<GameObject>("LoginBtn");
 
-		
-		public static void OnLogin(this UILSLoginComponent self)
-		{
-			LoginHelper.Login(
-				self.DomainScene(), 
-				self.account.GetComponent<InputField>().text, 
-				self.password.GetComponent<InputField>().text).Coroutine();
-		}
-	}
+            self.loginBtn.GetComponent<Button>().onClick.AddListener(() => { self.OnLogin(); });
+            self.account = rc.Get<GameObject>("Account");
+            self.password = rc.Get<GameObject>("Password");
+        }
+
+
+        public static void OnLogin(this UILSLoginComponent self)
+        {
+            LoginHelper.Login(
+                self.DomainScene(),
+                self.account.GetComponent<InputField>().text,
+                self.password.GetComponent<InputField>().text).Coroutine();
+        }
+    }
 }

+ 1 - 0
Unity/Assets/Scripts/ModelView/Client/LockStep/UI/UILSRoom/UILSRoomComponent.cs

@@ -3,6 +3,7 @@ using UnityEngine.UI;
 
 namespace ET.Client
 {
+    [ComponentOf(typeof(UI))]
     public class UILSRoomComponent: Entity, IAwake, IUpdate
     {
         public Button saveReplay;

+ 1 - 1
Unity/Assets/Scripts/ModelView/Client/Module/Resource/ResourcesLoaderComponent.cs

@@ -62,7 +62,7 @@ namespace ET.Client
         }
     }
 
-    [ComponentOf(typeof (Scene))]
+    [ComponentOf]
     public class ResourcesLoaderComponent: Entity, IAwake, IDestroy
     {
         public HashSet<string> LoadedResource = new HashSet<string>();

+ 1 - 1
Unity/Assets/Scripts/ModelView/Client/Module/UI/UIComponent.cs

@@ -5,7 +5,7 @@ namespace ET.Client
 	/// <summary>
 	/// 管理Scene上的UI
 	/// </summary>
-	[ComponentOf(typeof(Scene))]
+	[ComponentOf]
 	public class UIComponent: Entity, IAwake
 	{
 		public Dictionary<string, UI> UIs = new Dictionary<string, UI>();