// Copyright (C) 2011, 2012 Strahinja Val Markovic // // This file is part of YouCompleteMe. // // YouCompleteMe is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // YouCompleteMe is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with YouCompleteMe. If not, see . #ifndef CLANGCOMPLETE_H_WLKDU0ZV #define CLANGCOMPLETE_H_WLKDU0ZV #include #include #include typedef void *CXIndex; typedef struct CXTranslationUnitImpl *CXTranslationUnit; namespace YouCompleteMe { class CandidateRepository; struct UnsavedFile { UnsavedFile() : filename_( NULL ), contents_( NULL ), length_( 0 ) {} const char *filename_; const char *contents_; unsigned long length_; // We need this to be able to export this struct to Python via Boost.Python's // methods. I have no clue why, but it won't compile without it. // TODO: report this problem on the Boost bug tracker, the default equality // operator should be more than adequate here bool operator== ( const UnsavedFile &other ) const { return filename_ == other.filename_ && contents_ == other.contents_ && length_ == other.length_; } }; typedef boost::unordered_map< std::string, std::vector< std::string > > FlagsForFile; typedef boost::unordered_map< std::string, CXTranslationUnit > TranslationUnitForFilename; class ClangCompleter : boost::noncopyable { public: ClangCompleter(); ~ClangCompleter(); void SetGlobalCompileFlags( const std::vector< std::string > &flags ); void SetFileCompileFlags( const std::string &filename, const std::vector< std::string > &flags ); void UpdateTranslationUnit( const std::string &filename, const std::vector< UnsavedFile > &unsaved_files ); // TODO: rename this std::vector< std::string > CandidatesForLocationInFile( const std::string &query, const std::string &filename, int line, int column, const std::vector< UnsavedFile > &unsaved_files ); private: // caller takes ownership of translation unit CXTranslationUnit CreateTranslationUnit( const std::string &filename, const std::vector< UnsavedFile > &unsaved_files ); std::vector< const char* > ClangFlagsForFilename( const std::string &filename ); CXTranslationUnit GetTranslationUnitForFile( const std::string &filename, const std::vector< UnsavedFile > &unsaved_files ); std::vector< std::string > SortCandidatesForQuery( const std::string &query, const std::vector< std::string > &candidates ); ///////////////////////////// // PRIVATE MEMBER VARIABLES ///////////////////////////// CXIndex clang_index_; FlagsForFile flags_for_file_; TranslationUnitForFilename filename_to_translation_unit_; std::vector< std::string > global_flags_; CandidateRepository &candidate_repository_; }; } // namespace YouCompleteMe #endif /* end of include guard: CLANGCOMPLETE_H_WLKDU0ZV */