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); }
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); } } } } } }