Previously, Sema was reusing parts of the AST when synthesizing an assignment
operator, turning it into a AS-dag. This caused problems for the static
analyzer, which assumed an expression appears in the tree only once.
Here I make sure to always create a fresh Expr, when inserting something into
the AST, fixing PR16745 in the process.
I personally find a class structure easier to understand that goes from public: over protected: to private:, and has methods ordered from most important to know for a user of the class to least important, as that aids the common top-down reading flow.
This file is inconsistent regarding this style question, so I punt to doug for judgement ;)