DisambiguateProperties renames properties to disambiguate between unrelated fields with the same name. Two properties are considered related if they share a definition on their prototype chains, or if they are potentially referenced together via union types.
Renamimg only occurs if there are two or more distinct properties with the same name.
This pass allows other passes, such as inlining and code removal to take advantage of type information implicitly.
Foo.a; Bar.a;
will become
Foo.a$Foo; Bar.a$Bar;