Author: spyffe Date: Tue Jul 25 12:54:22 2017 New Revision: 309014 URL: http://llvm.org/viewvc/llvm-project?rev=309014&view=rev Log: [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 Added: cfe/trunk/test/Import/objc-method/ - copied from r308993, cfe/trunk/test/Import/member-in-struct/ cfe/trunk/test/Import/objc-method/Inputs/S.m - copied, changed from r308993, cfe/trunk/test/Import/member-in-struct/Inputs/S.c cfe/trunk/test/Import/objc-method/test.m - copied, changed from r308993, cfe/trunk/test/Import/member-in-struct/test.c Removed: cfe/trunk/test/Import/objc-method/Inputs/S.c cfe/trunk/test/Import/objc-method/test.c Modified: cfe/trunk/lib/AST/ExternalASTMerger.cpp cfe/trunk/tools/clang-import-test/clang-import-test.cpp Modified: cfe/trunk/lib/AST/ExternalASTMerger.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExternalASTMerger.cpp?rev=309014&r1=309013&r2=309014&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExternalASTMerger.cpp (original) +++ cfe/trunk/lib/AST/ExternalASTMerger.cpp Tue Jul 25 12:54:22 2017 @@ -44,6 +44,9 @@ public: ToTag->setMustBuildLookupTable(); } else if (auto ToNamespace = dyn_cast<NamespaceDecl>(To)) { ToNamespace->setHasExternalVisibleStorage(); + } else if (auto ToContainer = dyn_cast<ObjCContainerDecl>(To)) { + ToContainer->setHasExternalLexicalStorage(); + ToContainer->setMustBuildLookupTable(); } return ASTImporter::Imported(From, To); } @@ -80,11 +83,12 @@ LookupSameContext(Source<TranslationUnit } bool IsForwardDeclaration(Decl *D) { - assert(!isa<ObjCInterfaceDecl>(D)); // TODO handle this case if (auto TD = dyn_cast<TagDecl>(D)) { return !TD->isThisDeclarationADefinition(); } else if (auto FD = dyn_cast<FunctionDecl>(D)) { return !FD->isThisDeclarationADefinition(); + } else if (auto OID = dyn_cast<ObjCInterfaceDecl>(D)) { + return OID->isThisDeclarationADefinition(); } else { return false; } Removed: cfe/trunk/test/Import/objc-method/Inputs/S.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/member-in-struct/Inputs/S.c?rev=308993&view=auto ============================================================================== --- cfe/trunk/test/Import/objc-method/Inputs/S.c (original) +++ cfe/trunk/test/Import/objc-method/Inputs/S.c (removed) @@ -1,3 +0,0 @@ -struct S { - int a; -}; Copied: cfe/trunk/test/Import/objc-method/Inputs/S.m (from r308993, cfe/trunk/test/Import/member-in-struct/Inputs/S.c) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/objc-method/Inputs/S.m?p2=cfe/trunk/test/Import/objc-method/Inputs/S.m&p1=cfe/trunk/test/Import/member-in-struct/Inputs/S.c&r1=308993&r2=309014&rev=309014&view=diff ============================================================================== --- cfe/trunk/test/Import/member-in-struct/Inputs/S.c (original) +++ cfe/trunk/test/Import/objc-method/Inputs/S.m Tue Jul 25 12:54:22 2017 @@ -1,3 +1,4 @@ -struct S { - int a; -}; +@interface C { +} +-(int)m; +@end Removed: cfe/trunk/test/Import/objc-method/test.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/member-in-struct/test.c?rev=308993&view=auto ============================================================================== --- cfe/trunk/test/Import/objc-method/test.c (original) +++ cfe/trunk/test/Import/objc-method/test.c (removed) @@ -1,5 +0,0 @@ -// RUN: clang-import-test -import %S/Inputs/S.c -expression %s -void expr() { - struct S MyS; - MyS.a = 3; -} Copied: cfe/trunk/test/Import/objc-method/test.m (from r308993, cfe/trunk/test/Import/member-in-struct/test.c) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/objc-method/test.m?p2=cfe/trunk/test/Import/objc-method/test.m&p1=cfe/trunk/test/Import/member-in-struct/test.c&r1=308993&r2=309014&rev=309014&view=diff ============================================================================== --- cfe/trunk/test/Import/member-in-struct/test.c (original) +++ cfe/trunk/test/Import/objc-method/test.m Tue Jul 25 12:54:22 2017 @@ -1,5 +1,5 @@ -// RUN: clang-import-test -import %S/Inputs/S.c -expression %s +// RUN: clang-import-test -x objective-c++ -import %S/Inputs/S.m -expression %s void expr() { - struct S MyS; - MyS.a = 3; + C *c; + int i = [c m]; } Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=309014&r1=309013&r2=309014&view=diff ============================================================================== --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original) +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jul 25 12:54:22 2017 @@ -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 cha 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<CompilerI 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 = _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits