brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 63b2ba8 Raw
85 lines · c
1//===- ClangTestUtils.h -----------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H10#define LLDB_UNITTESTS_TESTINGSUPPORT_SYMBOL_CLANGTESTUTILS_H11 12#include "Plugins/ExpressionParser/Clang/ClangUtil.h"13#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"14#include "lldb/Host/HostInfo.h"15 16namespace lldb_private {17namespace clang_utils {18inline clang::DeclarationName getDeclarationName(TypeSystemClang &ast,19                                                 llvm::StringRef name) {20  clang::IdentifierInfo &II = ast.getASTContext().Idents.get(name);21  return ast.getASTContext().DeclarationNames.getIdentifier(&II);22}23 24inline CompilerType25createRecord(TypeSystemClang &ast, llvm::StringRef name,26             lldb::LanguageType lang = lldb::LanguageType::eLanguageTypeC) {27  return ast.CreateRecordType(ast.getASTContext().getTranslationUnitDecl(),28                              OptionalClangModuleID(),29                              lldb::AccessType::eAccessPublic, name, 0, lang);30}31 32/// Create a record with the given name and a field with the given type33/// and name.34inline CompilerType createRecordWithField(35    TypeSystemClang &ast, llvm::StringRef record_name, CompilerType field_type,36    llvm::StringRef field_name,37    lldb::LanguageType lang = lldb::LanguageType::eLanguageTypeC) {38  CompilerType t = createRecord(ast, record_name, lang);39 40  TypeSystemClang::StartTagDeclarationDefinition(t);41  ast.AddFieldToRecordType(t, field_name, field_type,42                           lldb::AccessType::eAccessPublic, 7);43  TypeSystemClang::CompleteTagDeclarationDefinition(t);44 45  return t;46}47 48/// Simulates a Clang type system owned by a TypeSystemMap.49class TypeSystemClangHolder {50  std::shared_ptr<TypeSystemClang> m_ast;51public:52  TypeSystemClangHolder(const char *name)53      : m_ast(std::make_shared<TypeSystemClang>(name,54                                                HostInfo::GetTargetTriple())) {}55  TypeSystemClang *GetAST() const { return m_ast.get(); }56};57  58/// Constructs a TypeSystemClang that contains a single RecordDecl that contains59/// a single FieldDecl. Utility class as this setup is a common starting point60/// for unit test that exercise the ASTImporter.61struct SourceASTWithRecord {62  std::unique_ptr<TypeSystemClangHolder> holder;63  TypeSystemClang *ast;64  CompilerType record_type;65  clang::RecordDecl *record_decl = nullptr;66  clang::FieldDecl *field_decl = nullptr;67  SourceASTWithRecord(68      lldb::LanguageType lang = lldb::LanguageType::eLanguageTypeC) {69    holder = std::make_unique<TypeSystemClangHolder>("test ASTContext");70    ast = holder->GetAST();71    record_type = createRecordWithField(72        *ast, "Source", ast->GetBasicType(lldb::BasicType::eBasicTypeChar),73        "a_field", lang);74    record_decl =75        llvm::cast<clang::RecordDecl>(ClangUtil::GetAsTagDecl(record_type));76    field_decl = *record_decl->fields().begin();77    assert(field_decl);78  }79};80 81} // namespace clang_utils82} // namespace lldb_private83 84#endif85