[clang] [clang][Tooling] Support relative directory in compilation database (PR #127734)

Keith Smiley via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 18 17:56:26 PST 2025


https://github.com/keith updated https://github.com/llvm/llvm-project/pull/127734

>From b8c294fcd30153842e1c0741fc623f45317618b1 Mon Sep 17 00:00:00 2001
From: Keith Smiley <keithbsmiley at gmail.com>
Date: Wed, 19 Feb 2025 01:54:42 +0000
Subject: [PATCH] [clang][Tooling] Support relative directory in compilation
 database

This allows you to use `"directory": ".",` in `compile_commands.json`
and have it be understood for file lookup by `clangd`.
---
 clang/lib/Tooling/JSONCompilationDatabase.cpp |  1 +
 .../Tooling/CompilationDatabaseTest.cpp       | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/clang/lib/Tooling/JSONCompilationDatabase.cpp b/clang/lib/Tooling/JSONCompilationDatabase.cpp
index 5ecba5dfece3d..625ac034d639a 100644
--- a/clang/lib/Tooling/JSONCompilationDatabase.cpp
+++ b/clang/lib/Tooling/JSONCompilationDatabase.cpp
@@ -419,6 +419,7 @@ bool JSONCompilationDatabase::parse(std::string &ErrorMessage) {
     if (llvm::sys::path::is_relative(FileName)) {
       SmallString<8> DirectoryStorage;
       SmallString<128> AbsolutePath(Directory->getValue(DirectoryStorage));
+      llvm::sys::fs::make_absolute(AbsolutePath);
       llvm::sys::path::append(AbsolutePath, FileName);
       llvm::sys::path::native(AbsolutePath, NativeFilePath);
     } else {
diff --git a/clang/unittests/Tooling/CompilationDatabaseTest.cpp b/clang/unittests/Tooling/CompilationDatabaseTest.cpp
index 2032b13726c45..0221d6a3c7177 100644
--- a/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ b/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -399,6 +399,32 @@ TEST(findCompileArgsInJsonDatabase, FindsEntry) {
   EXPECT_EQ("command4", FoundCommand.CommandLine[0]) << ErrorMessage;
 }
 
+TEST(findCompileArgsInJsonDatabase, FindsEntryRelativeDirectory) {
+  StringRef Directory(".");
+  StringRef FileName("file");
+  StringRef Command("command");
+  std::string JsonDatabase = "[";
+  JsonDatabase +=
+      ("{\"directory\":\"" + Directory + "\"," + "\"command\":\"" + Command +
+       "\","
+       "\"file\":\"" +
+       FileName + "\"}")
+          .str();
+  JsonDatabase += "]";
+
+  SmallString<256> Result;
+  llvm::sys::fs::current_path(Result);
+  llvm::sys::path::append(Result, FileName);
+
+  std::string ErrorMessage;
+  CompileCommand FoundCommand =
+      findCompileArgsInJsonDatabase(Result, JsonDatabase, ErrorMessage);
+
+  EXPECT_EQ(".", FoundCommand.Directory) << ErrorMessage;
+  ASSERT_EQ(1u, FoundCommand.CommandLine.size()) << ErrorMessage;
+  EXPECT_EQ("command", FoundCommand.CommandLine[0]) << ErrorMessage;
+}
+
 TEST(findCompileArgsInJsonDatabase, ParsesCompilerWrappers) {
   std::vector<std::pair<std::string, std::string>> Cases = {
       {"distcc gcc foo.c", "gcc foo.c"},



More information about the cfe-commits mailing list