Noir::CSharpDecl
The declarations of one C# source file, read off CSharpLexer's masked
view: namespaces (block and file-scoped), types (class / struct /
interface / record / enum, partial, generic, with their base list and
primary-constructor parameters), and each type's members (methods,
constructors with their : base(...) arguments, properties, fields),
every one with its attributes as structured nodes.
Structure is read from the masked chars (strings and comments blanked),
so a ], ,, ( or { inside a literal or comment never moves a
boundary; every text the nodes carry comes from the comment-blanked code
(CSharpLexer#code_source), so string literals keep their value.
Method bodies are not entered: a body is one span. One linear pass per nesting level, no file access.