https://github.com/FantasqueX updated https://github.com/llvm/llvm-project/pull/124315
>From f6558708fe1b4f14fdca9311495082a0fe461866 Mon Sep 17 00:00:00 2001 From: Letu Ren <fantasq...@gmail.com> Date: Sat, 25 Jan 2025 01:23:52 +0800 Subject: [PATCH 1/3] [Sema] Add code completion for if constexpr C++17 supports `if constexpr` statement. This patch implements this in code completion. --- clang/include/clang/Sema/SemaCodeCompletion.h | 1 + clang/lib/Parse/ParseStmt.cpp | 8 ++++++++ clang/lib/Sema/SemaCodeComplete.cpp | 15 +++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h index e931596c215d3..af44745d5d123 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 cd4504630f871..3f9900dd997ad 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 80ae87e7c5725..bcc0cb18b8739 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6749,6 +6749,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(), >From 3508b44d56dcb8c25d424492db6996b862f44953 Mon Sep 17 00:00:00 2001 From: Letu Ren <fantasq...@gmail.com> Date: Mon, 3 Feb 2025 22:49:38 +0800 Subject: [PATCH 2/3] Add test for if constexpr completion --- clang/test/CodeCompletion/if-constexpr.cpp | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 clang/test/CodeCompletion/if-constexpr.cpp diff --git a/clang/test/CodeCompletion/if-constexpr.cpp b/clang/test/CodeCompletion/if-constexpr.cpp new file mode 100644 index 0000000000000..48a89b4799cbc --- /dev/null +++ b/clang/test/CodeCompletion/if-constexpr.cpp @@ -0,0 +1,4 @@ +void test() { + if c + // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:%(line-1):7 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s + // CHECK-CC1: constexpr >From e6d79ad7e218a279a7ac67b8a8ce2a5442620fee Mon Sep 17 00:00:00 2001 From: Letu Ren <fantasq...@gmail.com> Date: Sat, 15 Feb 2025 18:03:38 +0800 Subject: [PATCH 3/3] rename function --- clang/include/clang/Sema/SemaCodeCompletion.h | 2 +- clang/lib/Parse/ParseStmt.cpp | 2 +- clang/lib/Sema/SemaCodeComplete.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h index af44745d5d123..c79e6ec13634b 100644 --- a/clang/include/clang/Sema/SemaCodeCompletion.h +++ b/clang/include/clang/Sema/SemaCodeCompletion.h @@ -152,7 +152,7 @@ class SemaCodeCompletion : public SemaBase { void CodeCompleteDesignator(const QualType BaseType, llvm::ArrayRef<Expr *> InitExprs, const Designation &D); - void CodeCompleteIfConstExpr(Scope *S) const; + 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 3f9900dd997ad..fd7f707d87516 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -1557,7 +1557,7 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) { if (Tok.is(tok::code_completion)) { if (getLangOpts().CPlusPlus17) { cutOffParsing(); - Actions.CodeCompletion().CodeCompleteIfConstExpr(getCurScope()); + Actions.CodeCompletion().CodeCompleteIfConstexpr(getCurScope()); return StmtError(); } } diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index bcc0cb18b8739..529965cb3e342 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6749,7 +6749,7 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) { CodeCompleteExpression(S, Data); } -void SemaCodeCompletion::CodeCompleteIfConstExpr(Scope *S) const { +void SemaCodeCompletion::CodeCompleteIfConstexpr(Scope *S) const { ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(), CodeCompleter->getCodeCompletionTUInfo(), CodeCompletionContext::CCC_SymbolOrNewName); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits