[cfe-commits] Patch suggestion for libclang

Clint Caywood clint at clintcaywood.com
Mon Mar 19 15:32:40 PDT 2012


Hi Argyrios,

On Mon, Mar 19, 2012 at 4:35 PM, Argyrios Kyrtzidis <kyrtzidis at apple.com>wrote:

> Hi Clint,
>
> On Mar 18, 2012, at 1:18 PM, Clint Caywood wrote:
>
> Ping.
>
> I apologize for the poorly named subject of this submission, but rather
> than resubmit, I figured it would be better to continue the thread.
>
> This patch fixes clang_getCursorExtent() when called with a CXCursor of
> kind CXCursor_TranslationUnit.
>
> Currently, the following snippet (using libclang) will return an empty
> range:
>
>     CXCursor Cursor = clang_getTranslationUnitCursor(TranslationUnit);
>     CXSourceRange Range = clang_getCursorExtent(Cursor);
>
> This patch will cause the range to include the entire file from which the
> translation unit was created. I have a attached the fresh patch.
>
> Thanks,
> Clint
>
> On Sat, Mar 10, 2012 at 8:40 PM, Clint Caywood <clint at clintcaywood.com>wrote:
>
>> Hi folks,
>>
>> I'm new to this, but I've made a patch to libclang that allows it to
>> properly get the range for a translation unit cursor (which I needed for a
>> project I'm working on).  It's pretty straightforward.
>>
>> Thanks,
>> Clint
>>
>> Index: tools/libclang/CIndex.cpp
>> ===================================================================
>> --- tools/libclang/CIndex.cpp (revision 152526)
>> +++ tools/libclang/CIndex.cpp (working copy)
>> @@ -3869,6 +3869,15 @@
>>      return TU->mapRangeFromPreamble(Range);
>>    }
>>
>> +  if (C.kind == CXCursor_TranslationUnit) {
>> +    ASTUnit *TU = getCursorASTUnit(C);
>> +    FileID MainID = TU->getSourceManager().getMainFileID();
>> +    SourceLocation Start =
>> TU->getSourceManager().getLocForStartOfFile(MainID);
>> +    SourceLocation End =
>> TU->getSourceManager().getLocForEndOfFile(MainID);
>> +    SourceRange Range(Start, End);
>> +    return TU->mapRangeFromPreamble(Range);
>>
>
> The mapRangeFromPreamble() call is not necessary, since the range comes
> from the main FileID, not the preamble FileID.
>
> Can you elaborate on how you are using the this extent range later on your
> application ? Would it be useful to be able to get the extent of any file,
> not just the main one ?
>
> -Argyrios
>
> +  }
>> +
>>    if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) {
>>      Decl *D = cxcursor::getCursorDecl(C);
>>      if (!D)
>>
>
> <tUnitExtents.patch>_______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
You are correct about the call to mapRangeFromPreamble().

I'm using this to tokenize the entire contents of the main file, because
clang_tokenize() requires a range to be given. My particular application
would have no use for retrieving the extents of a file other than the main
one, and since there is no CXCursor representation of a file object, I find
it intuitive that the source range of a translation unit cursor would be
the entire range of the main file.

Clint
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120319/e3ae13b6/attachment.html>


More information about the cfe-commits mailing list