One direct field declaration recovered from an object-like macro
replacement. The replacement is parsed as the body of a synthetic struct,
so the name and declaration text come from C/C++ grammar nodes rather than
from a textual macro expansion.
The structured content of one object-like field-list macro replacement:
the members it declares itself, and the names of the field-list macros it
composes in turn. Composition is kept as names rather than resolved here
because a nested name’s active replacement is a property of the
preprocessor environment at the invocation, not of this replacement.
Hide grammar-owned comments inside function-like replacements from the
primary parser. Otherwise tree-sitter can terminate preproc_arg at the
comment and read the rest of the directive as surrounding C/C++ code.
Replacement analysis still reads the original source and reparses the full
logical span; included ranges preserve every original byte coordinate.