1919#include " llvm/ADT/StringExtras.h"
2020#include " llvm/Support/FormatVariadic.h"
2121#include " llvm/Support/raw_ostream.h"
22- #include " llvm/TableGen/CodeGenHelpers.h"
2322#include " llvm/TableGen/Error.h"
2423#include " llvm/TableGen/Record.h"
2524#include " llvm/TableGen/TableGenBackend.h"
@@ -343,7 +342,11 @@ void InterfaceGenerator::emitModelDecl(const Interface &interface) {
343342}
344343
345344void InterfaceGenerator::emitModelMethodsDef (const Interface &interface) {
346- llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
345+ llvm::SmallVector<StringRef, 2 > namespaces;
346+ llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
347+ for (StringRef ns : namespaces)
348+ os << " namespace " << ns << " {\n " ;
349+
347350 for (auto &method : interface.getMethods ()) {
348351 os << " template<typename " << valueTemplate << " >\n " ;
349352 emitCPPType (method.getReturnType (), os);
@@ -439,11 +442,18 @@ void InterfaceGenerator::emitModelMethodsDef(const Interface &interface) {
439442 method.isStatic () ? &ctx : &nonStaticMethodFmt);
440443 os << " \n }\n " ;
441444 }
445+
446+ for (StringRef ns : llvm::reverse (namespaces))
447+ os << " } // namespace " << ns << " \n " ;
442448}
443449
444450void InterfaceGenerator::emitInterfaceTraitDecl (const Interface &interface) {
445- auto cppNamespace = (interface.getCppNamespace () + " ::detail" ).str ();
446- llvm::NamespaceEmitter ns (os, cppNamespace);
451+ llvm::SmallVector<StringRef, 2 > namespaces;
452+ llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
453+ for (StringRef ns : namespaces)
454+ os << " namespace " << ns << " {\n " ;
455+
456+ os << " namespace detail {\n " ;
447457
448458 StringRef interfaceName = interface.getName ();
449459 auto interfaceTraitsName = (interfaceName + " InterfaceTraits" ).str ();
@@ -494,6 +504,10 @@ void InterfaceGenerator::emitInterfaceTraitDecl(const Interface &interface) {
494504 os << tblgen::tgfmt (*extraTraitDecls, &traitMethodFmt) << " \n " ;
495505
496506 os << " };\n " ;
507+ os << " }// namespace detail\n " ;
508+
509+ for (StringRef ns : llvm::reverse (namespaces))
510+ os << " } // namespace " << ns << " \n " ;
497511}
498512
499513static void emitInterfaceDeclMethods (const Interface &interface,
@@ -519,7 +533,10 @@ static void emitInterfaceDeclMethods(const Interface &interface,
519533}
520534
521535void InterfaceGenerator::forwardDeclareInterface (const Interface &interface) {
522- llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
536+ llvm::SmallVector<StringRef, 2 > namespaces;
537+ llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
538+ for (StringRef ns : namespaces)
539+ os << " namespace " << ns << " {\n " ;
523540
524541 // Emit a forward declaration of the interface class so that it becomes usable
525542 // in the signature of its methods.
@@ -528,10 +545,16 @@ void InterfaceGenerator::forwardDeclareInterface(const Interface &interface) {
528545
529546 StringRef interfaceName = interface.getName ();
530547 os << " class " << interfaceName << " ;\n " ;
548+
549+ for (StringRef ns : llvm::reverse (namespaces))
550+ os << " } // namespace " << ns << " \n " ;
531551}
532552
533553void InterfaceGenerator::emitInterfaceDecl (const Interface &interface) {
534- llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
554+ llvm::SmallVector<StringRef, 2 > namespaces;
555+ llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
556+ for (StringRef ns : namespaces)
557+ os << " namespace " << ns << " {\n " ;
535558
536559 StringRef interfaceName = interface.getName ();
537560 auto interfaceTraitsName = (interfaceName + " InterfaceTraits" ).str ();
@@ -608,6 +631,9 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
608631 }
609632
610633 os << " };\n " ;
634+
635+ for (StringRef ns : llvm::reverse (namespaces))
636+ os << " } // namespace " << ns << " \n " ;
611637}
612638
613639bool InterfaceGenerator::emitInterfaceDecls () {
0 commit comments