Skip to content

Commit a2416f8

Browse files
Plumb a HeuristicResolver parameter into getAsRecordDec()
1 parent e920479 commit a2416f8

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ class FileNullabilityMap {
290290
/// parameter. This avoids updating the type on hot paths in the parser.
291291
class PreferredTypeBuilder {
292292
public:
293-
PreferredTypeBuilder(bool Enabled) : Enabled(Enabled) {}
293+
PreferredTypeBuilder(ASTContext *Ctx, bool Enabled)
294+
: Ctx(Ctx), Enabled(Enabled) {}
294295

295296
void enterCondition(Sema &S, SourceLocation Tok);
296297
void enterReturn(Sema &S, SourceLocation Tok);
@@ -336,6 +337,7 @@ class PreferredTypeBuilder {
336337
}
337338

338339
private:
340+
ASTContext *Ctx;
339341
bool Enabled;
340342
/// Start position of a token for which we store expected type.
341343
SourceLocation ExpectedLoc;

clang/lib/Parse/Parser.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ IdentifierInfo *Parser::getSEHExceptKeyword() {
5454
}
5555

5656
Parser::Parser(Preprocessor &pp, Sema &actions, bool skipFunctionBodies)
57-
: PP(pp), PreferredType(pp.isCodeCompletionEnabled()), Actions(actions),
58-
Diags(PP.getDiagnostics()), StackHandler(Diags),
57+
: PP(pp),
58+
PreferredType(&actions.getASTContext(), pp.isCodeCompletionEnabled()),
59+
Actions(actions), Diags(PP.getDiagnostics()), StackHandler(Diags),
5960
GreaterThanIsOperator(true), ColonIsSacred(false),
6061
InMessageExpression(false), TemplateParameterDepth(0),
6162
ParsingInObjCContainer(false) {

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -436,15 +436,17 @@ void PreferredTypeBuilder::enterVariableInit(SourceLocation Tok, Decl *D) {
436436
ExpectedLoc = Tok;
437437
}
438438

439-
static QualType getDesignatedType(QualType BaseType, const Designation &Desig);
439+
static QualType getDesignatedType(QualType BaseType, const Designation &Desig,
440+
HeuristicResolver &Resolver);
440441

441442
void PreferredTypeBuilder::enterDesignatedInitializer(SourceLocation Tok,
442443
QualType BaseType,
443444
const Designation &D) {
444445
if (!Enabled)
445446
return;
446447
ComputeType = nullptr;
447-
Type = getDesignatedType(BaseType, D);
448+
HeuristicResolver Resolver(*Ctx);
449+
Type = getDesignatedType(BaseType, D, Resolver);
448450
ExpectedLoc = Tok;
449451
}
450452

@@ -5346,7 +5348,8 @@ AddRecordMembersCompletionResults(Sema &SemaRef, ResultBuilder &Results,
53465348
// Returns the RecordDecl inside the BaseType, falling back to primary template
53475349
// in case of specializations. Since we might not have a decl for the
53485350
// instantiation/specialization yet, e.g. dependent code.
5349-
static RecordDecl *getAsRecordDecl(QualType BaseType) {
5351+
static RecordDecl *getAsRecordDecl(QualType BaseType,
5352+
HeuristicResolver &Resolver) {
53505353
BaseType = BaseType.getNonReferenceType();
53515354
if (auto *RD = BaseType->getAsRecordDecl()) {
53525355
if (const auto *CTSD =
@@ -5911,7 +5914,7 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr(
59115914
}
59125915
}
59135916

5914-
if (RecordDecl *RD = getAsRecordDecl(BaseType)) {
5917+
if (RecordDecl *RD = getAsRecordDecl(BaseType, Resolver)) {
59155918
AddRecordMembersCompletionResults(SemaRef, Results, S, BaseType, BaseKind,
59165919
RD, std::move(AccessOpFixIt));
59175920
} else if (const auto *TTPT =
@@ -6674,7 +6677,8 @@ QualType SemaCodeCompletion::ProduceTemplateArgumentSignatureHelp(
66746677
/*Braced=*/false);
66756678
}
66766679

6677-
static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
6680+
static QualType getDesignatedType(QualType BaseType, const Designation &Desig,
6681+
HeuristicResolver &Resolver) {
66786682
for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) {
66796683
if (BaseType.isNull())
66806684
break;
@@ -6685,7 +6689,7 @@ static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
66856689
NextType = BaseType->getAsArrayTypeUnsafe()->getElementType();
66866690
} else {
66876691
assert(D.isFieldDesignator());
6688-
auto *RD = getAsRecordDecl(BaseType);
6692+
auto *RD = getAsRecordDecl(BaseType, Resolver);
66896693
if (RD && RD->isCompleteDefinition()) {
66906694
for (const auto *Member : RD->lookup(D.getFieldDecl()))
66916695
if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) {
@@ -6701,10 +6705,10 @@ static QualType getDesignatedType(QualType BaseType, const Designation &Desig) {
67016705

67026706
void SemaCodeCompletion::CodeCompleteDesignator(
67036707
QualType BaseType, llvm::ArrayRef<Expr *> InitExprs, const Designation &D) {
6704-
BaseType = getDesignatedType(BaseType, D);
6708+
BaseType = getDesignatedType(BaseType, D, Resolver);
67056709
if (BaseType.isNull())
67066710
return;
6707-
const auto *RD = getAsRecordDecl(BaseType);
6711+
const auto *RD = getAsRecordDecl(BaseType, Resolver);
67086712
if (!RD || RD->fields().empty())
67096713
return;
67106714

0 commit comments

Comments
 (0)