[ 
https://issues.apache.org/jira/browse/THRIFT-5998?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jens Geyer resolved THRIFT-5998.
--------------------------------
    Fix Version/s: 0.24.0
         Assignee: Jens Geyer
       Resolution: Fixed

> netstd generator: duplicate DeepCopy/Equals/GetHashCode extension methods 
> when IDL includes other IDL files
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-5998
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5998
>             Project: Thrift
>          Issue Type: Bug
>          Components: netstd - Compiler
>            Reporter: Jens Geyer
>            Assignee: Jens Geyer
>            Priority: Major
>             Fix For: 0.24.0
>
>
> When an IDL file A includes file B and uses types from B in container fields 
> (e.g. {{map<string, B.Foo>}} or {{list<B.Foo>}}), the netstd generator 
> produces identical extension method signatures in both the generated 
> {{A.Extensions.cs}} and {{B.Extensions.cs}}. The C# compiler then raises 
> CS0121 ("ambiguous call") at every call site that invokes those extension 
> methods.
> Root cause: {{collect_extensions_types(t_type* ttype)}} recursively walks 
> into structs from included programs to discover nested container types. This 
> causes container types that are internal to the included program's structs to 
> be registered in the current program's {{collected_extension_types}} map, 
> resulting in duplicate extension method declarations.
> For example, if {{B.thrift}} defines struct {{Foo}} with a {{map<double, 
> Bar>}} field, and {{A.thrift}} includes B and uses {{Foo}} as a field value, 
> the generator emits {{DeepCopy(this Dictionary<double, Bar>?)}} in both 
> {{A.Extensions.cs}} and {{B.Extensions.cs}}.
> Fix: in {{collect_extensions_types(t_type* ttype)}}, when processing a struct 
> that belongs to an included program ({{ttype->get_program() != program_}}), 
> skip the recursive field walk. The included program's own generator run is 
> responsible for discovering and emitting extension methods for that struct's 
> internal container types.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to