@xeno-by, I took the current toString implementation, wich is heavily dependent on compiler internals. Maybe we could have done it differently, but I wanted to stay as close as possible to the current implementation. Here are some points where internals are used:

* TypeRefs 
    * for functions are printed using arrow notation
      * if it's Function1, it doesn't wrap parenthesis around the parameter
        * unless the parameter type is a tuple type
    * tuples are printed using parenthesis
* existentials are (whenever possible) printed using underscores
* etc. (the code speaks for itself)

I think some methods (like `rawInfo`) are used in order not to force too much when printing. Not sure if reflection has such distinctions.