Adding new candidates is now faster; + more
Also fixed a memory leak and started work on adding filepath-aware candidate repos.
This commit is contained in:
parent
7627f87756
commit
ced1d0ad5a
@ -17,32 +17,50 @@
|
||||
|
||||
#include "standard.h"
|
||||
#include "Completer.h"
|
||||
#include "Utils.h"
|
||||
|
||||
namespace YouCompleteMe
|
||||
{
|
||||
|
||||
Completer::Completer( const Pylist &candidates )
|
||||
{
|
||||
AddCandidatesToDatabase( candidates );
|
||||
AddCandidatesToDatabase( candidates, "" );
|
||||
}
|
||||
|
||||
|
||||
Completer::Completer( const Pylist &candidates, const std::string &filepath)
|
||||
{
|
||||
AddCandidatesToDatabase( candidates, filepath );
|
||||
}
|
||||
|
||||
|
||||
Completer::~Completer()
|
||||
{
|
||||
foreach ( Candidate* candidate, candidates_ )
|
||||
foreach ( const CandidateRepository::value_type &pair,
|
||||
candidate_repository_ )
|
||||
{
|
||||
delete candidate;
|
||||
delete pair.second;
|
||||
}
|
||||
}
|
||||
|
||||
void Completer::AddCandidatesToDatabase(
|
||||
const Pylist &candidates )
|
||||
|
||||
void Completer::AddCandidatesToDatabase( const Pylist &candidates,
|
||||
const std::string &filepath )
|
||||
{
|
||||
std::string candidate_text;
|
||||
for (int i = 0; i < boost::python::len( candidates ); ++i)
|
||||
{
|
||||
candidates_.insert( new Candidate(
|
||||
boost::python::extract< std::string >( candidates[ i ] ) ) );
|
||||
candidate_text = boost::python::extract< std::string >( candidates[ i ] );
|
||||
Candidate *&candidate = GetValueElseInsert( candidate_repository_,
|
||||
candidate_text, NULL );
|
||||
if ( !candidate )
|
||||
{
|
||||
candidate = new Candidate( candidate_text );
|
||||
candidates_.insert( candidate );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Completer::GetCandidatesForQuery(
|
||||
const std::string &query, Pylist &candidates ) const
|
||||
@ -70,4 +88,5 @@ void Completer::GetCandidatesForQuery(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace YouCompleteMe
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
#include <boost/python.hpp>
|
||||
#include <boost/unordered_map.hpp>
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
@ -31,6 +32,7 @@ namespace YouCompleteMe
|
||||
{
|
||||
|
||||
typedef boost::python::list Pylist;
|
||||
typedef boost::unordered_map< std::string, Candidate* > CandidateRepository;
|
||||
|
||||
// class Completer : boost::noncopyable
|
||||
class Completer
|
||||
@ -38,9 +40,11 @@ class Completer
|
||||
public:
|
||||
Completer() {}
|
||||
Completer( const Pylist &candidates );
|
||||
Completer( const Pylist &candidates, const std::string &filepath );
|
||||
~Completer();
|
||||
|
||||
void AddCandidatesToDatabase( const Pylist &candidates );
|
||||
void AddCandidatesToDatabase( const Pylist &candidates,
|
||||
const std::string &filepath );
|
||||
|
||||
void GetCandidatesForQuery(
|
||||
const std::string &query, Pylist &candidates ) const;
|
||||
@ -54,6 +58,7 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
CandidateRepository candidate_repository_;
|
||||
std::set< Candidate*, CandidatePointerLess > candidates_;
|
||||
};
|
||||
|
||||
|
16
cpp/Utils.h
16
cpp/Utils.h
@ -27,6 +27,22 @@ namespace YouCompleteMe
|
||||
|
||||
bool AlmostEqual( double a, double b );
|
||||
|
||||
template <class Container, class Key>
|
||||
typename Container::mapped_type &
|
||||
GetValueElseInsert( Container &container,
|
||||
Key const& key,
|
||||
typename Container::mapped_type const& value )
|
||||
{
|
||||
return container.insert( typename Container::value_type( key, value ) )
|
||||
.first->second;
|
||||
}
|
||||
|
||||
template <class Container, class Key>
|
||||
bool ContainsKey( Container &container, Key const& key)
|
||||
{
|
||||
return container.find( key ) != container.end();
|
||||
}
|
||||
|
||||
} // namespace YouCompleteMe
|
||||
|
||||
#endif /* end of include guard: UTILS_H_KEPMRPBH */
|
||||
|
@ -35,10 +35,11 @@ class CompletionSystem( object ):
|
||||
|
||||
def AddBufferIdentifiers( self ):
|
||||
text = "\n".join( vim.current.buffer )
|
||||
text = RemoveCppComments( text )
|
||||
text = RemoveIdentFreeText( text )
|
||||
|
||||
idents = re.findall( self.pattern, text )
|
||||
self.completer.AddCandidatesToDatabase( idents )
|
||||
filepath = vim.eval( "expand('%:p')" )
|
||||
self.completer.AddCandidatesToDatabase( idents, filepath )
|
||||
|
||||
def CurrentColumn():
|
||||
# vim's columns start at 1 while vim.current.line columns start at 0
|
||||
@ -74,7 +75,10 @@ def CurrentCursorText():
|
||||
def SanitizeQuery( query ):
|
||||
return query.strip()
|
||||
|
||||
def RemoveCppComments( text ):
|
||||
def RemoveIdentFreeText( text ):
|
||||
"""Removes commented-out code and code in quotes."""
|
||||
|
||||
# TODO: do we still need this sub-func?
|
||||
def replacer( match ):
|
||||
s = match.group( 0 )
|
||||
if s.startswith( '/' ):
|
||||
@ -83,7 +87,7 @@ def RemoveCppComments( text ):
|
||||
return s
|
||||
|
||||
pattern = re.compile(
|
||||
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
|
||||
r'//.*?$|#.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
|
||||
re.DOTALL | re.MULTILINE )
|
||||
|
||||
return re.sub( pattern, replacer, text )
|
||||
|
Loading…
Reference in New Issue
Block a user