When using the libclang API, ‘#define’ statements yield cursors, but ‘#undefine’ statements do not.
Without a record of #undefines, I can’t determine which #defines are extant at any given point in the code, and am thus unable to fully determine dependencies between source files.
Is it possible to determine which #defines are active for a given source location, or would the addition of #undefine cursors be a reasonable feature request for the libclang API?
Well, you are lucky in that a good chunk of work went on recently into what was called “Macro History” whose goal is exactly to remember every single #define/#undef that a macro encountered in the pre-processing of the translation unit. Therefore, using this macro history, it should be possible to extract this information.
Unfortunately, I do not know the exact API, Alexander Kornienko initiated the work on this, so he probably followed it, I have added him in CC so he can help us figure out exactly where this feature stands.
If you want to have a read-only access to macro history in libclang, you’ll probably need to forward these methods:
IdentifierInfo::hadMacroDefinition(), Preprocessor::getMacroInfoHistory(IdentifierInfo *), MacroInfo::getPreviousDefinition(), MacroInfo::getUndefLoc()
The longer-term goal here is to switch libclang’s macro cursors over to the Preprocessor’s MacroInfo, abolishing the “detailed preprocessor record” currently used by libclang.