Some types of Kotlin classes (i.e. data, value, inline) simply hold data.
The compiler uses this fact to automatically generate functions that a programmer would normally implement manually.
One of these functions is the default toString() and its potential implementation counterpart toString-impl().
The output of these functions is of the form "User(name=John, age=42)".
This exposes unobfuscated classNames (in the example above "User") so we must update these className strings
with their obfuscated versions.
This class relies on the
KotlinPropertyNameObfuscator storing the obfuscated
name in the processingInfo field. And that the
ClassObfuscator gives us the
new class name (internally this also relies on the new class name being in the
processingInfo field).
One limitation of this class is that it requires that the Kotlin metadata is still attached to the
classes that are processed. If the Kotlin metadata is stripped
KotlinAnnotationStripper or
removed by the
KotlinMetadataAsserter the `toString` method's output cannot be updated with the
obfuscated class name.