From ae59131d3ef311fb4b1e50627c6457be00e60dc9 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Mon, 14 Nov 2022 18:55:19 +0100 Subject: [PATCH] [clang][Tooling] Make the filename behaviour consistent Dotdots were removed only when converting a relative path to absolute one. This patch makes the behaviour consistent for absolute file paths by removing them in that case as well. Also updates the documentation to mention the behaviour. Fixes https://github.com/clangd/clangd/issues/1317 Differential Revision: https://reviews.llvm.org/D137962 --- clang/lib/Tooling/JSONCompilationDatabase.cpp | 5 ++-- .../unittests/Tooling/CompilationDatabaseTest.cpp | 34 ++++++++++++++++------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/clang/lib/Tooling/JSONCompilationDatabase.cpp b/clang/lib/Tooling/JSONCompilationDatabase.cpp index 5e18d7a..158b9a5 100644 --- a/clang/lib/Tooling/JSONCompilationDatabase.cpp +++ b/clang/lib/Tooling/JSONCompilationDatabase.cpp @@ -419,14 +419,13 @@ bool JSONCompilationDatabase::parse(std::string &ErrorMessage) { SmallString<128> NativeFilePath; if (llvm::sys::path::is_relative(FileName)) { SmallString<8> DirectoryStorage; - SmallString<128> AbsolutePath( - Directory->getValue(DirectoryStorage)); + SmallString<128> AbsolutePath(Directory->getValue(DirectoryStorage)); llvm::sys::path::append(AbsolutePath, FileName); - llvm::sys::path::remove_dots(AbsolutePath, /*remove_dot_dot=*/ true); llvm::sys::path::native(AbsolutePath, NativeFilePath); } else { llvm::sys::path::native(FileName, NativeFilePath); } + llvm::sys::path::remove_dots(NativeFilePath, /*remove_dot_dot=*/true); auto Cmd = CompileCommandRef(Directory, File, *Command, Output); IndexByFile[NativeFilePath].push_back(Cmd); AllCommands.push_back(Cmd); diff --git a/clang/unittests/Tooling/CompilationDatabaseTest.cpp b/clang/unittests/Tooling/CompilationDatabaseTest.cpp index 3314ecd..89763f9 100644 --- a/clang/unittests/Tooling/CompilationDatabaseTest.cpp +++ b/clang/unittests/Tooling/CompilationDatabaseTest.cpp @@ -92,16 +92,32 @@ TEST(JSONCompilationDatabase, GetAllFiles) { expected_files.push_back(std::string(PathStorage.str())); llvm::sys::path::native("//net/file1", PathStorage); expected_files.push_back(std::string(PathStorage.str())); + llvm::sys::path::native("//net/dir/file3", PathStorage); + expected_files.push_back(std::string(PathStorage.str())); EXPECT_EQ(expected_files, - getAllFiles("[{\"directory\":\"//net/dir\"," - "\"command\":\"command\"," - "\"file\":\"file1\"}," - " {\"directory\":\"//net/dir\"," - "\"command\":\"command\"," - "\"file\":\"../file1\"}," - " {\"directory\":\"//net/dir\"," - "\"command\":\"command\"," - "\"file\":\"file2\"}]", + getAllFiles(R"json( + [ + { + "directory": "//net/dir", + "command": "command", + "file": "file1" + }, + { + "directory": "//net/dir", + "command": "command", + "file": "../file1" + }, + { + "directory": "//net/dir", + "command": "command", + "file": "file2" + }, + { + "directory": "//net/dir", + "command": "command", + "file": "//net/dir/foo/../file3" + } + ])json", ErrorMessage, JSONCommandLineSyntax::Gnu)) << ErrorMessage; } -- 2.7.4