At this point it's probably worth noting that there are two (2) kinds of plug-ins.
The first and "simplest" is the type that uses information created by the compiler to derive new information from it, e.g, a source analyzer.
The second and, much more complicated by several orders of magnitude, is a plug-in that either "assists" or possibly even replaces some of the compiler's functions such as some optimizations. This not only requires accommodating plug-ins but also requires a level of compiler modularization and standardization of internal data representation that isn't easy to accomplish.
As far as source preprocessors go, anyone who has used C is sadly aware of all the problems source preprocessors can, and often do, create. I believe it was all those problems that led to the addition of "templates"/"generics" in the compiler which is, "preprocessing" (effectively, a macro resolved by the compiler) done by the compiler not by some text manipulation "thingy".