Hi Argyrios, On Mon, Mar 19, 2012 at 4:35 PM, Argyrios Kyrtzidis <[email protected]>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 <[email protected]>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 > [email protected] > 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
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
