// DECL: /// some function comment
// DECL: int foo(int input);
-// DECL: template<typename ConcreteOp>
-// DECL: int detail::TestOpInterfaceInterfaceTraits::Model<ConcreteOp>::foo
-
// DECL-LABEL: struct TestOpInterfaceVerifyTrait
// DECL: verifyTrait
// DECL-LABEL: struct TestOpInterfaceVerifyRegionTrait
// DECL: verifyRegionTrait
+// Method implementations come last, after all class definitions.
+// DECL: template<typename ConcreteOp>
+// DECL: int detail::TestOpInterfaceInterfaceTraits::Model<ConcreteOp>::foo
+
// OP_DECL-LABEL: class DeclareMethodsOp : public
// OP_DECL: int foo(int input);
// OP_DECL-NOT: int default_foo(int input);
}
void InterfaceGenerator::emitModelMethodsDef(const Interface &interface) {
+ llvm::SmallVector<StringRef, 2> namespaces;
+ llvm::SplitString(interface.getCppNamespace(), namespaces, "::");
+ for (StringRef ns : namespaces)
+ os << "namespace " << ns << " {\n";
+
for (auto &method : interface.getMethods()) {
os << "template<typename " << valueTemplate << ">\n";
emitCPPType(method.getReturnType(), os);
method.isStatic() ? &ctx : &nonStaticMethodFmt);
os << "\n}\n";
}
+
+ for (StringRef ns : llvm::reverse(namespaces))
+ os << "} // namespace " << ns << "\n";
}
void InterfaceGenerator::emitTraitDecl(const Interface &interface,
emitTraitDecl(interface, interfaceName, interfaceTraitsName);
os << "}// namespace detail\n";
- emitModelMethodsDef(interface);
-
for (StringRef ns : llvm::reverse(namespaces))
os << "} // namespace " << ns << "\n";
}
bool InterfaceGenerator::emitInterfaceDecls() {
llvm::emitSourceFileHeader("Interface Declarations", os);
- for (const auto *def : defs)
+ for (const llvm::Record *def : defs)
emitInterfaceDecl(Interface(def));
+ for (const llvm::Record *def : defs)
+ emitModelMethodsDef(Interface(def));
return false;
}