}
return true;
}
+\r
+std::string normalize(StringRef Path) {\r
+ SmallString<128> Buffer;\r
+ llvm::sys::path::const_iterator B = llvm::sys::path::begin(Path),\r
+ E = llvm::sys::path::end(Path);\r
+ while (B != E) {\r
+ if (B->compare(".") == 0) {\r
+ }\r
+ else if (B->compare("..") == 0)\r
+ llvm::sys::path::remove_filename(Buffer);\r
+ else\r
+ llvm::sys::path::append(Buffer, *B);\r
+ ++B;\r
+ }\r
+ if (Path.endswith("/") || Path.endswith("\\"))\r
+ Buffer.append(1, Path.back());\r
+ return Buffer.c_str();\r
+}\r
// Convert header path to canonical form.
// The canonical form is basically just use forward slashes, and remove "./".
// \param FilePath The file path, relative to the module map directory.
// \returns The file path in canonical form.
std::string ModularizeUtilities::getCanonicalPath(StringRef FilePath) {
- std::string Tmp(FilePath);
+ std::string Tmp(normalize(FilePath));
std::replace(Tmp.begin(), Tmp.end(), '\\', '/');
StringRef Tmp2(Tmp);
if (Tmp2.startswith("./"))
#include "llvm/ADT/SmallSet.h"
#include "llvm/Support/StringPool.h"
#include "llvm/Support/raw_ostream.h"
+#include "ModularizeUtilities.h"
namespace Modularize {
// and block statement.
clang::FileID FileID = PP.getSourceManager().getFileID(BlockStartLoc);
std::string SourcePath = getSourceLocationFile(PP, BlockStartLoc);
+ SourcePath = ModularizeUtilities::getCanonicalPath(SourcePath);
HeaderHandle SourceHandle = findHeaderHandle(SourcePath);
- // FIXME: Go back and fix getSourceLocation to use a canonical form.
if (SourceHandle == -1)
return true;
int BlockStartLine, BlockStartColumn, BlockEndLine, BlockEndColumn;