Browse Source

Fixed the include path problem #321. (the test case for C++ may be necessary.)

pull/395/head
ebifrier 12 years ago committed by Joao Matos
parent
commit
08994b0408
  1. 41
      src/CppParser/AST.cpp

41
src/CppParser/AST.cpp

@ -9,14 +9,38 @@ @@ -9,14 +9,38 @@
#include <algorithm>
#include <string>
#include <vector>
#include <llvm/Support/Path.h>
// copy from widenPath ('llvm/lib/Support/Windows/Path.inc')
static std::string normalizePath(const std::string & File) {
llvm::SmallString<2 * 128> Result;
for (llvm::sys::path::const_iterator I = llvm::sys::path::begin(File),
E = llvm::sys::path::end(File);
I != E; ++I) {
if (I->size() == 1 && *I == ".")
continue;
if (I->size() == 2 && *I == "..")
llvm::sys::path::remove_filename(Result);
else
llvm::sys::path::append(Result, *I);
}
#ifdef _WIN32
// Clean up the file path.
std::replace(Result.begin(), Result.end(), '/', '\\');
#endif
return Result.c_str();
}
template<typename T>
static std::vector<T> split(const T & str, const T & delimiters) {
std::vector<T> v;
if (str.length() == 0) {
v.push_back(str);
return v;
}
if (str.length() == 0) {
v.push_back(str);
return v;
}
typename T::size_type start = 0;
auto pos = str.find_first_of(delimiters, start);
while(pos != T::npos) {
@ -626,21 +650,18 @@ ASTContext::ASTContext() {} @@ -626,21 +650,18 @@ ASTContext::ASTContext() {}
TranslationUnit* ASTContext::FindOrCreateModule(std::string File)
{
#ifdef _WIN32
// Clean up the file path.
std::replace(File.begin(), File.end(), '/', '\\');
#endif
auto normalizedFile = normalizePath(File);
auto existingUnit = std::find_if(TranslationUnits.begin(),
TranslationUnits.end(), [&](TranslationUnit* unit) {
return unit && unit->FileName == File;
return unit && unit->FileName == normalizedFile;
});
if (existingUnit != TranslationUnits.end())
return *existingUnit;
auto unit = new TranslationUnit();
unit->FileName = File;
unit->FileName = normalizedFile;
TranslationUnits.push_back(unit);
return unit;

Loading…
Cancel
Save