From: Bryan Duxbury Date: Thu, 29 Jul 2010 16:24:41 +0000 (+0000) Subject: THRIFT-133. 'namespace ruby' should error out, or be an alias to 'namespace rb' X-Git-Tag: 0.4.0~38 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=e0ac3abd534151e845fe229881a5ef27baf1b521;p=common%2Fthrift.git THRIFT-133. 'namespace ruby' should error out, or be an alias to 'namespace rb' This patch causes 'namespace ruby' (or any unrecognized generator name) to produce an error. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@980498 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/compiler/cpp/src/generate/t_generator.h b/compiler/cpp/src/generate/t_generator.h index 617015d0..2635bf5d 100644 --- a/compiler/cpp/src/generate/t_generator.h +++ b/compiler/cpp/src/generate/t_generator.h @@ -26,6 +26,7 @@ #include #include "parse/t_program.h" #include "globals.h" +#include "t_generator_registry.h" /** * Base class for a thrift code generator. This class defines the basic @@ -272,83 +273,4 @@ class t_generator { int tmp_; }; - -/** - * A factory for producing generator classes of a particular language. - * - * This class is also responsible for: - * - Registering itself with the generator registry. - * - Providing documentation for the generators it produces. - */ -class t_generator_factory { - public: - t_generator_factory(const std::string& short_name, - const std::string& long_name, - const std::string& documentation); - - virtual ~t_generator_factory() {} - - virtual t_generator* get_generator( - // The program to generate. - t_program* program, - // Note: parsed_options will not exist beyond the call to get_generator. - const std::map& parsed_options, - // Note: option_string might not exist beyond the call to get_generator. - const std::string& option_string) - = 0; - - std::string get_short_name() { return short_name_; } - std::string get_long_name() { return long_name_; } - std::string get_documentation() { return documentation_; } - - private: - std::string short_name_; - std::string long_name_; - std::string documentation_; -}; - -template -class t_generator_factory_impl : public t_generator_factory { - public: - t_generator_factory_impl(const std::string& short_name, - const std::string& long_name, - const std::string& documentation) - : t_generator_factory(short_name, long_name, documentation) - {} - - virtual t_generator* get_generator( - t_program* program, - const std::map& parsed_options, - const std::string& option_string) { - return new generator(program, parsed_options, option_string); - } -}; - -class t_generator_registry { - public: - static void register_generator(t_generator_factory* factory); - - static t_generator* get_generator(t_program* program, - const std::string& options); - - typedef std::map gen_map_t; - static gen_map_t& get_generator_map(); - - private: - t_generator_registry(); - t_generator_registry(const t_generator_registry&); -}; - -#define THRIFT_REGISTER_GENERATOR(language, long_name, doc) \ - class t_##language##_generator_factory_impl \ - : public t_generator_factory_impl \ - { \ - public: \ - t_##language##_generator_factory_impl() \ - : t_generator_factory_impl( \ - #language, long_name, doc) \ - {} \ - }; \ - static t_##language##_generator_factory_impl _registerer; - #endif diff --git a/compiler/cpp/src/generate/t_generator_registry.h b/compiler/cpp/src/generate/t_generator_registry.h new file mode 100644 index 00000000..101c22af --- /dev/null +++ b/compiler/cpp/src/generate/t_generator_registry.h @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef T_GENERATOR_REGISTRY_H +#define T_GENERATOR_REGISTRY_H + +class t_generator; + +/** + * A factory for producing generator classes of a particular language. + * + * This class is also responsible for: + * - Registering itself with the generator registry. + * - Providing documentation for the generators it produces. + */ +class t_generator_factory { + public: + t_generator_factory(const std::string& short_name, + const std::string& long_name, + const std::string& documentation); + + virtual ~t_generator_factory() {} + + virtual t_generator* get_generator( + // The program to generate. + t_program* program, + // Note: parsed_options will not exist beyond the call to get_generator. + const std::map& parsed_options, + // Note: option_string might not exist beyond the call to get_generator. + const std::string& option_string) + = 0; + + std::string get_short_name() { return short_name_; } + std::string get_long_name() { return long_name_; } + std::string get_documentation() { return documentation_; } + + private: + std::string short_name_; + std::string long_name_; + std::string documentation_; +}; + +template +class t_generator_factory_impl : public t_generator_factory { + public: + t_generator_factory_impl(const std::string& short_name, + const std::string& long_name, + const std::string& documentation) + : t_generator_factory(short_name, long_name, documentation) + {} + + virtual t_generator* get_generator( + t_program* program, + const std::map& parsed_options, + const std::string& option_string) { + return new generator(program, parsed_options, option_string); + } +}; + +class t_generator_registry { + public: + static void register_generator(t_generator_factory* factory); + + static t_generator* get_generator(t_program* program, + const std::string& options); + + typedef std::map gen_map_t; + static gen_map_t& get_generator_map(); + + private: + t_generator_registry(); + t_generator_registry(const t_generator_registry&); +}; + +#define THRIFT_REGISTER_GENERATOR(language, long_name, doc) \ + class t_##language##_generator_factory_impl \ + : public t_generator_factory_impl \ + { \ + public: \ + t_##language##_generator_factory_impl() \ + : t_generator_factory_impl( \ + #language, long_name, doc) \ + {} \ + }; \ + static t_##language##_generator_factory_impl _registerer; + +#endif \ No newline at end of file diff --git a/compiler/cpp/src/parse/t_program.h b/compiler/cpp/src/parse/t_program.h index 4e1ab6a5..420242fb 100644 --- a/compiler/cpp/src/parse/t_program.h +++ b/compiler/cpp/src/parse/t_program.h @@ -38,6 +38,7 @@ #include "t_list.h" #include "t_map.h" #include "t_set.h" +#include "generate/t_generator_registry.h" //#include "t_doc.h" /** @@ -159,6 +160,14 @@ class t_program : public t_doc { // Language neutral namespace / packaging void set_namespace(std::string language, std::string name_space) { + t_generator_registry::gen_map_t my_copy = t_generator_registry::get_generator_map(); + + t_generator_registry::gen_map_t::iterator it; + it=my_copy.find(language); + + if (it == my_copy.end()) { + throw "No generator named '" + language + "' could be found!"; + } namespaces_[language] = name_space; }