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

ASF GitHub Bot updated AVRO-4331:
---------------------------------
    Labels: pull-request-available  (was: )

> [C#] Generated Get()/Put() switch emits unreachable statement after 
> exhaustive switc
> ------------------------------------------------------------------------------------
>
>                 Key: AVRO-4331
>                 URL: https://issues.apache.org/jira/browse/AVRO-4331
>             Project: Apache Avro
>          Issue Type: Improvement
>          Components: csharp
>    Affects Versions: 1.12.1
>            Reporter: Nikola G.
>            Priority: Minor
>              Labels: pull-request-available
>   Original Estimate: 0.5h
>          Time Spent: 10m
>  Remaining Estimate: 20m
>
> Avrogen generates Get(int fieldPos) / Put(int fieldPos, object fieldValue) on 
> every SpecificRecordBase-derived record. The switch body is built as a raw 
> string in CodeGen.cs and added to the method via CodeSnippetExpression:       
>                                                                               
>                                                                               
>                                                                              
>   var cseGet = new CodeSnippetExpression(getFieldStmt.ToString());            
>                                                                               
>                                                                              
>   cmmGet.Statements.Add(cseGet);                                              
>                                                                               
>                                                                              
>                                                                               
>                                                                               
>                                                                              
>   CodeStatementCollection.Add(CodeExpression) wraps the expression in a 
> CodeExpressionStatement, and the C# CodeDom provider always appends a 
> trailing ; after an expression statement even though the snippet text is 
> already a       
>   complete switch (fieldPos) \{ ... } block. The generated code looks like 
> this: 
>  public virtual object Get(int fieldPos)                                      
>                                                                               
>                                                                             
>   {                                                                           
>                                                                               
>                                                                              
>       switch (fieldPos)                                                       
>                                                                               
>                                                                              
>       {                                                                       
>                                                                               
>                                                                              
>       case 0: return this.Value;                                              
>                                                                               
>                                                                              
>       case 1: return this.Quality;                                            
>                                                                               
>                                                                              
>       default: throw new global::Avro.AvroRuntimeException("Bad index " + 
> fieldPos + " in Get()");                                                      
>                                                                               
>    
>       };   // <- stray empty statement, unreachable                           
>                                                                               
>                                                                              
>   } 
> Since every branch of the switch returns or throws, that trailing ; is 
> unreachable. Roslyn's own compiler analysis does not flag it (dotnet build 
> stays clean), but IDE analyzers with more thorough flow analysis notably 
> JetBrains 
>   ReSharper/Rider — do flag it as unreachable code, forcing consumers to add 
> per-file .editorconfig suppressions for every directory of avrogen output 
> just to keep their IDE quiet.



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

Reply via email to