diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2018-05-30 13:03:16 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2018-05-30 13:03:16 +0000 |
commit | df8e291ef94744780f813e244860326b5e628b18 (patch) | |
tree | 912a326e8bb6566c58015eef0977f6a19d182333 /lldb/unittests | |
parent | d8d5628834c7cda4a506a3c33105c8725b9b1762 (diff) | |
download | bcm5719-llvm-df8e291ef94744780f813e244860326b5e628b18.tar.gz bcm5719-llvm-df8e291ef94744780f813e244860326b5e628b18.zip |
[FileSpec] Re-implmenet removeLastPathComponent
When reading DBGSourcePathRemapping from a dSYM, we remove the last two
path components to make the source lookup more general. However, when
dealing with a relative path that has less than 2 components, we ended
up with an invalid (empty) FileSpec.
This patch changes the behavior of removeLastPathComponent to remove the
last path component, if possible. It does this by checking whether a
parent path exists, and if so using that as the new path. We rely
entirely on LLVM's path implementation to do the heavy lifting.
We now also return a boolean which indicates whether the operator was
successful or not.
Differential revision: https://reviews.llvm.org/D47495
rdar://37791687
llvm-svn: 333540
Diffstat (limited to 'lldb/unittests')
-rw-r--r-- | lldb/unittests/Utility/FileSpecTest.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lldb/unittests/Utility/FileSpecTest.cpp b/lldb/unittests/Utility/FileSpecTest.cpp index 03c9793fc15..2e02579797a 100644 --- a/lldb/unittests/Utility/FileSpecTest.cpp +++ b/lldb/unittests/Utility/FileSpecTest.cpp @@ -320,3 +320,44 @@ TEST(FileSpecTest, IsRelative) { } } +TEST(FileSpecTest, RemoveLastPathComponent) { + FileSpec fs_posix("/foo/bar/baz", false, FileSpec::Style::posix); + EXPECT_STREQ("/foo/bar/baz", fs_posix.GetCString()); + EXPECT_TRUE(fs_posix.RemoveLastPathComponent()); + EXPECT_STREQ("/foo/bar", fs_posix.GetCString()); + EXPECT_TRUE(fs_posix.RemoveLastPathComponent()); + EXPECT_STREQ("/foo", fs_posix.GetCString()); + EXPECT_TRUE(fs_posix.RemoveLastPathComponent()); + EXPECT_STREQ("/", fs_posix.GetCString()); + EXPECT_FALSE(fs_posix.RemoveLastPathComponent()); + EXPECT_STREQ("/", fs_posix.GetCString()); + + FileSpec fs_posix_relative("./foo/bar/baz", false, FileSpec::Style::posix); + EXPECT_STREQ("foo/bar/baz", fs_posix_relative.GetCString()); + EXPECT_TRUE(fs_posix_relative.RemoveLastPathComponent()); + EXPECT_STREQ("foo/bar", fs_posix_relative.GetCString()); + EXPECT_TRUE(fs_posix_relative.RemoveLastPathComponent()); + EXPECT_STREQ("foo", fs_posix_relative.GetCString()); + EXPECT_FALSE(fs_posix_relative.RemoveLastPathComponent()); + EXPECT_STREQ("foo", fs_posix_relative.GetCString()); + + FileSpec fs_posix_relative2("./", false, FileSpec::Style::posix); + EXPECT_STREQ(".", fs_posix_relative2.GetCString()); + EXPECT_FALSE(fs_posix_relative2.RemoveLastPathComponent()); + EXPECT_STREQ(".", fs_posix_relative2.GetCString()); + EXPECT_FALSE(fs_posix_relative.RemoveLastPathComponent()); + EXPECT_STREQ(".", fs_posix_relative2.GetCString()); + + FileSpec fs_windows("C:\\foo\\bar\\baz", false, FileSpec::Style::windows); + EXPECT_STREQ("C:\\foo\\bar\\baz", fs_windows.GetCString()); + EXPECT_TRUE(fs_windows.RemoveLastPathComponent()); + EXPECT_STREQ("C:\\foo\\bar", fs_windows.GetCString()); + EXPECT_TRUE(fs_windows.RemoveLastPathComponent()); + EXPECT_STREQ("C:\\foo", fs_windows.GetCString()); + EXPECT_TRUE(fs_windows.RemoveLastPathComponent()); + EXPECT_STREQ("C:\\", fs_windows.GetCString()); + EXPECT_TRUE(fs_windows.RemoveLastPathComponent()); + EXPECT_STREQ("C:", fs_windows.GetCString()); + EXPECT_FALSE(fs_windows.RemoveLastPathComponent()); + EXPECT_STREQ("C:", fs_windows.GetCString()); +} |