trick/trick_source/codegen/Interface_Code_Gen/CommentSaver.hh
Alex Lin e1c1bbaccf Split CP up into components that can be called individually
Initial rough checkin that partially works for the ball sim.

refs #86
2015-07-16 15:36:36 -05:00

106 lines
4.0 KiB
C++

#ifndef COMMENTSAVER_HH
#define COMMENTSAVER_HH
#include <map>
#include <set>
#include <vector>
#include "clang/Lex/Preprocessor.h"
#include "clang/Frontend/CompilerInstance.h"
#include "HeaderSearchDirs.hh"
/**
This class is passed to the clang preprocessor as a comment handler. The class
saves the source locations of each comment found. Comments may be retrived by
file name and line number.
@author Alexander S. Lin
@date July 2012
*/
class CommentSaver : public clang::CommentHandler {
public:
CommentSaver( clang::CompilerInstance & in_ci , HeaderSearchDirs & in_hsd ) ;
/** Called by the PreProcessor when a comment is parsed. HandleComment saves
the comment indexed by file name and line number in the comment map
@param PP = the preprocessor (unused)
@param source_range = the bounding line and column of the comment
@param always false
*/
virtual bool HandleComment(clang::Preprocessor &PP, clang::SourceRange source_range) ;
/** Retrieves comments out of the comment map. Returns the full comment string
@param sr = clang::SourceRange type marking comment location.
@return std::string the last comment starting on that line, or empty string if none found
*/
std::string getComment( clang::SourceRange sr ) ;
/** Retrieves comments out of the comment map. Returns the full comment string
@param file_name = File name to search
@param line_no = line number to search
@return std::string the last comment starting on that line, or empty string if none found
*/
std::string getComment( std::string file_name , unsigned int line_no ) ;
/** Searches all comments found within the file_name parameter for a Trick header comment
@param file_name = File name to search
@return std::string a comment that matches the Trick header comment format
*/
std::string getTrickHeaderComment( std::string file_name ) ;
/** sets the flags for hasICGNo and hasICGNoComment
@param file_name = File name to search
*/
void getICGField( std::string file_name ) ;
/** Searches the Trick header comment for the ICG:(No) entry.
@param file_name = File name to search
@return true = ICG:(No) was found.
*/
bool hasICGNo( std::string file_name ) ;
/** Searches the Trick header comment for the ICG:(NoComment) entry.
@param file_name = File name to search
@return true = ICG:(NoComment) was found.
*/
bool hasICGNoComment( std::string file_name ) ;
/** Searches the Trick header comment for the ICG_EXCLUDE_TYPES field
@param file_name = File name to search
@return set of strings that list the type names to ignore.
*/
std::set< std::string > getIgnoreTypes( std::string file_name ) ;
/** Returns a vector of library dependencies from the Trick comment
@param file_name = File name to search
@return vector of library dependency strings
*/
std::vector< std::string > getLibraryDependencies( std::string file_name ) ;
private:
/** The compiler's source manager. Holds file/line info for everything. */
clang::CompilerInstance & ci ;
HeaderSearchDirs & hsd ;
/** Map of file name to ICG: (No) found */
std::map < std::string , bool > icg_no_found ;
/** Map of file name to ICG: (NoComment) found */
std::map < std::string , bool > icg_no_comment_found ;
/** All comments source locations indexed by file name then line number */
std::map < std::string , std::map < unsigned int , clang::SourceRange > > comment_map ;
/** Store Trick header comments so we don't have to look them up over and over */
std::map < std::string , std::string > trick_header_comments ;
} ;
#endif