Patch for LineTableInfo to use FileID instead of int for file references

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 ...'

Thank you!


clang-3.1-LineTableInfo-FileID.patch (7.26 KB)

Committed as r158211, thanks!

  - Doug