private string GetAnonymousName(NamedDecl namedDecl, string kind)
        {
            namedDecl.Location.GetFileLocation(out var file, out var line, out var column, out _);
            var fileName = Path.GetFileNameWithoutExtension(file.Name.ToString());

            return($"__Anonymous{kind}_{fileName}_L{line}_C{column}");
        }
        private string GetCursorName(NamedDecl namedDecl)
        {
            var name = namedDecl.Name;

            if (string.IsNullOrWhiteSpace(name))
            {
                if (namedDecl is TypeDecl typeDecl)
                {
                    if ((typeDecl is TagDecl tagDecl) && tagDecl.Handle.IsAnonymous)
                    {
                        name = GetAnonymousName(tagDecl, tagDecl.TypeForDecl.KindSpelling);

                        if (!_config.RemappedNames.ContainsKey(name))
                        {
                            AddDiagnostic(DiagnosticLevel.Info, $"Anonymous declaration found in '{nameof(GetCursorName)}'. Falling back to '{name}'.", namedDecl);
                        }
                    }
                    else
                    {
                        name = GetTypeName(namedDecl, typeDecl.TypeForDecl, out var nativeTypeName);
                        Debug.Assert(string.IsNullOrWhiteSpace(nativeTypeName));
                    }
                }
                else if (namedDecl is ParmVarDecl)
                {
                    name = "param";
                }
                else
                {
                    AddDiagnostic(DiagnosticLevel.Error, $"Unsupported anonymous named declaration: '{namedDecl.Kind}'.", namedDecl);
                }
            }
        private string GetAccessSpecifierName(NamedDecl namedDecl)
        {
            string name;

            switch (namedDecl.Access)
            {
            case CX_CXXAccessSpecifier.CX_CXXInvalidAccessSpecifier:
            {
                // Top level declarations will have an invalid access specifier
                name = "public";
                break;
            }

            case CX_CXXAccessSpecifier.CX_CXXPublic:
            {
                name = "public";
                break;
            }

            case CX_CXXAccessSpecifier.CX_CXXProtected:
            {
                name = "protected";
                break;
            }

            case CX_CXXAccessSpecifier.CX_CXXPrivate:
            {
                name = "private";
                break;
            }

            default:
            {
                name = "internal";
                AddDiagnostic(DiagnosticLevel.Warning, $"Unknown access specifier: '{namedDecl.Access}'. Falling back to '{name}'.", namedDecl);
                break;
            }
            }

            return(name);
        }