[ 
https://issues.apache.org/jira/browse/THRIFT-1681?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14009706#comment-14009706
 ] 

ASF GitHub Bot commented on THRIFT-1681:
----------------------------------------

Github user daurnimator commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/92#discussion_r13079843
  
    --- Diff: compiler/cpp/src/generate/t_lua_generator.cc ---
    @@ -0,0 +1,1226 @@
    +/*
    + * 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.
    + */
    +
    +#include <sstream>
    +#include "t_oop_generator.h"
    +#include "platform.h"
    +
    +using std::ofstream;
    +using std::string;
    +using std::vector;
    +using std::map;
    +
    +static const string endl = "\n";  // avoid ostream << std::endl flushes
    +
    +/**
    + * LUA code generator.
    + *
    + */
    +class t_lua_generator : public t_oop_generator {
    + public:
    +  t_lua_generator(
    +      t_program* program,
    +      const std::map<std::string, std::string>& parsed_options,
    +      const std::string& option_string)
    +    : t_oop_generator(program)
    +  {
    +    std::map<std::string, std::string>::const_iterator iter;
    +
    +    iter = parsed_options.find("omit_requires");
    +    gen_requires_ = (iter == parsed_options.end());
    +
    +    out_dir_base_ = "gen-lua";
    +  }
    +
    +  /**
    +   * Init and close methods
    +   */
    +  void init_generator();
    +  void close_generator();
    +
    +  /**
    +   * Program-level generation functions
    +   */
    +  void generate_typedef  (t_typedef*  ttypedef);
    +  void generate_enum     (t_enum*     tenum);
    +  void generate_const    (t_const*    tconst);
    +  void generate_struct   (t_struct*   tstruct);
    +  void generate_xception (t_struct*   txception);
    +  void generate_service  (t_service*  tservice);
    +
    +  std::string render_const_value(t_type* type, t_const_value* value);
    +
    + private:
    +
    +  /**
    +   * True iff we should generate lua require statements.
    +   */
    +  bool gen_requires_;
    +
    +  /**
    +   * Struct-level generation functions
    +   */
    +  void generate_lua_struct_definition(
    +    std::ofstream& out, t_struct* tstruct, bool is_xception=false);
    +  void generate_lua_struct_reader(std::ofstream& out, t_struct* tstruct);
    +  void generate_lua_struct_writer(std::ofstream& out, t_struct* tstruct);
    +
    +  /**
    +   * Service-level generation functions
    +   */
    +  void generate_service_client    (std::ofstream& out, t_service* 
tservice);
    +  void generate_service_interface (std::ofstream& out, t_service* 
tservice);
    +  void generate_service_processor (std::ofstream& out, t_service* 
tservice);
    +  void generate_process_function  (std::ofstream& out, t_service* tservice,
    +                                   t_function* tfunction);
    +  void generate_service_helpers   (ofstream &out, t_service* tservice);
    +  void generate_function_helpers  (ofstream &out, t_function* tfunction);
    +
    +  /**
    +   * Deserialization (Read)
    +   */
    +  void generate_deserialize_field(
    +    std::ofstream &out, t_field *tfield, std::string prefix="");
    +
    +  void generate_deserialize_struct(
    +    std::ofstream &out, t_struct *tstruct, std::string prefix="");
    +
    +  void generate_deserialize_container(
    +    std::ofstream &out, t_type *ttype, std::string prefix="");
    +
    +  void generate_deserialize_set_element(
    +    std::ofstream &out, t_set *tset, std::string prefix="");
    +
    +  void generate_deserialize_map_element(
    +    std::ofstream &out, t_map *tmap, std::string prefix="");
    +
    +  void generate_deserialize_list_element(
    +    std::ofstream &out, t_list *tlist, std::string prefix="");
    +
    +  /**
    +   * Serialization (Write)
    +   */
    +  void generate_serialize_field(
    +    std::ofstream &out, t_field *tfield, std::string prefix="");
    +
    +  void generate_serialize_struct(
    +    std::ofstream &out, t_struct *tstruct, std::string prefix="");
    +
    +  void generate_serialize_container(
    +    std::ofstream &out, t_type *ttype, std::string prefix="");
    +
    +  void generate_serialize_map_element(
    +    std::ofstream &out, t_map *tmap, std::string kiter, std::string viter);
    +
    +  void generate_serialize_set_element(
    +    std::ofstream &out, t_set *tmap, std::string iter);
    +
    +  void generate_serialize_list_element(
    +    std::ofstream &out, t_list *tlist, std::string iter);
    +
    +  /**
    +   * Helper rendering functions
    +   */
    +  std::string lua_includes();
    +  std::string function_signature(t_function* tfunction, std::string 
prefix="");
    +  std::string argument_list(t_struct* tstruct, std::string prefix="");
    +  std::string type_to_enum(t_type* ttype);
    +  static std::string get_namespace(const t_program* program);
    +
    +  std::string autogen_comment() {
    +    return
    +      std::string("--\n") +
    +      "-- Autogenerated by Thrift\n" +
    +      "--\n" +
    +      "-- DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE 
DOING\n" +
    +      "-- @""generated\n" +
    +      "--\n";
    +  }
    +
    +  /**
    +   * File streams
    +   */
    +  std::ofstream f_types_;
    +  std::ofstream f_consts_;
    +  std::ofstream f_service_;
    +};
    +
    +
    +/**
    + * Init and close methods
    + */
    +void t_lua_generator::init_generator() {
    +  // Make output directory
    +  string outdir = get_out_dir();
    +  MKDIR(outdir.c_str());
    +
    +  // Make output files
    +  string cur_namespace = get_namespace(program_);
    +  string f_consts_name = outdir + cur_namespace + "constants.lua";
    +  f_consts_.open(f_consts_name.c_str());
    +  string f_types_name = outdir + cur_namespace + "ttypes.lua";
    +  f_types_.open(f_types_name.c_str());
    +
    +  // Add headers
    +  f_consts_ << autogen_comment() << lua_includes();
    +  f_types_ << autogen_comment() << lua_includes();
    +  if (gen_requires_) {
    +    f_types_ << endl << "require '" << cur_namespace << "constants'";
    +  }
    +}
    +
    +void t_lua_generator::close_generator() {
    +  // Close types file
    +  f_types_.close();
    +  f_consts_.close();
    +}
    +
    +/**
    + * Generate a typedef (essentially a constant)
    + */
    +void t_lua_generator::generate_typedef(t_typedef* ttypedef) {
    +  f_types_
    +    << endl << endl << indent()
    +    << ttypedef->get_symbolic() << " = "
    +    << ttypedef->get_type()->get_name();
    +}
    +
    +/**
    + * Generates code for an enumerated type (table)
    + */
    +void t_lua_generator::generate_enum(t_enum* tenum) {
    +  f_types_ << endl << endl << tenum->get_name() << " = {" << endl;
    +
    +  vector<t_enum_value*> constants = tenum->get_constants();
    +  vector<t_enum_value*>::iterator c_iter;
    +  for (c_iter = constants.begin(); c_iter != constants.end();) {
    +    int32_t value = (*c_iter)->get_value();
    +
    +    f_types_ << "  " << (*c_iter)->get_name() << " = " << value;
    +    ++c_iter;
    +    if (c_iter != constants.end()) {
    +      f_types_ << ",";
    +    }
    +    f_types_ << endl;
    +  }
    +  f_types_ << "}";
    +}
    +
    +/**
    + * Generate a constant (non-local) value
    + */
    +void t_lua_generator::generate_const(t_const* tconst) {
    +  t_type* type = tconst->get_type();
    +  string name = tconst->get_name();
    +  t_const_value* value = tconst->get_value();
    +
    +  f_consts_ << endl << endl << name << " = ";
    +  f_consts_ << render_const_value(type, value);
    +}
    +
    +/**
    + * Prints the value of a constant with the given type.
    + */
    +string t_lua_generator::render_const_value(
    +  t_type* type, t_const_value* value) {
    +  std::ostringstream out;
    +
    +  type = get_true_type(type);
    +  if (type->is_base_type()) {
    +    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
    +    switch (tbase) {
    +    case t_base_type::TYPE_STRING:
    +      out << "'" << value->get_string() << "'";
    --- End diff --
    
    escaping?


> Add Lua Support
> ---------------
>
>                 Key: THRIFT-1681
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1681
>             Project: Thrift
>          Issue Type: Sub-task
>          Components: Compiler (General)
>            Reporter: Daurn Imator
>            Assignee: Roger Meier
>              Labels: language, lua
>             Fix For: 0.9.2
>
>
> I'd love to see a lua library for Thift.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to