[clang-tools-extra] [clangd] Store full decl/def range with symbol locations (PR #118102)

2024-12-05 Thread Christian Kandeler via cfe-commits

https://github.com/ckandeler updated 
https://github.com/llvm/llvm-project/pull/118102

>From c44237813fb3357dee3f7d17048a7178e67a2422 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Wed, 27 Nov 2024 13:47:32 +0100
Subject: [PATCH] [clangd] Store full decl/def range with symbol locations

Apart from fixing the linked issue, this is also necessary
for supporting LSP's LocationLink feature and for finding
proper insertion locations in the DefineOutline tweak.
Memory consumption of the background index grows by about ~2.5%.

Closes https://github.com/clangd/clangd/issues/59
---
 clang-tools-extra/clangd/CodeComplete.cpp |   4 +-
 clang-tools-extra/clangd/FindSymbols.cpp  |  34 --
 clang-tools-extra/clangd/FindSymbols.h|   8 +-
 .../clangd/HeaderSourceSwitch.cpp |   4 +-
 clang-tools-extra/clangd/IncludeFixer.cpp |   6 +-
 clang-tools-extra/clangd/Quality.cpp  |   2 +-
 clang-tools-extra/clangd/XRefs.cpp|  65 ++-
 clang-tools-extra/clangd/index/FileIndex.cpp  |   6 +-
 clang-tools-extra/clangd/index/Index.h|   2 +-
 clang-tools-extra/clangd/index/Merge.cpp  |  13 ++-
 clang-tools-extra/clangd/index/Ref.h  |  11 +-
 .../clangd/index/Serialization.cpp|  34 --
 clang-tools-extra/clangd/index/StdLib.cpp |  12 +-
 clang-tools-extra/clangd/index/Symbol.h   |   8 +-
 .../clangd/index/SymbolCollector.cpp  |  89 +++
 .../clangd/index/SymbolCollector.h|   3 +-
 .../clangd/index/SymbolLocation.cpp   |  11 +-
 .../clangd/index/SymbolLocation.h | 103 +++---
 .../clangd/index/YAMLSerialization.cpp|  37 +--
 clang-tools-extra/clangd/index/dex/Dex.cpp|   4 +-
 clang-tools-extra/clangd/refactor/Rename.cpp  |   4 +-
 .../clangd/test/Inputs/symbols.test.yaml  |  17 ++-
 .../index-serialization/Inputs/sample.idx | Bin 470 -> 496 bytes
 .../clangd/test/type-hierarchy-ext.test   |   8 +-
 .../clangd/test/type-hierarchy.test   |   8 +-
 .../clangd/unittests/BackgroundIndexTests.cpp |   4 +-
 .../clangd/unittests/CodeCompleteTests.cpp|  18 +--
 .../clangd/unittests/DexTests.cpp |   5 +-
 .../clangd/unittests/DiagnosticsTests.cpp |  13 ++-
 .../clangd/unittests/FileIndexTests.cpp   |  14 +--
 .../clangd/unittests/IndexTests.cpp   |  45 
 .../clangd/unittests/SerializationTests.cpp   |  23 +++-
 .../clangd/unittests/SymbolCollectorTests.cpp |  12 +-
 33 files changed, 388 insertions(+), 239 deletions(-)

diff --git a/clang-tools-extra/clangd/CodeComplete.cpp 
b/clang-tools-extra/clangd/CodeComplete.cpp
index 2c2d5f0b5ac924..04e4aa2d2d1ca9 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -418,7 +418,7 @@ struct CodeCompletionBuilder {
 auto Inserted = [&](llvm::StringRef Header)
 -> llvm::Expected> {
   auto ResolvedDeclaring =
-  URI::resolve(C.IndexResult->CanonicalDeclaration.FileURI, FileName);
+  URI::resolve(C.IndexResult->CanonicalDeclaration.fileURI(), 
FileName);
   if (!ResolvedDeclaring)
 return ResolvedDeclaring.takeError();
   auto ResolvedInserted = toHeaderFile(Header, FileName);
@@ -451,7 +451,7 @@ struct CodeCompletionBuilder {
   } else
 log("Failed to generate include insertion edits for adding header "
 "(FileURI='{0}', IncludeHeader='{1}') into {2}: {3}",
-C.IndexResult->CanonicalDeclaration.FileURI, Inc.Header, FileName,
+C.IndexResult->CanonicalDeclaration.fileURI(), Inc.Header, 
FileName,
 ToInclude.takeError());
 }
 // Prefer includes that do not need edits (i.e. already exist).
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3f..646cb261309c80 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -54,9 +54,19 @@ bool approximateScopeMatch(llvm::StringRef Scope, 
llvm::StringRef Query) {
   return Query.empty();
 }
 
+Range indexToLSPRange(const SymbolPosition &SrcStart,
+  const SymbolPosition &SrcEnd) {
+  Position Start, End;
+  Start.line = SrcStart.line();
+  Start.character = SrcStart.column();
+  End.line = SrcEnd.line();
+  End.character = SrcEnd.column();
+  return {Start, End};
+}
+
 } // namespace
 
-llvm::Expected indexToLSPLocation(const SymbolLocation &Loc,
+llvm::Expected indexToLSPLocation(const SymbolNameLocation &Loc,
 llvm::StringRef TUPath) {
   auto Path = URI::resolve(Loc.FileURI, TUPath);
   if (!Path)
@@ -64,17 +74,21 @@ llvm::Expected indexToLSPLocation(const 
SymbolLocation &Loc,
  Path.takeError());
   Location L;
   L.uri = URIForFile::canonicalize(*Path, TUPath);
-  Position Start, End;
-  Start.line = Loc.Start.line();
-  Start.character = Loc.Start.column();
-  End

[clang-tools-extra] [clangd] Store full decl/def range with symbol locations (PR #118102)

2024-12-05 Thread Christian Kandeler via cfe-commits

https://github.com/ckandeler updated 
https://github.com/llvm/llvm-project/pull/118102

>From 188cbf1a7d3e83c0a558550351a373c1c3475d4e Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Wed, 27 Nov 2024 13:47:32 +0100
Subject: [PATCH] [clangd] Store full decl/def range with symbol locations

Apart from fixing the linked issue, this is also necessary
for supporting LSP's LocationLink feature and for finding
proper insertion locations in the DefineOutline tweak.
Memory consumption of the background index grows by about ~2.5%.

Closes https://github.com/clangd/clangd/issues/59
---
 clang-tools-extra/clangd/CodeComplete.cpp |   4 +-
 clang-tools-extra/clangd/FindSymbols.cpp  |  34 --
 clang-tools-extra/clangd/FindSymbols.h|   8 +-
 .../clangd/HeaderSourceSwitch.cpp |   4 +-
 clang-tools-extra/clangd/IncludeFixer.cpp |   6 +-
 clang-tools-extra/clangd/Quality.cpp  |   2 +-
 clang-tools-extra/clangd/XRefs.cpp|  65 ++-
 clang-tools-extra/clangd/index/FileIndex.cpp  |   6 +-
 clang-tools-extra/clangd/index/Merge.cpp  |  13 ++-
 clang-tools-extra/clangd/index/Ref.h  |  11 +-
 .../clangd/index/Serialization.cpp|  36 --
 clang-tools-extra/clangd/index/StdLib.cpp |  12 +-
 clang-tools-extra/clangd/index/Symbol.h   |   8 +-
 .../clangd/index/SymbolCollector.cpp  |  89 +++
 .../clangd/index/SymbolCollector.h|   3 +-
 .../clangd/index/SymbolLocation.cpp   |  11 +-
 .../clangd/index/SymbolLocation.h | 103 +++---
 .../clangd/index/YAMLSerialization.cpp|  37 +--
 clang-tools-extra/clangd/index/dex/Dex.cpp|   4 +-
 clang-tools-extra/clangd/refactor/Rename.cpp  |   4 +-
 .../clangd/test/Inputs/symbols.test.yaml  |  17 ++-
 .../index-serialization/Inputs/sample.idx | Bin 470 -> 496 bytes
 .../clangd/test/type-hierarchy-ext.test   |   8 +-
 .../clangd/test/type-hierarchy.test   |   8 +-
 .../clangd/unittests/BackgroundIndexTests.cpp |   4 +-
 .../clangd/unittests/CodeCompleteTests.cpp|  18 +--
 .../clangd/unittests/DexTests.cpp |   5 +-
 .../clangd/unittests/DiagnosticsTests.cpp |  13 ++-
 .../clangd/unittests/FileIndexTests.cpp   |  14 +--
 .../clangd/unittests/IndexTests.cpp   |  45 
 .../clangd/unittests/SerializationTests.cpp   |  23 +++-
 .../clangd/unittests/SymbolCollectorTests.cpp |  12 +-
 32 files changed, 388 insertions(+), 239 deletions(-)

diff --git a/clang-tools-extra/clangd/CodeComplete.cpp 
b/clang-tools-extra/clangd/CodeComplete.cpp
index 2c2d5f0b5ac924..04e4aa2d2d1ca9 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -418,7 +418,7 @@ struct CodeCompletionBuilder {
 auto Inserted = [&](llvm::StringRef Header)
 -> llvm::Expected> {
   auto ResolvedDeclaring =
-  URI::resolve(C.IndexResult->CanonicalDeclaration.FileURI, FileName);
+  URI::resolve(C.IndexResult->CanonicalDeclaration.fileURI(), 
FileName);
   if (!ResolvedDeclaring)
 return ResolvedDeclaring.takeError();
   auto ResolvedInserted = toHeaderFile(Header, FileName);
@@ -451,7 +451,7 @@ struct CodeCompletionBuilder {
   } else
 log("Failed to generate include insertion edits for adding header "
 "(FileURI='{0}', IncludeHeader='{1}') into {2}: {3}",
-C.IndexResult->CanonicalDeclaration.FileURI, Inc.Header, FileName,
+C.IndexResult->CanonicalDeclaration.fileURI(), Inc.Header, 
FileName,
 ToInclude.takeError());
 }
 // Prefer includes that do not need edits (i.e. already exist).
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3f..646cb261309c80 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -54,9 +54,19 @@ bool approximateScopeMatch(llvm::StringRef Scope, 
llvm::StringRef Query) {
   return Query.empty();
 }
 
+Range indexToLSPRange(const SymbolPosition &SrcStart,
+  const SymbolPosition &SrcEnd) {
+  Position Start, End;
+  Start.line = SrcStart.line();
+  Start.character = SrcStart.column();
+  End.line = SrcEnd.line();
+  End.character = SrcEnd.column();
+  return {Start, End};
+}
+
 } // namespace
 
-llvm::Expected indexToLSPLocation(const SymbolLocation &Loc,
+llvm::Expected indexToLSPLocation(const SymbolNameLocation &Loc,
 llvm::StringRef TUPath) {
   auto Path = URI::resolve(Loc.FileURI, TUPath);
   if (!Path)
@@ -64,17 +74,21 @@ llvm::Expected indexToLSPLocation(const 
SymbolLocation &Loc,
  Path.takeError());
   Location L;
   L.uri = URIForFile::canonicalize(*Path, TUPath);
-  Position Start, End;
-  Start.line = Loc.Start.line();
-  Start.character = Loc.Start.column();
-  End.line = Loc.End.line();
-  End.character = Loc.End.colum

[clang-tools-extra] [clangd] Store full decl/def range with symbol locations (PR #118102)

2024-11-29 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clangd

Author: Christian Kandeler (ckandeler)


Changes

Apart from fixing the linked issue, this is also necessary for supporting LSP's 
LocationLink feature and for finding proper insertion locations in the 
DefineOutline tweak. Memory consumption of the background index grows by about 
~2.5%.

Closes https://github.com/clangd/clangd/issues/59

---

Patch is 69.37 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/118102.diff


32 Files Affected:

- (modified) clang-tools-extra/clangd/CodeComplete.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/FindSymbols.cpp (+24-10) 
- (modified) clang-tools-extra/clangd/FindSymbols.h (+5-3) 
- (modified) clang-tools-extra/clangd/HeaderSourceSwitch.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/IncludeFixer.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/Quality.cpp (+1-1) 
- (modified) clang-tools-extra/clangd/XRefs.cpp (+35-30) 
- (modified) clang-tools-extra/clangd/index/FileIndex.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/index/Merge.cpp (+7-6) 
- (modified) clang-tools-extra/clangd/index/Ref.h (+4-7) 
- (modified) clang-tools-extra/clangd/index/Serialization.cpp (+28-8) 
- (modified) clang-tools-extra/clangd/index/StdLib.cpp (+6-6) 
- (modified) clang-tools-extra/clangd/index/Symbol.h (+4-4) 
- (modified) clang-tools-extra/clangd/index/SymbolCollector.cpp (+68-21) 
- (modified) clang-tools-extra/clangd/index/SymbolCollector.h (+2-1) 
- (modified) clang-tools-extra/clangd/index/SymbolLocation.cpp (+6-5) 
- (modified) clang-tools-extra/clangd/index/SymbolLocation.h (+62-41) 
- (modified) clang-tools-extra/clangd/index/YAMLSerialization.cpp (+25-12) 
- (modified) clang-tools-extra/clangd/index/dex/Dex.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/refactor/Rename.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/test/Inputs/symbols.test.yaml (+12-5) 
- (modified) 
clang-tools-extra/clangd/test/index-serialization/Inputs/sample.idx () 
- (modified) clang-tools-extra/clangd/test/type-hierarchy-ext.test (+4-4) 
- (modified) clang-tools-extra/clangd/test/type-hierarchy.test (+4-4) 
- (modified) clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp (+9-9) 
- (modified) clang-tools-extra/clangd/unittests/DexTests.cpp (+3-2) 
- (modified) clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp (+7-6) 
- (modified) clang-tools-extra/clangd/unittests/FileIndexTests.cpp (+7-7) 
- (modified) clang-tools-extra/clangd/unittests/IndexTests.cpp (+23-22) 
- (modified) clang-tools-extra/clangd/unittests/SerializationTests.cpp (+19-4) 
- (modified) clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp (+7-5) 


``diff
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp 
b/clang-tools-extra/clangd/CodeComplete.cpp
index 2c2d5f0b5ac924..04e4aa2d2d1ca9 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -418,7 +418,7 @@ struct CodeCompletionBuilder {
 auto Inserted = [&](llvm::StringRef Header)
 -> llvm::Expected> {
   auto ResolvedDeclaring =
-  URI::resolve(C.IndexResult->CanonicalDeclaration.FileURI, FileName);
+  URI::resolve(C.IndexResult->CanonicalDeclaration.fileURI(), 
FileName);
   if (!ResolvedDeclaring)
 return ResolvedDeclaring.takeError();
   auto ResolvedInserted = toHeaderFile(Header, FileName);
@@ -451,7 +451,7 @@ struct CodeCompletionBuilder {
   } else
 log("Failed to generate include insertion edits for adding header "
 "(FileURI='{0}', IncludeHeader='{1}') into {2}: {3}",
-C.IndexResult->CanonicalDeclaration.FileURI, Inc.Header, FileName,
+C.IndexResult->CanonicalDeclaration.fileURI(), Inc.Header, 
FileName,
 ToInclude.takeError());
 }
 // Prefer includes that do not need edits (i.e. already exist).
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3f..646cb261309c80 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -54,9 +54,19 @@ bool approximateScopeMatch(llvm::StringRef Scope, 
llvm::StringRef Query) {
   return Query.empty();
 }
 
+Range indexToLSPRange(const SymbolPosition &SrcStart,
+  const SymbolPosition &SrcEnd) {
+  Position Start, End;
+  Start.line = SrcStart.line();
+  Start.character = SrcStart.column();
+  End.line = SrcEnd.line();
+  End.character = SrcEnd.column();
+  return {Start, End};
+}
+
 } // namespace
 
-llvm::Expected indexToLSPLocation(const SymbolLocation &Loc,
+llvm::Expected indexToLSPLocation(const SymbolNameLocation &Loc,
 llvm::StringRef TUPath) {
   auto Path = URI::resolve(Loc.FileURI, TUPath);
   if (!Path)
@@ -64,17 +74,21 @@ llvm::Expected indexToLSPLocation(const 
SymbolLocation &Loc

[clang-tools-extra] [clangd] Store full decl/def range with symbol locations (PR #118102)

2024-11-29 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-tools-extra

Author: Christian Kandeler (ckandeler)


Changes

Apart from fixing the linked issue, this is also necessary for supporting LSP's 
LocationLink feature and for finding proper insertion locations in the 
DefineOutline tweak. Memory consumption of the background index grows by about 
~2.5%.

Closes https://github.com/clangd/clangd/issues/59

---

Patch is 69.37 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/118102.diff


32 Files Affected:

- (modified) clang-tools-extra/clangd/CodeComplete.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/FindSymbols.cpp (+24-10) 
- (modified) clang-tools-extra/clangd/FindSymbols.h (+5-3) 
- (modified) clang-tools-extra/clangd/HeaderSourceSwitch.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/IncludeFixer.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/Quality.cpp (+1-1) 
- (modified) clang-tools-extra/clangd/XRefs.cpp (+35-30) 
- (modified) clang-tools-extra/clangd/index/FileIndex.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/index/Merge.cpp (+7-6) 
- (modified) clang-tools-extra/clangd/index/Ref.h (+4-7) 
- (modified) clang-tools-extra/clangd/index/Serialization.cpp (+28-8) 
- (modified) clang-tools-extra/clangd/index/StdLib.cpp (+6-6) 
- (modified) clang-tools-extra/clangd/index/Symbol.h (+4-4) 
- (modified) clang-tools-extra/clangd/index/SymbolCollector.cpp (+68-21) 
- (modified) clang-tools-extra/clangd/index/SymbolCollector.h (+2-1) 
- (modified) clang-tools-extra/clangd/index/SymbolLocation.cpp (+6-5) 
- (modified) clang-tools-extra/clangd/index/SymbolLocation.h (+62-41) 
- (modified) clang-tools-extra/clangd/index/YAMLSerialization.cpp (+25-12) 
- (modified) clang-tools-extra/clangd/index/dex/Dex.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/refactor/Rename.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/test/Inputs/symbols.test.yaml (+12-5) 
- (modified) 
clang-tools-extra/clangd/test/index-serialization/Inputs/sample.idx () 
- (modified) clang-tools-extra/clangd/test/type-hierarchy-ext.test (+4-4) 
- (modified) clang-tools-extra/clangd/test/type-hierarchy.test (+4-4) 
- (modified) clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp (+9-9) 
- (modified) clang-tools-extra/clangd/unittests/DexTests.cpp (+3-2) 
- (modified) clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp (+7-6) 
- (modified) clang-tools-extra/clangd/unittests/FileIndexTests.cpp (+7-7) 
- (modified) clang-tools-extra/clangd/unittests/IndexTests.cpp (+23-22) 
- (modified) clang-tools-extra/clangd/unittests/SerializationTests.cpp (+19-4) 
- (modified) clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp (+7-5) 


``diff
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp 
b/clang-tools-extra/clangd/CodeComplete.cpp
index 2c2d5f0b5ac924..04e4aa2d2d1ca9 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -418,7 +418,7 @@ struct CodeCompletionBuilder {
 auto Inserted = [&](llvm::StringRef Header)
 -> llvm::Expected> {
   auto ResolvedDeclaring =
-  URI::resolve(C.IndexResult->CanonicalDeclaration.FileURI, FileName);
+  URI::resolve(C.IndexResult->CanonicalDeclaration.fileURI(), 
FileName);
   if (!ResolvedDeclaring)
 return ResolvedDeclaring.takeError();
   auto ResolvedInserted = toHeaderFile(Header, FileName);
@@ -451,7 +451,7 @@ struct CodeCompletionBuilder {
   } else
 log("Failed to generate include insertion edits for adding header "
 "(FileURI='{0}', IncludeHeader='{1}') into {2}: {3}",
-C.IndexResult->CanonicalDeclaration.FileURI, Inc.Header, FileName,
+C.IndexResult->CanonicalDeclaration.fileURI(), Inc.Header, 
FileName,
 ToInclude.takeError());
 }
 // Prefer includes that do not need edits (i.e. already exist).
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3f..646cb261309c80 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -54,9 +54,19 @@ bool approximateScopeMatch(llvm::StringRef Scope, 
llvm::StringRef Query) {
   return Query.empty();
 }
 
+Range indexToLSPRange(const SymbolPosition &SrcStart,
+  const SymbolPosition &SrcEnd) {
+  Position Start, End;
+  Start.line = SrcStart.line();
+  Start.character = SrcStart.column();
+  End.line = SrcEnd.line();
+  End.character = SrcEnd.column();
+  return {Start, End};
+}
+
 } // namespace
 
-llvm::Expected indexToLSPLocation(const SymbolLocation &Loc,
+llvm::Expected indexToLSPLocation(const SymbolNameLocation &Loc,
 llvm::StringRef TUPath) {
   auto Path = URI::resolve(Loc.FileURI, TUPath);
   if (!Path)
@@ -64,17 +74,21 @@ llvm::Expected indexToLSPLocation(const 
SymbolLo

[clang-tools-extra] [clangd] Store full decl/def range with symbol locations (PR #118102)

2024-11-29 Thread Christian Kandeler via cfe-commits

https://github.com/ckandeler created 
https://github.com/llvm/llvm-project/pull/118102

Apart from fixing the linked issue, this is also necessary for supporting LSP's 
LocationLink feature and for finding proper insertion locations in the 
DefineOutline tweak. Memory consumption of the background index grows by about 
~2.5%.

Closes https://github.com/clangd/clangd/issues/59

>From 99e7189c6f3c19e3aabeee56793f5683251ecb26 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Wed, 27 Nov 2024 13:47:32 +0100
Subject: [PATCH] [clangd] Store full decl/def range with symbol locations

Apart from fixing the linked issue, this is also necessary
for supporting LSP's LocationLink feature and for finding
proper insertion locations in the DefineOutline tweak.
Memory consumption of the background index grows by about ~2.5%.

Closes https://github.com/clangd/clangd/issues/59
---
 clang-tools-extra/clangd/CodeComplete.cpp |   4 +-
 clang-tools-extra/clangd/FindSymbols.cpp  |  34 --
 clang-tools-extra/clangd/FindSymbols.h|   8 +-
 .../clangd/HeaderSourceSwitch.cpp |   4 +-
 clang-tools-extra/clangd/IncludeFixer.cpp |   6 +-
 clang-tools-extra/clangd/Quality.cpp  |   2 +-
 clang-tools-extra/clangd/XRefs.cpp|  65 ++-
 clang-tools-extra/clangd/index/FileIndex.cpp  |   6 +-
 clang-tools-extra/clangd/index/Merge.cpp  |  13 ++-
 clang-tools-extra/clangd/index/Ref.h  |  11 +-
 .../clangd/index/Serialization.cpp|  36 --
 clang-tools-extra/clangd/index/StdLib.cpp |  12 +-
 clang-tools-extra/clangd/index/Symbol.h   |   8 +-
 .../clangd/index/SymbolCollector.cpp  |  89 +++
 .../clangd/index/SymbolCollector.h|   3 +-
 .../clangd/index/SymbolLocation.cpp   |  11 +-
 .../clangd/index/SymbolLocation.h | 103 +++---
 .../clangd/index/YAMLSerialization.cpp|  37 +--
 clang-tools-extra/clangd/index/dex/Dex.cpp|   4 +-
 clang-tools-extra/clangd/refactor/Rename.cpp  |   4 +-
 .../clangd/test/Inputs/symbols.test.yaml  |  17 ++-
 .../index-serialization/Inputs/sample.idx | Bin 470 -> 496 bytes
 .../clangd/test/type-hierarchy-ext.test   |   8 +-
 .../clangd/test/type-hierarchy.test   |   8 +-
 .../clangd/unittests/BackgroundIndexTests.cpp |   4 +-
 .../clangd/unittests/CodeCompleteTests.cpp|  18 +--
 .../clangd/unittests/DexTests.cpp |   5 +-
 .../clangd/unittests/DiagnosticsTests.cpp |  13 ++-
 .../clangd/unittests/FileIndexTests.cpp   |  14 +--
 .../clangd/unittests/IndexTests.cpp   |  45 
 .../clangd/unittests/SerializationTests.cpp   |  23 +++-
 .../clangd/unittests/SymbolCollectorTests.cpp |  12 +-
 32 files changed, 388 insertions(+), 239 deletions(-)

diff --git a/clang-tools-extra/clangd/CodeComplete.cpp 
b/clang-tools-extra/clangd/CodeComplete.cpp
index 2c2d5f0b5ac924..04e4aa2d2d1ca9 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -418,7 +418,7 @@ struct CodeCompletionBuilder {
 auto Inserted = [&](llvm::StringRef Header)
 -> llvm::Expected> {
   auto ResolvedDeclaring =
-  URI::resolve(C.IndexResult->CanonicalDeclaration.FileURI, FileName);
+  URI::resolve(C.IndexResult->CanonicalDeclaration.fileURI(), 
FileName);
   if (!ResolvedDeclaring)
 return ResolvedDeclaring.takeError();
   auto ResolvedInserted = toHeaderFile(Header, FileName);
@@ -451,7 +451,7 @@ struct CodeCompletionBuilder {
   } else
 log("Failed to generate include insertion edits for adding header "
 "(FileURI='{0}', IncludeHeader='{1}') into {2}: {3}",
-C.IndexResult->CanonicalDeclaration.FileURI, Inc.Header, FileName,
+C.IndexResult->CanonicalDeclaration.fileURI(), Inc.Header, 
FileName,
 ToInclude.takeError());
 }
 // Prefer includes that do not need edits (i.e. already exist).
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3f..646cb261309c80 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -54,9 +54,19 @@ bool approximateScopeMatch(llvm::StringRef Scope, 
llvm::StringRef Query) {
   return Query.empty();
 }
 
+Range indexToLSPRange(const SymbolPosition &SrcStart,
+  const SymbolPosition &SrcEnd) {
+  Position Start, End;
+  Start.line = SrcStart.line();
+  Start.character = SrcStart.column();
+  End.line = SrcEnd.line();
+  End.character = SrcEnd.column();
+  return {Start, End};
+}
+
 } // namespace
 
-llvm::Expected indexToLSPLocation(const SymbolLocation &Loc,
+llvm::Expected indexToLSPLocation(const SymbolNameLocation &Loc,
 llvm::StringRef TUPath) {
   auto Path = URI::resolve(Loc.FileURI, TUPath);
   if (!Path)
@@ -64,17 +74,21 @@ llvm::Expected indexToLSPLocation(c