private static void OnCompilationStart(CompilationStartAnalysisContext context) { ImmutableHashSet <IMethodSymbol> .Builder syncMethods = ImmutableHashSet.CreateBuilder <IMethodSymbol>(); ImmutableHashSet <IMethodSymbol> .Builder asyncMethods = ImmutableHashSet.CreateBuilder <IMethodSymbol>(); INamedTypeSymbol? namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemLinqEnumerable); IEnumerable <IMethodSymbol>?methods = namedType?.GetMembers(Count).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(syncMethods, methods); methods = namedType?.GetMembers(LongCount).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(syncMethods, methods); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemLinqQueryable); methods = namedType?.GetMembers(Count).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(syncMethods, methods); methods = namedType?.GetMembers(LongCount).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(syncMethods, methods); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.MicrosoftEntityFrameworkCoreEntityFrameworkQueryableExtensions); methods = namedType?.GetMembers(CountAsync).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(asyncMethods, methods); methods = namedType?.GetMembers(LongCountAsync).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(asyncMethods, methods); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemDataEntityQueryableExtensions); methods = namedType?.GetMembers(CountAsync).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(asyncMethods, methods); methods = namedType?.GetMembers(LongCountAsync).OfType <IMethodSymbol>().Where(m => m.Parameters.Length <= 2); AddIfNotNull(asyncMethods, methods); // Allowed types that should report a CA1836 diagnosis given that there is proven benefit on doing so. ImmutableHashSet <ITypeSymbol> .Builder allowedTypesBuilder = ImmutableHashSet.CreateBuilder <ITypeSymbol>(); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemCollectionsConcurrentConcurrentBag1); allowedTypesBuilder.AddIfNotNull(namedType); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemCollectionsConcurrentConcurrentDictionary2); allowedTypesBuilder.AddIfNotNull(namedType); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemCollectionsConcurrentConcurrentQueue1); allowedTypesBuilder.AddIfNotNull(namedType); namedType = context.Compilation.GetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemCollectionsConcurrentConcurrentStack1); allowedTypesBuilder.AddIfNotNull(namedType); ImmutableHashSet <ITypeSymbol> allowedTypesForCA1836 = allowedTypesBuilder.ToImmutable(); if (syncMethods.Count > 0 || asyncMethods.Count > 0) { context.RegisterOperationAction(operationContext => AnalyzeInvocationOperation( operationContext, syncMethods.ToImmutable(), asyncMethods.ToImmutable(), allowedTypesForCA1836), OperationKind.Invocation); } if (!allowedTypesForCA1836.IsEmpty) { context.RegisterOperationAction(operationContext => AnalyzePropertyReference( operationContext, allowedTypesForCA1836), OperationKind.PropertyReference); }