a23a0bc3a4
DynamicValues are generated whenever a partially evaluated expression is unable to be resolved statically. They contain a reference to the ts.Node which wasn't resolvable. They can also be nested. For example, the expression 'a + b' is resolvable only if 'a' and 'b' are themselves resolvable. If either 'a' or 'b' resolve to a DynamicValue, the whole expression must also resolve to a DynamicValue. Previously, if 'a' resolved to a DynamicValue, the entire expression might have been resolved to the same DynamicValue. This correctly indicated that the expression wasn't resolvable, but didn't return a reference to the shallow node that couldn't be resolved (the expression 'a + b'), only a reference to the deep node that couldn't be resolved ('a'). In certain situations, it's very useful to know the shallow unresolvable node (for example, to use it verbatim in the output). To support this, the partial evaluator is updated to always wrap DynamicValue to point to each unresolvable expression as it's processed, ensuring the receiver can determine exactly which expression node failed to resolve. PR Close #29033