You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.9 KiB
76 lines
2.9 KiB
//===- 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
|