Przeglądaj źródła

更新LSEnitity成员分析, 对于泛型字段 禁止浮点数类型的泛型参数如: Dictionary<long,HashSet<float>>

wenchao 2 lat temu
rodzic
commit
23a2383d0c

+ 52 - 3
Share/Analyzer/Analyzer/EntityMemberDeclarationAnalyzer.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Collections.Immutable;
 using System.Linq;
 using Microsoft.CodeAnalysis;
@@ -118,18 +119,19 @@ namespace ET.Analyzer
         /// </summary>
         private void AnalyzeFloatMemberInLSEntity(SymbolAnalysisContext context, INamedTypeSymbol namedTypeSymbol)
         {
+            
             foreach (var member in namedTypeSymbol.GetMembers())
             {
-                ITypeSymbol? memberType = null;
+                INamedTypeSymbol? memberType = null;
                 
                 if (member is IFieldSymbol fieldSymbol)
                 {
-                    memberType = fieldSymbol.Type;
+                    memberType = fieldSymbol.Type as INamedTypeSymbol;
                 }
 
                 if (member is IPropertySymbol propertySymbol)
                 {
-                    memberType = propertySymbol.Type;
+                    memberType = propertySymbol.Type as INamedTypeSymbol;
                 }
 
                 if (memberType==null)
@@ -146,9 +148,56 @@ namespace ET.Analyzer
                     }
                     Diagnostic diagnostic = Diagnostic.Create(LSEntityFloatMemberAnalyzer.Rule, syntaxReference.GetSyntax().GetLocation(),namedTypeSymbol.Name,member.Name);
                     context.ReportDiagnostic(diagnostic);
+                    continue;
+                }
+
+                if (memberType.IsGenericType && GenericTypeHasFloatTypeArgs(memberType))
+                {
+                    var syntaxReference = member.DeclaringSyntaxReferences.FirstOrDefault();
+                    if (syntaxReference==null)
+                    {
+                        continue;
+                    }
+                    Diagnostic diagnostic = Diagnostic.Create(LSEntityFloatMemberAnalyzer.Rule, syntaxReference.GetSyntax().GetLocation(),namedTypeSymbol.Name,member.Name);
+                    context.ReportDiagnostic(diagnostic);
+                    continue;
                 }
             }
         }
+
+
+        /// <summary>
+        /// 泛型类 是否含有浮点数类型参数
+        /// 对于嵌套泛型参数 递归判断
+        /// </summary>
+        private bool GenericTypeHasFloatTypeArgs(INamedTypeSymbol namedTypeSymbol)
+        {
+            var typeArgs = namedTypeSymbol.TypeArguments;
+            foreach (var typeSymbol in typeArgs)
+            {
+                if (typeSymbol is not INamedTypeSymbol namedTypeSymbol2)
+                {
+                    break;
+                }
+
+                if (namedTypeSymbol2.IsGenericType)
+                {
+                    if (GenericTypeHasFloatTypeArgs(namedTypeSymbol2))
+                    {
+                        return true;
+                    }
+                }
+                else
+                {
+                    if (namedTypeSymbol2.SpecialType is SpecialType.System_Single or SpecialType.System_Double)
+                    {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        }
     }
 }