If you write the IDE in the language itself, you can use reflection to access, query and manipulate the program's structure directly, while the program is running.
This is theoretically true and I am excited about LightTable but even then, there are many situations where automated refactoring simply isn't possible.
This is a hazard in pretty much any language though. At some point you're going to want to do something dynamic at run time just to get a particular feature to be possible- whether it's by using a built in feature of a language, or by importing an aircraft carrier to do it for you in Java. It's simply Godel's curse- every sufficiently powerful formal system has an escape port. Otherwise known as Greenspun's 10th rule.