[ https://issues.apache.org/jira/browse/THRIFT-4631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16612882#comment-16612882 ]
James E. King III commented on THRIFT-4631: ------------------------------------------- Is this related to THRIFT-3015? > Codegen Creates Invalid Ruby for Recursive Structs > -------------------------------------------------- > > Key: THRIFT-4631 > URL: https://issues.apache.org/jira/browse/THRIFT-4631 > Project: Thrift > Issue Type: Bug > Components: Ruby - Compiler, Ruby - Library > Affects Versions: 0.11.0 > Reporter: charles giardina > Priority: Minor > > Though thrift supports defining recursive structs, it appears that the Ruby > codegen does not generate valid Ruby for for recursive structs. > e.g. Here's an example of what I'm seeing and how to recreate it using > Recursive.thrift in the Thrift test suite. > * add {{$(THRIFT) --gen rb ../Recursive.thrift}} to {{test/rb/Makefile.am}} > * and add {{require "recursive_types"}} to > {{test/rb/generation/test_struct.rb}} > * run {{make -k check}} from {{test/rb}} > * this ends up raising the following exception: > {code:java} > thrift/test/rb/gen-rb/recursive_types.rb:50:in `<class:CoRec>': uninitialized > constant CoRec2 (NameError) > Did you mean? CoRec > from thrift/test/rb/gen-rb/recursive_types.rb:45:in `<top (required)>' > from thrift/test/rb/generation/test_struct.rb:22:in `require' > from thrift/test/rb/generation/test_struct.rb:22:in `<top (required)>' > from test_suite.rb:20:in `require' > from test_suite.rb:20:in `block in <main>' > from test_suite.rb:20:in `each' > from test_suite.rb:20:in `<main>' > make: *** [check] Error 1 > {code} > > I've copied the generated code below. But essentially the issue appears to be > that recursive structs are referencing constants or classes that have not yet > been declared. I have some ideas on how to address this and can post a > proposed solution. > > generated code: > {code:java} > # > # Autogenerated by Thrift Compiler (0.11.0) > # > # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING > # > require 'thrift' > module RecursiveExample > class Node < ::Thrift::Union > include ::Thrift::Struct_Union > class << self > def inner_node(val) > Node.new(:inner_node, val) > end > def leaf_node(val) > Node.new(:leaf_node, val) > end > end > INNER_NODE = 1 > LEAF_NODE = 2 > FIELDS = { > INNER_NODE => {:type => ::Thrift::Types::STRUCT, :name => 'inner_node', > :class => ::RecursiveExample::InnerNode, :optional => true}, > LEAF_NODE => {:type => ::Thrift::Types::STRUCT, :name => 'leaf_node', > :class => ::RecursiveExample::LeafNode, :optional => true} > } > def struct_fields; FIELDS; end > def validate > raise(StandardError, 'Union fields are not set.') if get_set_field.nil? > || get_value.nil? > end > ::Thrift::Union.generate_accessors self > end > class InnerNode > include ::Thrift::Struct, ::Thrift::Struct_Union > NODE = 1 > FIELDS = { > NODE => {:type => ::Thrift::Types::STRUCT, :name => 'node', :class => > ::RecursiveExample::Node} > } > def struct_fields; FIELDS; end > def validate > raise > ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, > 'Required field node is unset!') unless @node end > ::Thrift::Struct.generate_accessors self > end > class LeafNode > include ::Thrift::Struct, ::Thrift::Struct_Union > FIELDS = { > } > def struct_fields; FIELDS; end > def validate > end > ::Thrift::Struct.generate_accessors self > end > end > {code} > -- This message was sent by Atlassian JIRA (v7.6.3#76005)