private static void HandleInvocation(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var invocation = (InvocationExpressionSyntax)context.Node; var method = context.SemanticModel.GetSymbolSafe(invocation, context.CancellationToken) as IMethodSymbol; if (method == KnownSymbol.PropertyChangedEventHandler.Invoke || PropertyChanged.IsInvoker(method, context.SemanticModel, context.CancellationToken) != AnalysisResult.No) { if (PropertyChanged.TryGetInvokedPropertyChangedName(invocation, context.SemanticModel, context.CancellationToken, out ArgumentSyntax nameArg, out string propertyName) == AnalysisResult.Yes) { var type = invocation.Expression is IdentifierNameSyntax || (invocation.Expression as MemberAccessExpressionSyntax)?.Expression is ThisExpressionSyntax || (invocation.Expression as MemberAccessExpressionSyntax)?.Expression is BaseExpressionSyntax || context.SemanticModel.GetSymbolSafe(invocation, context.CancellationToken) as IMethodSymbol == KnownSymbol.PropertyChangedEventHandler.Invoke ? context.ContainingSymbol.ContainingType : context.SemanticModel.GetTypeInfoSafe((invocation.Expression as MemberAccessExpressionSyntax)?.Expression, context.CancellationToken) .Type; if (IsForExistingProperty(type, propertyName)) { return; } if (invocation.Span.Contains(nameArg.Span)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, nameArg.GetLocation())); return; } if (method == KnownSymbol.PropertyChangedEventHandler.Invoke) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, invocation.ArgumentList.Arguments[1].GetLocation())); return; } if (invocation.ArgumentList.Arguments.Count == 1) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, invocation.ArgumentList.Arguments[0].GetLocation())); return; } context.ReportDiagnostic(Diagnostic.Create(Descriptor, invocation.GetLocation())); } } }
private static void HandleMethodDeclaration(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var method = (IMethodSymbol)context.ContainingSymbol; if (method.Parameters.Length != 1 || method.Parameters[0].Type != KnownSymbol.String || method.Parameters[0].IsCallerMemberName()) { return; } if (PropertyChanged.IsInvoker(method, context.SemanticModel, context.CancellationToken) == AnalysisResult.Yes) { var methodDeclaration = (MethodDeclarationSyntax)context.Node; context.ReportDiagnostic(Diagnostic.Create(Descriptor, methodDeclaration.ParameterList.Parameters[0].GetLocation())); } }
private static void HandleInvocation(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var property = (context.ContainingSymbol as IMethodSymbol)?.AssociatedSymbol as IPropertySymbol; if (property == null) { return; } var invocation = (InvocationExpressionSyntax)context.Node; if (invocation.ArgumentList?.Arguments.Count != 1) { return; } var method = context.SemanticModel.GetSymbolSafe(invocation, context.CancellationToken) as IMethodSymbol; if (PropertyChanged.IsInvoker(method, context.SemanticModel, context.CancellationToken) == AnalysisResult.No) { return; } var argument = invocation.ArgumentList.Arguments[0]; if (argument.TryGetStringValue(context.SemanticModel, context.CancellationToken, out string text) && text == property.Name) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, argument.GetLocation())); } }