private static void ProcessCSharpDeclaration(
            [NotNull] IDeclaration declaration,
            [NotNull] CodeStructureElement parentElement,
            [NotNull] CSharpCodeStructureProcessingState state
            )
        {
            switch (declaration)
            {
            case IClassLikeDeclaration classLikeDeclaration: {
                var codeStructureClass = new T4CSharpCodeStructureDeclaredElement(parentElement, declaration, state);
                if (classLikeDeclaration.Body != null)
                {
                    ProcessCSharpChildren(classLikeDeclaration.Body, codeStructureClass, state);
                }
                return;
            }

            case ICSharpNamespaceDeclaration namespaceDeclaration: {
                var structureNamespace = new T4CSharpCodeStructureNamespace(parentElement, declaration, state);
                if (namespaceDeclaration.Body != null)
                {
                    ProcessCSharpChildren(namespaceDeclaration.Body, structureNamespace, state);
                }
                return;
            }

            case IAccessorDeclaration _:
                return;

            case IEnumDeclaration enumDeclaration: {
                var codeStructureElement = new T4CSharpCodeStructureDeclaredElement(parentElement, declaration, state)
                {
                    InitiallyExpanded = false
                };
                ProcessCSharpChildren(enumDeclaration.EnumBody, codeStructureElement, state);
                return;
            }

            default: {
                var codeStructureElement2 = new T4CSharpCodeStructureDeclaredElement(parentElement, declaration, state);
                ProcessCSharpChildren(declaration, codeStructureElement2, state);
                break;
            }
            }
        }
        private static void ProcessCSharpDeclaration([NotNull] IDeclaration declaration, [NotNull] CodeStructureElement parentElement,
                                                     [NotNull] CSharpCodeStructureProcessingState state)
        {
            var classLikeDeclaration = declaration as IClassLikeDeclaration;

            if (classLikeDeclaration != null)
            {
                var codeStructureClass = new T4CSharpCodeStructureDeclaredElement(parentElement, declaration, state);
                if (classLikeDeclaration.Body != null)
                {
                    ProcessCSharpChildren(classLikeDeclaration.Body, codeStructureClass, state);
                }
                return;
            }

            var namespaceDeclaration = declaration as ICSharpNamespaceDeclaration;

            if (namespaceDeclaration != null)
            {
                var structureNamespace = new T4CSharpCodeStructureNamespace(parentElement, declaration, state);
                if (namespaceDeclaration.Body != null)
                {
                    ProcessCSharpChildren(namespaceDeclaration.Body, structureNamespace, state);
                }
                return;
            }

            if (declaration is IAccessorDeclaration)
            {
                return;
            }

            var codeStructureElement = new T4CSharpCodeStructureDeclaredElement(parentElement, declaration, state);
            var enumDeclaration      = declaration as IEnumDeclaration;

            if (enumDeclaration != null)
            {
                codeStructureElement.InitiallyExpanded = false;
                ProcessCSharpChildren(enumDeclaration.EnumBody, codeStructureElement, state);
                return;
            }

            ProcessCSharpChildren(declaration, codeStructureElement, state);
        }