The field order is the emission order, and it is load-bearing: prefix,inner prefix, raw, then either the children or opaque_content, then tail,inner suffix, suffix. Anything that emits these in a different orderround-trips wrongly on exactly the inputs that have comments in the awkwardplaces, and on nothing else.
A tree rather than a string because the parser splices pieces together onnearly every step -- a comment moves from one node's prefix to another'ssuffix, a commented-out group is rendered into the text around it -- and aString would make each of those a copy. It is flattened once, by apreorder walk, when something finally asks for the text.