tree-sitter/tree-sitter-c-sharp

Improve type parsing

tamasvajk opened this issue · 2 comments

Type parsing doesn't seem to handle all the possible cases that can come up in C#.

  1. One particular case which is missing is void*. void is handled separately from all other types, and is only introduced as a return type, but that means that pointer types don't cover void. void*, void**, ... can show up anywhere a type can show up, not just as a return type. I thing it would be the most elegant if void could be added to predefined_type as it is done in Roslyn.

  2. Similarly, it feels like shortcuts were made for ref types too. #246 allows ref (readonly) in delegate declarations, but that fix seems more like a workaround than a proper fix. For example in the below C# example, I think ref and the second readonly should actually belong to the type and not the field_declaration.

ref struct X {
    public X(){}
    readonly ref readonly int x = 5;
}

produces

...
      field_declaration [2, 4] - [2, 36]
        modifier [2, 4] - [2, 12]
        modifier [2, 13] - [2, 16]
        modifier [2, 17] - [2, 25]
        variable_declaration [2, 26] - [2, 35]
          type: predefined_type [2, 26] - [2, 29]
          variable_declarator [2, 30] - [2, 35]
...

Yeah I started adding ref_type - we have an unused stub for it - but adding it to the parser just exploded a whole bunch of conflicts so it was set aside as it wasn't a common pattern. We definitely have some precedent issues that I think are all tied together.

The two problems mentioned above have been solved.