From 67e4495273ae4b3cf05c755b2f03a7a64acd5964 Mon Sep 17 00:00:00 2001 From: Strahinja Val Markovic Date: Sat, 27 Apr 2013 10:54:28 -0700 Subject: [PATCH] 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 --- cpp/ycm/CandidateRepository.cpp | 19 ++++++-- cpp/ycm/CandidateRepository.h | 2 + cpp/ycm/tests/CandidateRepository_test.cpp | 52 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 cpp/ycm/tests/CandidateRepository_test.cpp diff --git a/cpp/ycm/CandidateRepository.cpp b/cpp/ycm/CandidateRepository.cpp index fc2b6cfa..5b9aadd3 100644 --- a/cpp/ycm/CandidateRepository.cpp +++ b/cpp/ycm/CandidateRepository.cpp @@ -21,6 +21,8 @@ #include "Utils.h" #include +#include +#include #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 ); } diff --git a/cpp/ycm/CandidateRepository.h b/cpp/ycm/CandidateRepository.h index 3783bb20..0674cfc3 100644 --- a/cpp/ycm/CandidateRepository.h +++ b/cpp/ycm/CandidateRepository.h @@ -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_; }; diff --git a/cpp/ycm/tests/CandidateRepository_test.cpp b/cpp/ycm/tests/CandidateRepository_test.cpp new file mode 100644 index 00000000..488a6f0b --- /dev/null +++ b/cpp/ycm/tests/CandidateRepository_test.cpp @@ -0,0 +1,52 @@ +// 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 . + +#include +#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 +