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

Anthony Molinaro commented on THRIFT-1532:
------------------------------------------

Actually, made one more minor adjustment which I believe makes it even more 
correct.  Instead of having any complex type (ie, set, list, map, record), 
require a default value, I only add the defaults if it's a required field (as 
it should be perfectly correct to have an undefined optional or default field).

So this makes my example
{code}
struct StructB
{
  1: string x
}

struct StructA
{
  1: string a,
  2: binary b,
  3: optional string c,
  4: optional binary d,
  5: required string e,
  6: required binary f,
  7: string g = "foo",
  8: i32 h,
  9: optional i32 i,
  10: required i32 j,
  11: required i32 k = 5,
  12: double l,
  13: optional double m,
  14: required double n,
  15: double o = 3.14159,
  16: list<string> string_list,
  17: list<byte> byte_list = [1, 2, 3],
  18: required list<string> rsl,
  19: optional list<string> osl,
  20: set<string> string_set,
  21: required set<string> rss,
  22: optional set<string> oss,
  23: map<string, string> string_map,
  24: required map<string, string> rsm,
  25: optional map<string, string> osm,
  26: StructB structb
}
{code}
Now generate this
{code}
%% struct structB

-record(structB, {x :: string() | binary()}).

%% struct structA

-record(structA, {a :: string() | binary(),
                  b :: string() | binary(),
                  c :: string() | binary(),
                  d :: string() | binary(),
                  e :: string() | binary(),
                  f :: string() | binary(),
                  g = "foo" :: string() | binary(),
                  h :: integer(),
                  i :: integer(),
                  j :: integer(),
                  k = 5 :: integer(),
                  l :: float(),
                  m :: float(),
                  n :: float(),
                  o = 3.14159 :: float(),
                  string_list :: list(),
                  byte_list = [1,2,3] :: list(),
                  rsl = [] :: list(),
                  osl :: list(),
                  string_set :: set(),
                  rss = sets:new() :: set(),
                  oss :: set(),
                  string_map :: dict(),
                  rsm = dict:new() :: dict(),
                  osm :: dict(),
                  structb :: #structB{}}).
{code}

Please try it out and let me know how it goes.

                
> The type specifications in the generated Erlang code should include 
> "undefined" where it's used as a default value
> ------------------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-1532
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1532
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Erlang - Compiler
>    Affects Versions: 0.8
>         Environment: Erlang/OTP R15B.
>            Reporter: Björn Bylander
>            Assignee: Anthony Molinaro
>            Priority: Minor
>              Labels: compiler, dialyzer, erlang, specification, type
>             Fix For: 0.9
>
>         Attachments: THRIFT-1532_t_erl_generator.cc.patch, agent.tar.gz
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> The Erlang code generated by the compiler for, for example, an integer field 
> of a struct sets a default value of 'undefined' but the type to just 
> 'integer()' which doesn't include the default value. This makes Dialyzer 
> complain if the field has not been initialized as it gets set to 'undefined' 
> instead of an integer value.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to