[clang] [clangd] Add code completion for if constexpr (PR #124315)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 24 09:41:29 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: FantasqueX (FantasqueX)
<details>
<summary>Changes</summary>
C++17 supports `if constexpr` statement. This patch implements this in code completion.
---
Full diff: https://github.com/llvm/llvm-project/pull/124315.diff
3 Files Affected:
- (modified) clang/include/clang/Sema/SemaCodeCompletion.h (+1)
- (modified) clang/lib/Parse/ParseStmt.cpp (+8)
- (modified) clang/lib/Sema/SemaCodeComplete.cpp (+15)
``````````diff
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index e931596c215d31..af44745d5d1239 100644
--- a/clang/include/clang/Sema/SemaCodeCompletion.h
+++ b/clang/include/clang/Sema/SemaCodeCompletion.h
@@ -152,6 +152,7 @@ class SemaCodeCompletion : public SemaBase {
void CodeCompleteDesignator(const QualType BaseType,
llvm::ArrayRef<Expr *> InitExprs,
const Designation &D);
+ void CodeCompleteIfConstExpr(Scope *S) const;
void CodeCompleteAfterIf(Scope *S, bool IsBracedThen);
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext,
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index cd4504630f8719..3f9900dd997ada 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -1553,6 +1553,14 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
IsConsteval = true;
ConstevalLoc = ConsumeToken();
}
+
+ if (Tok.is(tok::code_completion)) {
+ if (getLangOpts().CPlusPlus17) {
+ cutOffParsing();
+ Actions.CodeCompletion().CodeCompleteIfConstExpr(getCurScope());
+ return StmtError();
+ }
+ }
}
if (!IsConsteval && (NotLocation.isValid() || Tok.isNot(tok::l_paren))) {
Diag(Tok, diag::err_expected_lparen_after) << "if";
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 58f3efbe0daf89..b159fd26a45208 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6762,6 +6762,21 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
CodeCompleteExpression(S, Data);
}
+void SemaCodeCompletion::CodeCompleteIfConstExpr(Scope *S) const {
+ ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
+ CodeCompleter->getCodeCompletionTUInfo(),
+ CodeCompletionContext::CCC_SymbolOrNewName);
+ Results.EnterNewScope();
+
+ Results.AddResult(CodeCompletionResult("constexpr"));
+
+ Results.ExitScope();
+
+ HandleCodeCompleteResults(&SemaRef, CodeCompleter,
+ Results.getCompletionContext(), Results.data(),
+ Results.size());
+}
+
void SemaCodeCompletion::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
``````````
</details>
https://github.com/llvm/llvm-project/pull/124315
More information about the cfe-commits
mailing list