The problem I faced with Descent is that in order to get those nice features you want the semantic must be 100% accurate. Imagine refactoring something and it is left half-way through it. So in order to do that I needed to implement the semantics of the language. Cool, the lexer and parser are totally separated, but the semantic is so huge and complicated that it is practically impossible to do another front end for D if you want to be compatible with D (that currently means: compatible with DMD). Just take a look at CallExp::semantic. It's a huge function.
Another thing is that applying refactoring and other things to templates is nearly impossible because those are just syntax-checked and only semantic checked on instantiations. Sorry, I have to go now, I wanted to write more about this... I think DMD's source code should be re-written from scratch. It's overly complicated by now.
