76 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- 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
 |