You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Andrew Kuhnhausen (JIRA)" <ji...@apache.org> on 2009/10/20 03:24:59 UTC

[jira] Created: (THRIFT-609) generator allows for fields that break code

generator allows for fields that break code
-------------------------------------------

                 Key: THRIFT-609
                 URL: https://issues.apache.org/jira/browse/THRIFT-609
             Project: Thrift
          Issue Type: Bug
    Affects Versions: 0.2
            Reporter: Andrew Kuhnhausen


affects latest SVN and latest snapshot.

generator should allow for any possible known conflict with any language specific constant by either throwing an error for every known language specific variable name, or appending something like '__' to each of the fields. here is an example and a possible solution

// EXAMPLE
struct TimeInterval {
    1: UnixTime start,
    2: UnixTime end,
}

will generate invalid ruby code by trying to define "END":

class TimeInterval
  include ::Thrift::Struct
  START = 1
  END = 2

  ::Thrift::Struct.field_accessor self, :start, :end
  FIELDS = {
    START => {:type => ::Thrift::Types::I32, :name => 'start'},
    END => {:type => ::Thrift::Types::I32, :name => 'end'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

end

// POSSIBLE SOLUTION
line 523:
void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    std::string field_name = (*f_iter)->get_name();
    std::string cap_field_name = upcase_string(field_name);
    //
    // append '__' to the end of field names
    cap_field_name = cap_field_name + "__";
    //
    //
    indent(out) << cap_field_name << " = " << (*f_iter)->get_key()  << endl;
  }
  out << endl;
}
line 551:
void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  indent(out) << "FIELDS = {" << endl;
  indent_up();
  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    if (f_iter != fields.begin()) {
      out << "," << endl;
    }

    // generate the field docstrings within the FIELDS constant. no real better place...
    generate_rdoc(out, *f_iter);
    //
    //
    // add the '__' to the end of the field name
    indent(out) <<
      upcase_string((*f_iter)->get_name()) << "__ => ";
    //
    //
    generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), 
      (*f_iter)->get_req() == t_field::T_OPTIONAL);
  }
  indent_down();
  out << endl;
  indent(out) << "}" << endl << endl;
  
  indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
  
}

this will then make all possible variations on any language syntactically sound

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Closed: (THRIFT-609) generator allows for fields that break code

Posted by "Bryan Duxbury (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/THRIFT-609?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bryan Duxbury closed THRIFT-609.
--------------------------------

    Resolution: Duplicate

> generator allows for fields that break code
> -------------------------------------------
>
>                 Key: THRIFT-609
>                 URL: https://issues.apache.org/jira/browse/THRIFT-609
>             Project: Thrift
>          Issue Type: Bug
>          Components: Compiler (Ruby)
>    Affects Versions: 0.2
>            Reporter: Andrew Kuhnhausen
>
> affects latest SVN and latest snapshot.
> generator should allow for any possible known conflict with some ruby specific constant by either throwing an error for every known ruby specific constant name, or appending something like '__' to each of the fields. here is an example and a possible solution
> // EXAMPLE
> struct TimeInterval {
>     1: UnixTime start,
>     2: UnixTime end,
> }
> will generate invalid ruby code by trying to define "END":
> class TimeInterval
>   include ::Thrift::Struct
>   START = 1
>   END = 2
>   ::Thrift::Struct.field_accessor self, :start, :end
>   FIELDS = {
>     START => {:type => ::Thrift::Types::I32, :name => 'start'},
>     END => {:type => ::Thrift::Types::I32, :name => 'end'}
>   }
>   def struct_fields; FIELDS; end
>   def validate
>   end
> end
> // POSSIBLE SOLUTION
> line 523:
> void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) {
>   const vector<t_field*>& fields = tstruct->get_members();
>   vector<t_field*>::const_iterator f_iter;
>   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
>     std::string field_name = (*f_iter)->get_name();
>     std::string cap_field_name = upcase_string(field_name);
>     //
>     // append '__' to the end of field names
>     cap_field_name = cap_field_name + "__";
>     //
>     //
>     indent(out) << cap_field_name << " = " << (*f_iter)->get_key()  << endl;
>   }
>   out << endl;
> }
> line 551:
> void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
>   const vector<t_field*>& fields = tstruct->get_members();
>   vector<t_field*>::const_iterator f_iter;
>   indent(out) << "FIELDS = {" << endl;
>   indent_up();
>   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
>     if (f_iter != fields.begin()) {
>       out << "," << endl;
>     }
>     // generate the field docstrings within the FIELDS constant. no real better place...
>     generate_rdoc(out, *f_iter);
>     //
>     //
>     // add the '__' to the end of the field name
>     indent(out) <<
>       upcase_string((*f_iter)->get_name()) << "__ => ";
>     //
>     //
>     generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), 
>       (*f_iter)->get_req() == t_field::T_OPTIONAL);
>   }
>   indent_down();
>   out << endl;
>   indent(out) << "}" << endl << endl;
>   
>   indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
>   
> }
> this will then make all possible variations in ruby syntactically sound

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (THRIFT-609) generator allows for fields that break code

Posted by "Andrew Kuhnhausen (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/THRIFT-609?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Andrew Kuhnhausen updated THRIFT-609:
-------------------------------------

    Component/s: Compiler (Ruby)
    Description: 
affects latest SVN and latest snapshot.

generator should allow for any possible known conflict with some ruby specific constant by either throwing an error for every known ruby specific constant name, or appending something like '__' to each of the fields. here is an example and a possible solution

// EXAMPLE
struct TimeInterval {
    1: UnixTime start,
    2: UnixTime end,
}

will generate invalid ruby code by trying to define "END":

