You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Carl Yeksigian (JIRA)" <ji...@apache.org> on 2012/12/16 23:20:12 UTC

[jira] [Commented] (THRIFT-1786) C# Union Typing

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

Carl Yeksigian commented on THRIFT-1786:
----------------------------------------

I have attached a patch which generates this pattern of code.

This patch needs THRIFT-1788 & THRIFT-1793 to have already been applied before this will apply cleanly. Because it is an abstract union class, the static read is necessary as we do not know what type it will be until after we have read the field identifier.

Also, I've added a class "___undefined" which is used if the field cannot be found, or if the type does not match.
                
> C# Union Typing
> ---------------
>
>                 Key: THRIFT-1786
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1786
>             Project: Thrift
>          Issue Type: New Feature
>          Components: C# - Compiler
>            Reporter: Carl Yeksigian
>            Assignee: Carl Yeksigian
>         Attachments: 1786.patch
>
>
> Given the thrift IDL:
> {code}
> struct A {
>   0: i32 value
> }
> union AUnion {
>   0: A field1,
>   1: A field2,
>   2: i32 value
> }
> {code}
> We should generate a C# subclassing tree:
> {code}
> class A : TBase {
>   int Value { get;set; }
> }
> abstract class AUnion : TBase {
>   abstract object Data { get; }
>   protected int field;
>   abstract void WriteUnionField(TProtocol tprot);
>   class field1 : AUnion {
>     A _data;
>     override object Data { get { return _data; } }
>     public field1(A data) {
>       this._data = data;
>       this.field = 0;
>     }
>   }
>   class field2 : AUnion {
>     A _data;
>     override object Data { get { return _data; } }
>     public field2(A data) {
>       this._data = data;
>       this.field = 1;
>     }
>   }
>   class value : AUnion {
>     int _data;
>     override object Data { get { return _data; } }
>     public value(int data) {
>       this._data = data;
>       this.field = 2;
>     }
>   }
> }
> {code}
> This gives us creation syntax of:
> {code}
> var aunion = new AUnion.value(10);
> {code}
> This should be an optional parameter to the compiler since it is a breaking change to existing code.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira