Stopgap for unicode chars in filename strings

Such filenames still can't be matched against, but at least we won't throw an
exception when it happens.

Fixes #279, relevant to #278
This commit is contained in:
Strahinja Val Markovic 2013-04-27 10:54:28 -07:00
parent 440e3b6f38
commit 67e4495273
3 changed files with 69 additions and 4 deletions

View File

@ -21,6 +21,8 @@
#include "Utils.h"
#include <boost/thread/locks.hpp>
#include <boost/algorithm/string.hpp>
#include <locale>
#ifdef USE_CLANG_COMPLETER
# include "ClangCompleter/CompletionData.h"
@ -28,6 +30,9 @@
namespace YouCompleteMe {
using boost::all;
using boost::is_print;
boost::mutex CandidateRepository::singleton_mutex_;
CandidateRepository *CandidateRepository::instance_ = NULL;
@ -58,12 +63,18 @@ std::vector< const Candidate * > CandidateRepository::GetCandidatesForStrings(
boost::lock_guard< boost::mutex > locker( holder_mutex_ );
foreach ( const std::string & candidate_text, strings ) {
const Candidate *&candidate = GetValueElseInsert( candidate_holder_,
candidate_text,
NULL );
const std::string &validated_candidate_text =
all( candidate_text, is_print( std::locale::classic() ) ) ?
candidate_text :
empty_;
const Candidate *&candidate = GetValueElseInsert(
candidate_holder_,
validated_candidate_text,
NULL );
if ( !candidate )
candidate = new Candidate( candidate_text );
candidate = new Candidate( validated_candidate_text );
candidates.push_back( candidate );
}

View File

@ -56,6 +56,8 @@ private:
static boost::mutex singleton_mutex_;
static CandidateRepository *instance_;
const std::string empty_;
// This data structure owns all the Candidate pointers
CandidateHolder candidate_holder_;
};

View File

@ -0,0 +1,52 @@
// Copyright (C) 2011, 2012 Strahinja Val Markovic <val@markovic.io>
//
// 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 <http://www.gnu.org/licenses/>.
#include <gtest/gtest.h>
#include "CandidateRepository.h"
#include "Candidate.h"
#include "Result.h"
namespace YouCompleteMe {
TEST( CandidateRepositoryTest, EmptyCandidatesForUnicode ) {
std::vector< std::string > inputs;
inputs.push_back( "fooδιακριτικός" );
inputs.push_back( "fooδιακός" );
CandidateRepository& repo = CandidateRepository::Instance();
std::vector< const Candidate* > candidates =
repo.GetCandidatesForStrings( inputs );
EXPECT_EQ( "", candidates[ 0 ]->Text() );
EXPECT_EQ( "", candidates[ 1 ]->Text() );
}
TEST( CandidateRepositoryTest, EmptyCandidatesForNonPrintable ) {
std::vector< std::string > inputs;
inputs.push_back( "\x01\x05\x0a\x15" );
CandidateRepository& repo = CandidateRepository::Instance();
std::vector< const Candidate* > candidates =
repo.GetCandidatesForStrings( inputs );
EXPECT_EQ( "", candidates[ 0 ]->Text() );
}
} // namespace YouCompleteMe