[cfe-dev] Distinguishing system headers from user headers using libclang
Argyrios Kyrtzidis
akyrtzi at gmail.com
Fri Apr 12 07:59:41 PDT 2013
On Apr 11, 2013, at 11:43 PM, "Siedlarek, Mikołaj" <m.siedlarek at nctz.net> wrote:
> On Thu, Apr 11, 2013 at 7:22 PM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
>> On Apr 5, 2013, at 4:20 AM, "Siedlarek, Mikołaj" <m.siedlarek at nctz.net>
>> wrote:
>>
>> On Fri, Apr 5, 2013 at 12:37 PM, Siedlarek, Mikołaj
>> <m.siedlarek at nctz.net> wrote:
>>
>> On Fri, Apr 5, 2013 at 12:22 AM, Argyrios Kyrtzidis <akyrtzi at gmail.com>
>> wrote:
>>
>>
>> On Apr 2, 2013, at 1:33 AM, Mikołaj Siedlarek <m.siedlarek at nctz.net> wrote:
>>
>> Hi,
>>
>> I'm writing a simple code dependency analysis tool using libclang and I'm
>> missing some way of distinguishing system headers from user headers. I see
>> clang::DirectoryLookup::getDirCharacteristic() provides such interface, but
>> is there any way I could obtain this information using just libclang? My
>> tool is rather simple and I'd like to keep it that way - libclang seems to
>> be sufficient for the rest of my needs.
>>
>>
>> There is no way currently, but it should relatively easy, are you interested
>> in providing such a patch ?
>> The clang function you may need to look into using is
>> "SourceManager::isInSystemHeader(SourceLocation Loc)"
>> The libclang function would accept a CXTranslationUnit and a
>> CXSourceLocation.
>>
>>
>>
>> How about this? That's the best and most elastic approach I could think of.
>>
>>
>> There was unnecessary CINDEX_LINKAGE in the first version of my patch.
>> Here's corrected one.
>>
>>
>> + /**
>> + * \brief System code which is implicitly 'extern "C"' in C++ mode
>> + */
>> + CXCharacteristicKind_ExternCSystem
>>
>> This is very "legacy-hacky-compiler-specific"; I can't think of a reason
>> that a libclang client would need to know this.
>>
>> I suggest just adding a
>> int clang_SourceLocation_isInSystemHeader(CXSourceLocation location)
>> function.
>
> I agree ExternCSystem may not be useful - I added it to mimic
> underlaying library interface. Nevertheless, I don't think boolean
> isInSystemHeader is enough. For example - in my program I need to know
> whether given source location is in user code. !isInSystemHeader
> wouldn't be enough, because there are also invalid locations like
> built-in compiler declarations or anything really that has no
> corresponding location in the source.
To check for invalid locations you can do:
if (clang_equalLocations(Location, clang_getNullLocation()) {
// invalid
}
>
> --
> Mikołaj Siedlarek
> m.siedlarek at nctz.net
More information about the cfe-dev
mailing list