public void AnalyzeMethodCall(OperationAnalysisContext context)
            {
                IInvocationOperation invocation = (IInvocationOperation)context.Operation;

                if (_marshalMethods.Contains(invocation.TargetMethod.ConstructedFrom))
                {
                    bool canTransformToDisabledMarshallingEquivalent = CanTransformToDisabledMarshallingEquivalent(invocation);
                    context.ReportDiagnostic(invocation.CreateDiagnostic(
                                                 MethodUsesRuntimeMarshallingEvenWhenMarshallingDisabled,
                                                 ImmutableDictionary.Create <string, string?>().Add(CanConvertToDisabledMarshallingEquivalentKey, canTransformToDisabledMarshallingEquivalent ? "true" : null),
                                                 invocation.TargetMethod.ToDisplayString()));
                }
        public sealed override void Initialize(AnalysisContext context)
        {
            ImmutableHashSet <string> cachedDeserializationMethodNames = this.DeserializationMethodNames;

            Debug.Assert(!cachedDeserializationMethodNames.IsEmpty);

            context.EnableConcurrentExecution();

            // Security analyzer - analyze and report diagnostics on generated code.
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);

            context.RegisterCompilationStartAction(
                (CompilationStartAnalysisContext compilationStartAnalysisContext) =>
            {
                WellKnownTypeProvider wellKnownTypeProvider = WellKnownTypeProvider.GetOrCreate(
                    compilationStartAnalysisContext.Compilation);
                INamedTypeSymbol?deserializerTypeSymbol =
                    wellKnownTypeProvider.GetOrCreateTypeByMetadataName(this.DeserializerTypeMetadataName);
                if (deserializerTypeSymbol == null)
                {
                    return;
                }

                compilationStartAnalysisContext.RegisterOperationAction(
                    (OperationAnalysisContext operationAnalysisContext) =>
                {
                    IInvocationOperation invocationOperation =
                        (IInvocationOperation)operationAnalysisContext.Operation;
                    if (invocationOperation.Instance?.Type?.DerivesFrom(deserializerTypeSymbol) == true &&
                        cachedDeserializationMethodNames.Contains(invocationOperation.TargetMethod.MetadataName))
                    {
                        DiagnosticDescriptor?chosenDiagnostic =
                            this.ChooseDiagnosticDescriptor(operationAnalysisContext, wellKnownTypeProvider);
                        if (chosenDiagnostic != null)
                        {
                            operationAnalysisContext.ReportDiagnostic(
                                invocationOperation.CreateDiagnostic(
                                    chosenDiagnostic,
                                    invocationOperation.TargetMethod.ToDisplayString(
                                        SymbolDisplayFormat.MinimallyQualifiedFormat)));
                        }
                    }
                },
                    OperationKind.Invocation);

                compilationStartAnalysisContext.RegisterOperationAction(
                    (OperationAnalysisContext operationAnalysisContext) =>
                {
                    IMethodReferenceOperation methodReferenceOperation =
                        (IMethodReferenceOperation)operationAnalysisContext.Operation;
                    if (methodReferenceOperation.Instance?.Type?.DerivesFrom(deserializerTypeSymbol) == true &&
                        cachedDeserializationMethodNames.Contains(methodReferenceOperation.Method.MetadataName))
                    {
                        DiagnosticDescriptor?chosenDiagnostic =
                            this.ChooseDiagnosticDescriptor(operationAnalysisContext, wellKnownTypeProvider);
                        if (chosenDiagnostic != null)
                        {
                            operationAnalysisContext.ReportDiagnostic(
                                methodReferenceOperation.CreateDiagnostic(
                                    chosenDiagnostic,
                                    methodReferenceOperation.Method.ToDisplayString(
                                        SymbolDisplayFormat.MinimallyQualifiedFormat)));
                        }
                    }
                },
                    OperationKind.MethodReference);
            });
        }