public override HashSet <ISymbol> GetAnalyzableSymbols(SymbolAnalysisContext context, INamedTypeSymbol containingType)
        {
            HashSet <ISymbol> properties = null;

            ImmutableArray <ISymbol> members = containingType.GetMembers();

            for (int i = 0; i < members.Length; i++)
            {
                if (members[i].IsProperty())
                {
                    var propertySymbol = (IPropertySymbol)members[i];

                    if (!propertySymbol.IsIndexer &&
                        !propertySymbol.IsReadOnly &&
                        !propertySymbol.IsImplicitlyDeclared &&
                        propertySymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty &&
                        !propertySymbol.HasAttribute(context.GetTypeByMetadataName(MetadataNames.System_Runtime_Serialization_DataMemberAttribute)))
                    {
                        IMethodSymbol setMethod = propertySymbol.SetMethod;

                        if (setMethod?.IsPrivate() == true &&
                            setMethod.GetAttributes().IsDefaultOrEmpty &&
                            setMethod.GetSyntaxOrDefault(context.CancellationToken) is AccessorDeclarationSyntax accessor &&
                            accessor.BodyOrExpressionBody() == null)
                        {
                            (properties ?? (properties = new HashSet <ISymbol>())).Add(propertySymbol);
                        }
                    }
                }
            }

            return(properties);
        }
Exemple #2
0
        public static void AnalyzeEvent(SymbolAnalysisContext context)
        {
            var eventSymbol = (IEventSymbol)context.Symbol;

            if (!eventSymbol.IsOverride &&
                eventSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty &&
                eventSymbol.FindImplementedInterfaceMember <IEventSymbol>(allInterfaces: true) == null)
            {
                var namedType = eventSymbol.Type as INamedTypeSymbol;

                if (namedType?.Arity == 0 &&
                    !namedType.Equals(context.GetTypeByMetadataName(MetadataNames.System_EventHandler)))
                {
                    IMethodSymbol method = namedType.DelegateInvokeMethod;

                    if (method != null)
                    {
                        ImmutableArray <IParameterSymbol> parameters = method.Parameters;

                        if (parameters.Length == 2 &&
                            parameters[0].Type.IsObject())
                        {
                            SyntaxNode node = eventSymbol
                                              .DeclaringSyntaxReferences
                                              .FirstOrDefault()?
                                              .GetSyntax(context.CancellationToken);

                            TypeSyntax type = GetTypeSyntax(node);

                            Debug.Assert(type != null, "");

                            if (type != null)
                            {
                                context.ReportDiagnostic(DiagnosticDescriptors.UseGenericEventHandler, type);
                            }
                        }
                    }
                }
            }
        }