diff options
author | Letu Ren <fantasquex@gmail.com> | 2025-03-17 14:45:19 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-17 02:45:19 -0400 |
commit | 009d36222cfdb59f49597e01d157ca4f65ac9295 (patch) | |
tree | 989526982be373a1e192fe821be88b9a6aeb95d3 /clang/lib/Sema/SemaCodeComplete.cpp | |
parent | 6c867e27a7b597910571677abdef77b703a5a601 (diff) | |
download | llvm-009d36222cfdb59f49597e01d157ca4f65ac9295.zip llvm-009d36222cfdb59f49597e01d157ca4f65ac9295.tar.gz llvm-009d36222cfdb59f49597e01d157ca4f65ac9295.tar.bz2 |
[clang][CodeComplete] Add code completion for if constexpr and consteval (#124315)
Code complete `constexpr` and `consteval` keywords after `if` in the
relevant language modes. If pattern completion is enabled, the
completions also include placeholders for the condition (in the case
of `constexpr`) and statement block.
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index db467d7..2003701 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6749,6 +6749,52 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) { CodeCompleteExpression(S, Data); } +void SemaCodeCompletion::CodeCompleteKeywordAfterIf(bool AfterExclaim) const { + ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(), + CodeCompleter->getCodeCompletionTUInfo(), + CodeCompletionContext::CCC_Other); + CodeCompletionBuilder Builder(Results.getAllocator(), + Results.getCodeCompletionTUInfo()); + if (getLangOpts().CPlusPlus17) { + if (!AfterExclaim) { + if (Results.includeCodePatterns()) { + Builder.AddTypedTextChunk("constexpr"); + Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); + Builder.AddChunk(CodeCompletionString::CK_LeftParen); + Builder.AddPlaceholderChunk("condition"); + Builder.AddChunk(CodeCompletionString::CK_RightParen); + Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); + Builder.AddChunk(CodeCompletionString::CK_LeftBrace); + Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); + Builder.AddPlaceholderChunk("statements"); + Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); + Builder.AddChunk(CodeCompletionString::CK_RightBrace); + Results.AddResult({Builder.TakeString()}); + } else { + Results.AddResult({"constexpr"}); + } + } + } + if (getLangOpts().CPlusPlus23) { + if (Results.includeCodePatterns()) { + Builder.AddTypedTextChunk("consteval"); + Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); + Builder.AddChunk(CodeCompletionString::CK_LeftBrace); + Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); + Builder.AddPlaceholderChunk("statements"); + Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); + Builder.AddChunk(CodeCompletionString::CK_RightBrace); + Results.AddResult({Builder.TakeString()}); + } else { + Results.AddResult({"consteval"}); + } + } + + HandleCodeCompleteResults(&SemaRef, CodeCompleter, + Results.getCompletionContext(), Results.data(), + Results.size()); +} + void SemaCodeCompletion::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) { ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(), CodeCompleter->getCodeCompletionTUInfo(), |