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