You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jens Geyer (Jira)" <ji...@apache.org> on 2026/05/14 22:22:00 UTC

[jira] [Resolved] (THRIFT-5998) netstd generator: duplicate DeepCopy/Equals/GetHashCode extension methods when IDL includes other IDL files

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