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