Skip to content

Commit 0715933

Browse files
committed
[Sema] Add code completion for if constexpr
C++17 supports `if constexpr` statement. This patch implements this in code completion.
1 parent 77c780d commit 0715933

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

clang/include/clang/Sema/SemaCodeCompletion.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ class SemaCodeCompletion : public SemaBase {
152152
void CodeCompleteDesignator(const QualType BaseType,
153153
llvm::ArrayRef<Expr *> InitExprs,
154154
const Designation &D);
155+
void CodeCompleteIfConstExpr(Scope *S) const;
155156
void CodeCompleteAfterIf(Scope *S, bool IsBracedThen);
156157

157158
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext,

clang/lib/Parse/ParseStmt.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,6 +1553,14 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
15531553
IsConsteval = true;
15541554
ConstevalLoc = ConsumeToken();
15551555
}
1556+
1557+
if (Tok.is(tok::code_completion)) {
1558+
if (getLangOpts().CPlusPlus17) {
1559+
cutOffParsing();
1560+
Actions.CodeCompletion().CodeCompleteIfConstExpr(getCurScope());
1561+
return StmtError();
1562+
}
1563+
}
15561564
}
15571565
if (!IsConsteval && (NotLocation.isValid() || Tok.isNot(tok::l_paren))) {
15581566
Diag(Tok, diag::err_expected_lparen_after) << "if";

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6762,6 +6762,21 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
67626762
CodeCompleteExpression(S, Data);
67636763
}
67646764

6765+
void SemaCodeCompletion::CodeCompleteIfConstExpr(Scope *S) const {
6766+
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6767+
CodeCompleter->getCodeCompletionTUInfo(),
6768+
CodeCompletionContext::CCC_SymbolOrNewName);
6769+
Results.EnterNewScope();
6770+
6771+
Results.AddResult(CodeCompletionResult("constexpr"));
6772+
6773+
Results.ExitScope();
6774+
6775+
HandleCodeCompleteResults(&SemaRef, CodeCompleter,
6776+
Results.getCompletionContext(), Results.data(),
6777+
Results.size());
6778+
}
6779+
67656780
void SemaCodeCompletion::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) {
67666781
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
67676782
CodeCompleter->getCodeCompletionTUInfo(),

0 commit comments

Comments
 (0)