I think you basically covered it in your other comment. Macros are much quicker and easier to write than compiler plugins or annotation processors, but they are difficult for the IDE to understand. So it's a trade-off where Nim and Kotlin both make reasonable, but quite different, choices.