The same read over an already DECODED attribute value, for the readers that
hold entity.attributes[5] rather than record bytes. A decoded typed value
is [NAME, ...args] (EntityExtractor mirrors the Rust tokenizer), so the
rule is the byte reader's: unwrap [IFCPROPERTYSETDEFINITIONSET, [set]],
otherwise keep the direct members; skip anything that is not a reference.
readRef says what a reference looks like in the caller's values: the
default accepts the parsed numeric ids; a caller whose records also carry
authored '#123' tokens passes its own reader. Written order, repeats kept.
Known divergence: a decoded reference is a bare number, so the default
readRef cannot tell #1500 from a stray 1500 ((#20,1.5E3,#22) reads
as [20,1500,22]; the byte reader and Rust give [20,22]). A caller whose
values may hold such scalars passes a readRef that also checks the number
names an entity, as current-type-quantities.ts does.
The same read over an already DECODED attribute value, for the readers that hold
entity.attributes[5]rather than record bytes. A decoded typed value is[NAME, ...args](EntityExtractormirrors the Rust tokenizer), so the rule is the byte reader's: unwrap[IFCPROPERTYSETDEFINITIONSET, [set]], otherwise keep the direct members; skip anything that is not a reference.readRefsays what a reference looks like in the caller's values: the default accepts the parsed numeric ids; a caller whose records also carry authored'#123'tokens passes its own reader. Written order, repeats kept.Known divergence: a decoded reference is a bare number, so the default
readRefcannot tell#1500from a stray1500((#20,1.5E3,#22)reads as[20,1500,22]; the byte reader and Rust give[20,22]). A caller whose values may hold such scalars passes areadRefthat also checks the number names an entity, ascurrent-type-quantities.tsdoes.