On May 25, 2012, at 9:17 AM, Tom Honermann wrote:

> I recently needed to write code to iterate over preprocessing line control 
> directives, identify the originating source file for the directive, and then 
> lookup details for the originating source file.
> 
> LineTableInfo has begin() and end() methods to iterate over the set of source 
> file IDs and retrieve the vector of line control directives in each.  The 
> returned iterator (iter) is 'std::map<int, std::vector<LineEntry> 
> >::iterator' where the int (iter->first) corresponds to FileID::ID.
> 
> The FileID class restricts creating instances with arbitrary IDs to a few 
> friend classes (SourceManager, ASTWriter, ASTReader), so a user iterating 
> over the map held by LineTableInfo is unable to create a FileID instance with 
> an ID field corresponding to the 'int' key value from the map.  This prevents 
> calling methods like SourceManager::getSLocEntry().  To work around this, I 
> had to implement code to mimic the getSLocEntryByID() and 
> getLoadedSLocEntryByID() private methods of SourceManager in order to 
> retrieve the corresponding SLocEntry.
> 
> The attached patch modifies LineTableInfo to use FileID instead of an int 
> corresponding to a FileID::ID as the key value for its map, modifies other 
> methods similarly, and updates all users to pass FileID instances instead of 
> int.  In all cases, users already had a FileID instance and were passing 
> FileID.ID anyway.
> 
> The patch was produced with 'diff -rupN <orig> <modified>' where orig 
> corresponds to the Clang 3.1 final release.  Apply the patch in the Clang 
> root directory with 'patch -p1 ...'


Committed as r158211, thanks!

        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to