[ 
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)

Reply via email to