[llvm-branch-commits] [clang] [clang][CodeComplete] Use HeuristicResolver to resolve pointee types (PR #121315)
Nathan Ridge via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Dec 29 19:05:40 PST 2024
https://github.com/HighCommander4 created https://github.com/llvm/llvm-project/pull/121315
Fixes https://github.com/clangd/clangd/issues/810
>From 5165ce906cb5ec9ecd913f69fc376b049ab803d6 Mon Sep 17 00:00:00 2001
From: Nathan Ridge <zeratul976 at hotmail.com>
Date: Thu, 26 Dec 2024 20:59:06 -0500
Subject: [PATCH] [clang][CodeComplete] Use HeuristicResolver to resolve
pointee types
Fixes https://github.com/clangd/clangd/issues/810
---
clang/include/clang/Sema/SemaCodeCompletion.h | 2 ++
clang/lib/Sema/SemaCodeComplete.cpp | 15 ++++++++++-----
clang/test/CodeCompletion/member-access.cpp | 17 +++++++++++++++++
3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index 50409439389b06..e931596c215d31 100644
--- a/clang/include/clang/Sema/SemaCodeCompletion.h
+++ b/clang/include/clang/Sema/SemaCodeCompletion.h
@@ -23,6 +23,7 @@
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Designator.h"
+#include "clang/Sema/HeuristicResolver.h"
#include "clang/Sema/Ownership.h"
#include "clang/Sema/SemaBase.h"
#include "llvm/ADT/StringRef.h"
@@ -43,6 +44,7 @@ class SemaCodeCompletion : public SemaBase {
/// Code-completion consumer.
CodeCompleteConsumer *CodeCompleter;
+ HeuristicResolver Resolver;
/// Describes the context in which code completion occurs.
enum ParserCompletionContext {
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 1f398bb004fa30..2b07f20da82683 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -34,6 +34,7 @@
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Designator.h"
+#include "clang/Sema/HeuristicResolver.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Overload.h"
#include "clang/Sema/ParsedAttr.h"
@@ -5862,8 +5863,10 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
enum CodeCompletionContext::Kind contextKind;
if (IsArrow) {
- if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>())
- ConvertedBaseType = Ptr->getPointeeType();
+ if (const auto *PointeeType =
+ Resolver.getPointeeType(ConvertedBaseType.getTypePtr())) {
+ ConvertedBaseType = QualType(PointeeType, 0);
+ }
}
if (IsArrow) {
@@ -5900,8 +5903,9 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
ExprValueKind BaseKind = Base->getValueKind();
if (IsArrow) {
- if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
- BaseType = Ptr->getPointeeType();
+ if (const auto *PointeeType =
+ Resolver.getPointeeType(BaseType.getTypePtr())) {
+ BaseType = QualType(PointeeType, 0);
BaseKind = VK_LValue;
} else if (BaseType->isObjCObjectPointerType() ||
BaseType->isTemplateTypeParmType()) {
@@ -10473,4 +10477,5 @@ void SemaCodeCompletion::GatherGlobalCodeCompletions(
SemaCodeCompletion::SemaCodeCompletion(Sema &S,
CodeCompleteConsumer *CompletionConsumer)
- : SemaBase(S), CodeCompleter(CompletionConsumer) {}
+ : SemaBase(S), CodeCompleter(CompletionConsumer),
+ Resolver(S.getASTContext()) {}
diff --git a/clang/test/CodeCompletion/member-access.cpp b/clang/test/CodeCompletion/member-access.cpp
index 912f269db6c1ac..ab6dc69bf2923d 100644
--- a/clang/test/CodeCompletion/member-access.cpp
+++ b/clang/test/CodeCompletion/member-access.cpp
@@ -384,3 +384,20 @@ void Foo() {
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:382:5 %s -o - | FileCheck -check-prefix=CHECK-DEREF-DEPENDENT %s
// CHECK-DEREF-DEPENDENT: [#void#]Add()
}
+
+namespace dependent_smart_pointer {
+template <typename T>
+struct smart_pointer {
+ T* operator->();
+};
+
+template <typename T>
+struct node {
+ smart_pointer<node<T>> next;
+ void foo() {
+ next->next;
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:398:11 %s -o - | FileCheck -check-prefix=CHECK-DEPENDENT-SMARTPTR %s
+ // CHECK-DEPENDENT-SMARTPTR: [#smart_pointer<node<T>>#]next
+ }
+};
+}
More information about the llvm-branch-commits
mailing list