private void FindMissingVisibilityModifiers(SyntaxNodeAnalysisContext context)
        {
            if (IsInterfaceMember(context.Node) || IsExplicitInterfaceMember(context.Node) || IsStaticConstructor(context.Node))
            {
                return;
            }

            SyntaxNode          root      = context.Node.Ancestors().Last();
            IDeclarationHandler handler   = DeclarationHandlers.HandlerLookup[context.Node.Kind()];
            SyntaxTokenList     modifiers = handler.GetModifiers(context.Node);

            if (!modifiers.Any(m => IsVisibilityModifier(m)))
            {
                context.ReportDiagnostic(Diagnostic.Create(_rule, context.Node.ChildTokens().First().GetLocation()));
            }
        }
        private static SyntaxNode WithMissingModifierAdded(SyntaxNode node)
        {
            bool                isClassMember  = node.Ancestors().Any(n => n.IsKind(SyntaxKind.ClassDeclaration));
            SyntaxToken         missingKeyword = SyntaxFactory.Token(isClassMember ? SyntaxKind.PrivateKeyword : SyntaxKind.InternalKeyword);
            IDeclarationHandler handler        = DeclarationHandlers.HandlerLookup[node.Kind()];
            SyntaxTokenList     oldModifiers   = handler.GetModifiers(node);

            //	We need to remove the leading trivia before attaching new modifier, otherwise the modifier will be added before the trivia.
            SyntaxTriviaList leadingTrivia = node.GetLeadingTrivia();

            node = node.WithLeadingTrivia();

            //	Now add the modifier
            SyntaxTokenList newModifiers = oldModifiers.Insert(0, missingKeyword);

            node = handler.WithModifiers(node, newModifiers);

            //	And reattach the trivia
            node = node.WithLeadingTrivia(leadingTrivia);
            return(node);
        }