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"
2223#include " llvm/TableGen/Error.h"
2324#include " llvm/TableGen/Record.h"
2425#include " llvm/TableGen/TableGenBackend.h"
@@ -342,11 +343,7 @@ void InterfaceGenerator::emitModelDecl(const Interface &interface) {
342343}
343344
344345void InterfaceGenerator::emitModelMethodsDef (const Interface &interface) {
345- llvm::SmallVector<StringRef, 2 > namespaces;
346- llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
347- for (StringRef ns : namespaces)
348- os << " namespace " << ns << " {\n " ;
349-
346+ llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
350347 for (auto &method : interface.getMethods ()) {
351348 os << " template<typename " << valueTemplate << " >\n " ;
352349 emitCPPType (method.getReturnType (), os);
@@ -442,18 +439,11 @@ void InterfaceGenerator::emitModelMethodsDef(const Interface &interface) {
442439 method.isStatic () ? &ctx : &nonStaticMethodFmt);
443440 os << " \n }\n " ;
444441 }
445-
446- for (StringRef ns : llvm::reverse (namespaces))
447- os << " } // namespace " << ns << " \n " ;
448442}
449443
450444void InterfaceGenerator::emitInterfaceTraitDecl (const Interface &interface) {
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 " ;
445+ auto cppNamespace = (interface.getCppNamespace () + " ::detail" ).str ();
446+ llvm::NamespaceEmitter ns (os, cppNamespace);
457447
458448 StringRef interfaceName = interface.getName ();
459449 auto interfaceTraitsName = (interfaceName + " InterfaceTraits" ).str ();
@@ -504,10 +494,6 @@ void InterfaceGenerator::emitInterfaceTraitDecl(const Interface &interface) {
504494 os << tblgen::tgfmt (*extraTraitDecls, &traitMethodFmt) << " \n " ;
505495
506496 os << " };\n " ;
507- os << " }// namespace detail\n " ;
508-
509- for (StringRef ns : llvm::reverse (namespaces))
510- os << " } // namespace " << ns << " \n " ;
511497}
512498
513499static void emitInterfaceDeclMethods (const Interface &interface,
@@ -533,10 +519,7 @@ static void emitInterfaceDeclMethods(const Interface &interface,
533519}
534520
535521void InterfaceGenerator::forwardDeclareInterface (const Interface &interface) {
536- llvm::SmallVector<StringRef, 2 > namespaces;
537- llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
538- for (StringRef ns : namespaces)
539- os << " namespace " << ns << " {\n " ;
522+ llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
540523
541524 // Emit a forward declaration of the interface class so that it becomes usable
542525 // in the signature of its methods.
@@ -545,16 +528,10 @@ void InterfaceGenerator::forwardDeclareInterface(const Interface &interface) {
545528
546529 StringRef interfaceName = interface.getName ();
547530 os << " class " << interfaceName << " ;\n " ;
548-
549- for (StringRef ns : llvm::reverse (namespaces))
550- os << " } // namespace " << ns << " \n " ;
551531}
552532
553533void InterfaceGenerator::emitInterfaceDecl (const Interface &interface) {
554- llvm::SmallVector<StringRef, 2 > namespaces;
555- llvm::SplitString (interface.getCppNamespace (), namespaces, " ::" );
556- for (StringRef ns : namespaces)
557- os << " namespace " << ns << " {\n " ;
534+ llvm::NamespaceEmitter ns (os, interface.getCppNamespace ());
558535
559536 StringRef interfaceName = interface.getName ();
560537 auto interfaceTraitsName = (interfaceName + " InterfaceTraits" ).str ();
@@ -631,9 +608,6 @@ void InterfaceGenerator::emitInterfaceDecl(const Interface &interface) {
631608 }
632609
633610 os << " };\n " ;
634-
635- for (StringRef ns : llvm::reverse (namespaces))
636- os << " } // namespace " << ns << " \n " ;
637611}
638612
639613bool InterfaceGenerator::emitInterfaceDecls () {
0 commit comments