Skip to content

Commit 1d23fb9

Browse files
[clang][CodeComplete] Use HeuristicResolver to resolve pointee types (#121315)
Fixes clangd/clangd#810
1 parent 8fad58a commit 1d23fb9

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

clang/include/clang/Sema/SemaCodeCompletion.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "clang/Sema/CodeCompleteConsumer.h"
2424
#include "clang/Sema/DeclSpec.h"
2525
#include "clang/Sema/Designator.h"
26+
#include "clang/Sema/HeuristicResolver.h"
2627
#include "clang/Sema/Ownership.h"
2728
#include "clang/Sema/SemaBase.h"
2829
#include "llvm/ADT/StringRef.h"
@@ -43,6 +44,7 @@ class SemaCodeCompletion : public SemaBase {
4344

4445
/// Code-completion consumer.
4546
CodeCompleteConsumer *CodeCompleter;
47+
HeuristicResolver Resolver;
4648

4749
/// Describes the context in which code completion occurs.
4850
enum ParserCompletionContext {

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "clang/Sema/CodeCompleteConsumer.h"
3535
#include "clang/Sema/DeclSpec.h"
3636
#include "clang/Sema/Designator.h"
37+
#include "clang/Sema/HeuristicResolver.h"
3738
#include "clang/Sema/Lookup.h"
3839
#include "clang/Sema/Overload.h"
3940
#include "clang/Sema/ParsedAttr.h"
@@ -5861,8 +5862,10 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
58615862
enum CodeCompletionContext::Kind contextKind;
58625863

58635864
if (IsArrow) {
5864-
if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>())
5865-
ConvertedBaseType = Ptr->getPointeeType();
5865+
if (QualType PointeeType = Resolver.getPointeeType(ConvertedBaseType);
5866+
!PointeeType.isNull()) {
5867+
ConvertedBaseType = PointeeType;
5868+
}
58665869
}
58675870

58685871
if (IsArrow) {
@@ -5899,8 +5902,9 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
58995902
ExprValueKind BaseKind = Base->getValueKind();
59005903

59015904
if (IsArrow) {
5902-
if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
5903-
BaseType = Ptr->getPointeeType();
5905+
if (QualType PointeeType = Resolver.getPointeeType(BaseType);
5906+
!PointeeType.isNull()) {
5907+
BaseType = PointeeType;
59045908
BaseKind = VK_LValue;
59055909
} else if (BaseType->isObjCObjectPointerType() ||
59065910
BaseType->isTemplateTypeParmType()) {
@@ -10472,4 +10476,5 @@ void SemaCodeCompletion::GatherGlobalCodeCompletions(
1047210476

1047310477
SemaCodeCompletion::SemaCodeCompletion(Sema &S,
1047410478
CodeCompleteConsumer *CompletionConsumer)
10475-
: SemaBase(S), CodeCompleter(CompletionConsumer) {}
10479+
: SemaBase(S), CodeCompleter(CompletionConsumer),
10480+
Resolver(S.getASTContext()) {}

clang/test/CodeCompletion/member-access.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,3 +384,20 @@ void Foo() {
384384
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:382:5 %s -o - | FileCheck -check-prefix=CHECK-DEREF-DEPENDENT %s
385385
// CHECK-DEREF-DEPENDENT: [#void#]Add()
386386
}
387+
388+
namespace dependent_smart_pointer {
389+
template <typename T>
390+
struct smart_pointer {
391+
T* operator->();
392+
};
393+
394+
template <typename T>
395+
struct node {
396+
smart_pointer<node<T>> next;
397+
void foo() {
398+
next->next;
399+
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:398:11 %s -o - | FileCheck -check-prefix=CHECK-DEPENDENT-SMARTPTR %s
400+
// CHECK-DEPENDENT-SMARTPTR: [#smart_pointer<node<T>>#]next
401+
}
402+
};
403+
}

0 commit comments

Comments
 (0)