예제 #1
0
        private static void Handle(SyntaxNodeAnalysisContext context)
        {
            if (!context.IsExcludedFromAnalysis() &&
                context.ContainingSymbol is IEventSymbol eventSymbol &&
                context.Node is EventDeclarationSyntax eventDeclaration &&
                EventDeclarationWalker.TryGetCalls(eventDeclaration, out var addCall, out var removeCall))
            {
                if (addCall.TryGetMethodName(out var addName) &&
                    addName != "AddHandler")
                {
                    context.ReportDiagnostic(
                        Diagnostic.Create(
                            Descriptors.WPF0104EventDeclarationAddHandlerInAdd,
                            addCall.GetLocation()));
                }

                if (removeCall.TryGetMethodName(out var removeName) &&
                    removeName != "RemoveHandler")
                {
                    context.ReportDiagnostic(
                        Diagnostic.Create(
                            Descriptors.WPF0105EventDeclarationRemoveHandlerInRemove,
                            removeCall.GetLocation()));
                }

                if (addCall.TryGetArgumentAtIndex(0, out var addArg) &&
                    addArg.Expression is IdentifierNameSyntax addIdentifier &&
                    removeCall.TryGetArgumentAtIndex(0, out var removeArg) &&
                    removeArg.Expression is IdentifierNameSyntax removeIdentifier)
                {
                    if (addIdentifier.Identifier.ValueText != removeIdentifier.Identifier.ValueText)
                    {
                        context.ReportDiagnostic(
                            Diagnostic.Create(
                                Descriptors.WPF0103EventDeclarationAddRemove,
                                eventDeclaration.Identifier.GetLocation(),
                                addIdentifier.Identifier.ValueText,
                                removeIdentifier.Identifier.ValueText));
                    }
                    else if (eventDeclaration.Parent is TypeDeclarationSyntax typeDeclaration &&
                             BackingFieldWalker.TryGetRegistration(typeDeclaration, addIdentifier.Identifier.ValueText, out var registration) &&
                             registration.ArgumentList is { })
예제 #2
0
        private static void Handle(SyntaxNodeAnalysisContext context)
        {
            if (!context.IsExcludedFromAnalysis() &&
                context.ContainingSymbol is IEventSymbol eventSymbol &&
                context.Node is EventDeclarationSyntax eventDeclaration &&
                EventDeclarationWalker.TryGetCalls(eventDeclaration, out var addCall, out var removeCall))
            {
                if (addCall.TryGetMethodName(out var addName) &&
                    addName != "AddHandler")
                {
                    context.ReportDiagnostic(
                        Diagnostic.Create(
                            Descriptors.WPF0104EventDeclarationAddHandlerInAdd,
                            addCall.GetLocation()));
                }

                if (removeCall.TryGetMethodName(out var removeName) &&
                    removeName != "RemoveHandler")
                {
                    context.ReportDiagnostic(
                        Diagnostic.Create(
                            Descriptors.WPF0105EventDeclarationRemoveHandlerInRemove,
                            removeCall.GetLocation()));
                }

                if (addCall.TryGetArgumentAtIndex(0, out var addArg) &&
                    addArg.Expression is IdentifierNameSyntax addIdentifier &&
                    removeCall.TryGetArgumentAtIndex(0, out var removeArg) &&
                    removeArg.Expression is IdentifierNameSyntax removeIdentifier)
                {
                    if (addIdentifier.Identifier.ValueText != removeIdentifier.Identifier.ValueText)
                    {
                        context.ReportDiagnostic(
                            Diagnostic.Create(
                                Descriptors.WPF0103EventDeclarationAddRemove,
                                eventDeclaration.Identifier.GetLocation(),
                                addIdentifier.Identifier.ValueText,
                                removeIdentifier.Identifier.ValueText));
                    }
                    else if (BackingFieldWalker.TryGetRegistration(eventDeclaration.Parent as TypeDeclarationSyntax, addIdentifier.Identifier.ValueText, out var registration) &&
                             registration.ArgumentList != null)
                    {
                        if (registration.TryGetArgumentAtIndex(0, out var nameARg) &&
                            nameARg.TryGetStringValue(context.SemanticModel, context.CancellationToken, out var registeredName) &&
                            registeredName != eventSymbol.Name)
                        {
                            context.ReportDiagnostic(
                                Diagnostic.Create(
                                    Descriptors.WPF0102EventDeclarationName,
                                    eventDeclaration.Identifier.GetLocation(),
                                    ImmutableDictionary <string, string> .Empty.Add("ExpectedName", registeredName),
                                    registeredName));
                        }

                        if (registration.TryGetArgumentAtIndex(2, out var handlerTypeArg) &&
                            handlerTypeArg.TryGetTypeofValue(context.SemanticModel, context.CancellationToken, out var registeredHandlerType) &&
                            !registeredHandlerType.Equals(eventSymbol.Type))
                        {
                            context.ReportDiagnostic(
                                Diagnostic.Create(
                                    Descriptors.WPF0106EventDeclarationUseRegisteredHandlerType,
                                    eventDeclaration.Type.GetLocation(),
                                    registeredHandlerType.MetadataName));
                        }
                    }
                }
            }
        }