//===-- A class to index libc API listed in tablegen files ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H
#define LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H

#include "llvm/ADT/StringRef.h"
#include "llvm/TableGen/Record.h"

#include <string>
#include <unordered_map>
#include <unordered_set>

namespace llvm_libc {

class APIIndexer {
private:
  llvm::Optional<llvm::StringRef> StdHeader;

  // TableGen classes in spec.td.
  llvm::Record *NamedTypeClass;
  llvm::Record *PtrTypeClass;
  llvm::Record *RestrictedPtrTypeClass;
  llvm::Record *ConstTypeClass;
  llvm::Record *StructClass;
  llvm::Record *StandardSpecClass;
  llvm::Record *PublicAPIClass;

  bool isaNamedType(llvm::Record *Def);
  bool isaStructType(llvm::Record *Def);
  bool isaPtrType(llvm::Record *Def);
  bool isaConstType(llvm::Record *Def);
  bool isaRestrictedPtrType(llvm::Record *Def);
  bool isaStandardSpec(llvm::Record *Def);
  bool isaPublicAPI(llvm::Record *Def);

  void indexStandardSpecDef(llvm::Record *StandardSpec);
  void indexPublicAPIDef(llvm::Record *PublicAPI);
  void index(llvm::RecordKeeper &Records);

public:
  using NameToRecordMapping = std::unordered_map<std::string, llvm::Record *>;
  using NameSet = std::unordered_set<std::string>;

  // This indexes all headers, not just a specified one.
  explicit APIIndexer(llvm::RecordKeeper &Records) : StdHeader(llvm::None) {
    index(Records);
  }

  APIIndexer(llvm::StringRef Header, llvm::RecordKeeper &Records)
      : StdHeader(Header) {
    index(Records);
  }

  // Mapping from names to records defining them.
  NameToRecordMapping MacroSpecMap;
  NameToRecordMapping TypeSpecMap;
  NameToRecordMapping EnumerationSpecMap;
  NameToRecordMapping FunctionSpecMap;
  NameToRecordMapping MacroDefsMap;
  NameToRecordMapping TypeDeclsMap;

  std::unordered_map<std::string, std::string> FunctionToHeaderMap;

  NameSet Structs;
  NameSet Enumerations;
  NameSet Functions;
  NameSet PublicHeaders;

  std::string getTypeAsString(llvm::Record *TypeRecord);
};

} // namespace llvm_libc

#endif // LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H
