diff options
author | Sean Callanan <scallanan@apple.com> | 2017-07-25 19:54:22 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2017-07-25 19:54:22 +0000 |
commit | 0f53b50dc88bbfb4e5dd2267763a8dc430e0be63 (patch) | |
tree | 0bfbeab2c1561ae695ce0f87536c13954934201d /tools/clang-import-test | |
parent | 315b9a701bc784ceae5e9807206454edef69ad96 (diff) | |
download | clang-0f53b50dc88bbfb4e5dd2267763a8dc430e0be63.tar.gz |
[ExternalASTMerger] Import Objective-C classes
This patch adds functionality and a test for importing Objective-C classes
and their methods.
It also adds a flag to clang-import-test to set the language used for
parsing. This takes the same argument format as the -x option to the
driver.
Differential Revision: https://reviews.llvm.org/D35274
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@309014 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/clang-import-test')
-rw-r--r-- | tools/clang-import-test/clang-import-test.cpp | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/tools/clang-import-test/clang-import-test.cpp b/tools/clang-import-test/clang-import-test.cpp index 6b724e9cf5..286cb05219 100644 --- a/tools/clang-import-test/clang-import-test.cpp +++ b/tools/clang-import-test/clang-import-test.cpp @@ -17,6 +17,7 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "clang/CodeGen/ModuleBuilder.h" +#include "clang/Driver/Types.h" #include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/MultiplexConsumer.h" @@ -53,6 +54,11 @@ static llvm::cl::list<std::string> llvm::cl::desc("Argument to pass to the CompilerInvocation"), llvm::cl::CommaSeparated); +static llvm::cl::opt<std::string> + Input("x", llvm::cl::Optional, + llvm::cl::desc("The language to parse (default: c++)"), + llvm::cl::init("c++")); + static llvm::cl::opt<bool> DumpAST("dump-ast", llvm::cl::init(false), llvm::cl::desc("Dump combined AST")); @@ -110,6 +116,7 @@ private: llvm::errs() << LineString << '\n'; llvm::errs().indent(LocColumn); llvm::errs() << '^'; + llvm::errs() << '\n'; } virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, @@ -143,7 +150,7 @@ private: }; std::unique_ptr<CompilerInstance> -BuildCompilerInstance(ArrayRef<const char *> ClangArgv) { +BuildCompilerInstance() { auto Ins = llvm::make_unique<CompilerInstance>(); auto DC = llvm::make_unique<TestDiagnosticConsumer>(); const bool ShouldOwnClient = true; @@ -151,13 +158,27 @@ BuildCompilerInstance(ArrayRef<const char *> ClangArgv) { auto Inv = llvm::make_unique<CompilerInvocation>(); + std::vector<const char *> ClangArgv(ClangArgs.size()); + std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), + [](const std::string &s) -> const char * { return s.data(); }); CompilerInvocation::CreateFromArgs(*Inv, ClangArgv.data(), &ClangArgv.data()[ClangArgv.size()], Ins->getDiagnostics()); - Inv->getLangOpts()->CPlusPlus = true; - Inv->getLangOpts()->CPlusPlus11 = true; - Inv->getHeaderSearchOpts().UseLibcxx = true; + { + using namespace driver::types; + ID Id = lookupTypeForTypeSpecifier(Input.c_str()); + assert(Id != TY_INVALID); + if (isCXX(Id)) { + Inv->getLangOpts()->CPlusPlus = true; + Inv->getLangOpts()->CPlusPlus11 = true; + Inv->getHeaderSearchOpts().UseLibcxx = true; + } + if (isObjC(Id)) { + Inv->getLangOpts()->ObjC1 = 1; + Inv->getLangOpts()->ObjC2 = 1; + } + } Inv->getLangOpts()->Bool = true; Inv->getLangOpts()->WChar = true; Inv->getLangOpts()->Blocks = true; @@ -216,11 +237,8 @@ void AddExternalSource( } std::unique_ptr<CompilerInstance> BuildIndirect(std::unique_ptr<CompilerInstance> &CI) { - std::vector<const char *> ClangArgv(ClangArgs.size()); - std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), - [](const std::string &s) -> const char * { return s.data(); }); std::unique_ptr<CompilerInstance> IndirectCI = - init_convenience::BuildCompilerInstance(ClangArgv); + init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique<SelectorTable>(); auto BC = llvm::make_unique<Builtin::Context>(); std::unique_ptr<ASTContext> AST = @@ -247,11 +265,8 @@ llvm::Expected<std::unique_ptr<CompilerInstance>> Parse(const std::string &Path, llvm::ArrayRef<std::unique_ptr<CompilerInstance>> Imports, bool ShouldDumpAST) { - std::vector<const char *> ClangArgv(ClangArgs.size()); - std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), - [](const std::string &s) -> const char * { return s.data(); }); std::unique_ptr<CompilerInstance> CI = - init_convenience::BuildCompilerInstance(ClangArgv); + init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique<SelectorTable>(); auto BC = llvm::make_unique<Builtin::Context>(); std::unique_ptr<ASTContext> AST = |