//===- ClangTestUtils.h -----------------------------------------*- 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 LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H
#define LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H

#include "Plugins/ExpressionParser/Clang/ClangUtil.h"
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
#include "lldb/Host/HostInfo.h"

namespace lldb_private {
namespace clang_utils {
inline clang::DeclarationName getDeclarationName(TypeSystemClang &ast,
                                                 llvm::StringRef name) {
  clang::IdentifierInfo &II = ast.getASTContext().Idents.get(name);
  return ast.getASTContext().DeclarationNames.getIdentifier(&II);
}

inline std::unique_ptr<TypeSystemClang> createAST() {
  return std::make_unique<TypeSystemClang>("test ASTContext",
                                           HostInfo::GetTargetTriple());
}

inline CompilerType createRecord(TypeSystemClang &ast, llvm::StringRef name) {
  return ast.CreateRecordType(ast.getASTContext().getTranslationUnitDecl(),
                              OptionalClangModuleID(),
                              lldb::AccessType::eAccessPublic, name, 0,
                              lldb::LanguageType::eLanguageTypeC);
}

/// Create a record with the given name and a field with the given type
/// and name.
inline CompilerType createRecordWithField(TypeSystemClang &ast,
                                          llvm::StringRef record_name,
                                          CompilerType field_type,
                                          llvm::StringRef field_name) {
  CompilerType t = createRecord(ast, record_name);

  TypeSystemClang::StartTagDeclarationDefinition(t);
  ast.AddFieldToRecordType(t, field_name, field_type,
                           lldb::AccessType::eAccessPublic, 7);
  TypeSystemClang::CompleteTagDeclarationDefinition(t);

  return t;
}

/// Constructs a TypeSystemClang that contains a single RecordDecl that contains
/// a single FieldDecl. Utility class as this setup is a common starting point
/// for unit test that exercise the ASTImporter.
struct SourceASTWithRecord {
  std::unique_ptr<TypeSystemClang> ast;
  CompilerType record_type;
  clang::RecordDecl *record_decl = nullptr;
  clang::FieldDecl *field_decl = nullptr;
  SourceASTWithRecord() {
    ast = createAST();
    record_type = createRecordWithField(
        *ast, "Source", ast->GetBasicType(lldb::BasicType::eBasicTypeChar),
        "a_field");
    record_decl =
        llvm::cast<clang::RecordDecl>(ClangUtil::GetAsTagDecl(record_type));
    field_decl = *record_decl->fields().begin();
    assert(field_decl);
  }
};

} // namespace clang_utils
} // namespace lldb_private

#endif