class TimeInterval
  include ::Thrift::Struct
  START = 1
  END = 2

  ::Thrift::Struct.field_accessor self, :start, :end
  FIELDS = {
    START => {:type => ::Thrift::Types::I32, :name => 'start'},
    END => {:type => ::Thrift::Types::I32, :name => 'end'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

end

// POSSIBLE SOLUTION
line 523:
void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    std::string field_name = (*f_iter)->get_name();
    std::string cap_field_name = upcase_string(field_name);
    //
    // append '__' to the end of field names
    cap_field_name = cap_field_name + "__";
    //
    //
    indent(out) << cap_field_name << " = " << (*f_iter)->get_key()  << endl;
  }
  out << endl;
}
line 551:
void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  indent(out) << "FIELDS = {" << endl;
  indent_up();
  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    if (f_iter != fields.begin()) {
      out << "," << endl;
    }

    // generate the field docstrings within the FIELDS constant. no real better place...
    generate_rdoc(out, *f_iter);
    //
    //
    // add the '__' to the end of the field name
    indent(out) <<
      upcase_string((*f_iter)->get_name()) << "__ => ";
    //
    //
    generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), 
      (*f_iter)->get_req() == t_field::T_OPTIONAL);
  }
  indent_down();
  out << endl;
  indent(out) << "}" << endl << endl;
  
  indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
  
}

this will then make all possible variations in ruby syntactically sound

  was:
affects latest SVN and latest snapshot.

generator should allow for any possible known conflict with any language specific constant by either throwing an error for every known language specific variable name, or appending something like '__' to each of the fields. here is an example and a possible solution

// EXAMPLE
struct TimeInterval {
    1: UnixTime start,
    2: UnixTime end,
}

will generate invalid ruby code by trying to define "END":

class TimeInterval
  include ::Thrift::Struct
  START = 1
  END = 2

  ::Thrift::Struct.field_accessor self, :start, :end
  FIELDS = {
    START => {:type => ::Thrift::Types::I32, :name => 'start'},
    END => {:type => ::Thrift::Types::I32, :name => 'end'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

end

// POSSIBLE SOLUTION
line 523:
void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    std::string field_name = (*f_iter)->get_name();
    std::string cap_field_name = upcase_string(field_name);
    //
    // append '__' to the end of field names
    cap_field_name = cap_field_name + "__";
    //
    //
    indent(out) << cap_field_name << " = " << (*f_iter)->get_key()  << endl;
  }
  out << endl;
}
line 551:
void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;

  indent(out) << "FIELDS = {" << endl;
  indent_up();
  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    if (f_iter != fields.begin()) {
      out << "," << endl;
    }

    // generate the field docstrings within the FIELDS constant. no real better place...
    generate_rdoc(out, *f_iter);
    //
    //
    // add the '__' to the end of the field name
    indent(out) <<
      upcase_string((*f_iter)->get_name()) << "__ => ";
    //
    //
    generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), 
      (*f_iter)->get_req() == t_field::T_OPTIONAL);
  }
  indent_down();
  out << endl;
  indent(out) << "}" << endl << endl;
  
  indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
  
}

this will then make all possible variations on any language syntactically sound


realized this only affects ruby

> generator allows for fields that break code
> -------------------------------------------
>
>                 Key: THRIFT-609
>                 URL: https://issues.apache.org/jira/browse/THRIFT-609
>             Project: Thrift
>          Issue Type: Bug
>          Components: Compiler (Ruby)
>    Affects Versions: 0.2
>            Reporter: Andrew Kuhnhausen
>
> affects latest SVN and latest snapshot.
> generator should allow for any possible known conflict with some ruby specific constant by either throwing an error for every known ruby specific constant name, or appending something like '__' to each of the fields. here is an example and a possible solution
> // EXAMPLE
> struct TimeInterval {
>     1: UnixTime start,
>     2: UnixTime end,
> }
> will generate invalid ruby code by trying to define "END":
> class TimeInterval
>   include ::Thrift::Struct
>   START = 1
>   END = 2
>   ::Thrift::Struct.field_accessor self, :start, :end
>   FIELDS = {
>     START => {:type => ::Thrift::Types::I32, :name => 'start'},
>     END => {:type => ::Thrift::Types::I32, :name => 'end'}
>   }
>   def struct_fields; FIELDS; end
>   def validate
>   end
> end
> // POSSIBLE SOLUTION
> line 523:
> void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) {
>   const vector<t_field*>& fields = tstruct->get_members();
>   vector<t_field*>::const_iterator f_iter;
>   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
>     std::string field_name = (*f_iter)->get_name();
>     std::string cap_field_name = upcase_string(field_name);
>     //
>     // append '__' to the end of field names
>     cap_field_name = cap_field_name + "__";
>     //
>     //
>     indent(out) << cap_field_name << " = " << (*f_iter)->get_key()  << endl;
>   }
>   out << endl;
> }
> line 551:
> void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
>   const vector<t_field*>& fields = tstruct->get_members();
>   vector<t_field*>::const_iterator f_iter;
>   indent(out) << "FIELDS = {" << endl;
>   indent_up();
>   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
>     if (f_iter != fields.begin()) {
>       out << "," << endl;
>     }
>     // generate the field docstrings within the FIELDS constant. no real better place...
>     generate_rdoc(out, *f_iter);
>     //
>     //
>     // add the '__' to the end of the field name
>     indent(out) <<
>       upcase_string((*f_iter)->get_name()) << "__ => ";
>     //
>     //
>     generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), 
>       (*f_iter)->get_req() == t_field::T_OPTIONAL);
>   }
>   indent_down();
>   out << endl;
>   indent(out) << "}" << endl << endl;
>   
>   indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
>   
> }
> this will then make all possible variations in ruby syntactically sound

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.