From 00e3f82489a6ef93394275ae61079d08f44347ea Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 25 Oct 2016 00:29:25 +0100 Subject: Add basic support for base classes for routes --- icespider/common/routes.ice | 10 +++++++ icespider/compile/routeCompiler.cpp | 57 ++++++++++++++++++++++++++++++++++++- icespider/compile/routeCompiler.h | 2 ++ icespider/unittests/testRoutes.json | 7 +++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/icespider/common/routes.ice b/icespider/common/routes.ice index 37939c1..db6475d 100644 --- a/icespider/common/routes.ice +++ b/icespider/common/routes.ice @@ -45,14 +45,24 @@ module IceSpider { Operations operations; string type; OutputSerializers outputSerializers; + StringSeq bases; }; ["slicer:json:object"] dictionary Routes; + class RouteBase { + StringSeq proxies; + StringSeq functions; + }; + + ["slicer:json:object"] + dictionary RouteBases; + class RouteConfiguration { string name; Routes routes; + RouteBases routeBases; StringSeq slices; StringSeq headers; }; diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index 0d9be5f..30f7900 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -297,11 +297,57 @@ namespace IceSpider { } } + processBases(output, outputh, c, units); processRoutes(output, c, units); fprintf(output, "\n// End generated code.\n"); } + void + RouteCompiler::processBases(FILE * output, FILE * outputh, RouteConfigurationPtr c, const Units & u) const + { + fprintf(outputh, "\n"); + fprintbf(outputh, "namespace %s {\n", c->name); + fprintbf(1, outputh, "// Base classes.\n\n"); + fprintf(output, "\n"); + fprintbf(output, "namespace %s {\n", c->name); + fprintbf(1, output, "// Base classes.\n\n"); + for (const auto & r : c->routeBases) { + processBase(output, outputh, r, u); + } + fprintbf(output, "} // namespace %s\n\n", c->name); + fprintbf(outputh, "} // namespace %s\n\n", c->name); + } + + void + RouteCompiler::processBase(FILE * output, FILE * outputh, const RouteBases::value_type & b, const Units &) const + { + fprintbf(1, outputh, "class %s {\n", b.first); + fprintbf(2, outputh, "protected:\n"); + fprintbf(3, outputh, "%s(const IceSpider::Core * core);\n\n", b.first); + for (const auto & f: b.second->functions) { + fprintbf(3, outputh, "%s;\n", f); + } + fprintbf(1, output, "%s::%s(const IceSpider::Core * core)", b.first, b.first); + if (!b.second->proxies.empty()) { + fprintf(output, " :"); + } + fprintf(output, "\n"); + unsigned int pn = 0; + for (const auto & p : b.second->proxies) { + fprintbf(3, outputh, "const %sPrx prx%u;\n", + boost::algorithm::replace_all_copy(p, ".", "::"), pn); + fprintbf(3, output, "prx%u(core->getProxy<%s>())", + pn, boost::algorithm::replace_all_copy(p, ".", "::")); + if (++pn < b.second->proxies.size()) { + fprintf(output, ","); + } + fprintf(output, "\n"); + } + fprintbf(1, outputh, "}; // %s\n", b.first); + fprintbf(1, output, "{ }\n"); + } + void RouteCompiler::processRoutes(FILE * output, RouteConfigurationPtr c, const Units & u) const { @@ -325,10 +371,19 @@ namespace IceSpider { fprintbf(1, output, "// Route name: %s\n", r.first); fprintbf(1, output, "// path: %s\n", r.second->path); - fprintbf(1, output, "class %s : public IceSpider::IRouteHandler {\n", r.first); + fprintbf(1, output, "class %s : public IceSpider::IRouteHandler", r.first); + for (const auto & b : r.second->bases) { + fprintf(output, ",\n"); + fprintbf(3, output, "public %s", b); + } + fprintf(output, " {\n"); fprintbf(2, output, "public:\n"); fprintbf(3, output, "%s(const IceSpider::Core * core) :\n", r.first); fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r.second->path); + for (const auto & b : r.second->bases) { + fprintf(output, ",\n"); + fprintbf(4, output, "%s(core)", b); + } auto proxies = initializeProxies(output, r.second); for (const auto & p : r.second->params) { if (p.second->hasUserSource) { diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h index 0b5256a..9a2eb8f 100644 --- a/icespider/compile/routeCompiler.h +++ b/icespider/compile/routeCompiler.h @@ -28,6 +28,8 @@ namespace IceSpider { typedef std::map Proxies; void processConfiguration(FILE * output, FILE * outputh, const std::string & name, RouteConfigurationPtr, const Units &) const; + void processBases(FILE * output, FILE * outputh, RouteConfigurationPtr, const Units &) const; + void processBase(FILE * output, FILE * outputh, const RouteBases::value_type &, const Units &) const; void processRoutes(FILE * output, RouteConfigurationPtr, const Units &) const; void processRoute(FILE * output, const Routes::value_type &, const Units &) const; void registerOutputSerializers(FILE * output, RoutePtr) const; diff --git a/icespider/unittests/testRoutes.json b/icespider/unittests/testRoutes.json index 3bc6fda..bc1b94f 100644 --- a/icespider/unittests/testRoutes.json +++ b/icespider/unittests/testRoutes.json @@ -1,6 +1,12 @@ { "name": "common", "headers": [ "xsltStreamSerializer.h" ], + "routeBases": { + "base1": { + "proxies": ["TestIceSpider.TestApi"], + "functions": [ "void doNothing()" ] + } + }, "routes": { "index": { "path": "/", @@ -11,6 +17,7 @@ "params": [ "\"xslt/transform.xslt\"" ] } }, + "bases": [ "base1" ], "operation": "TestIceSpider.TestApi.index" }, "item": { -- cgit v1.2.3