2121#include " AST.h"
2222#include " CodeCompletionStrings.h"
2323#include " Compiler.h"
24+ #include " Config.h"
2425#include " ExpectedTypes.h"
2526#include " Feature.h"
2627#include " FileDistance.h"
@@ -350,8 +351,7 @@ struct CodeCompletionBuilder {
350351 CodeCompletionContext::Kind ContextKind,
351352 const CodeCompleteOptions &Opts,
352353 bool IsUsingDeclaration, tok::TokenKind NextTokenKind)
353- : ASTCtx(ASTCtx),
354- EnableFunctionArgSnippets (Opts.EnableFunctionArgSnippets),
354+ : ASTCtx(ASTCtx), ArgumentLists(Opts.ArgumentLists),
355355 IsUsingDeclaration (IsUsingDeclaration), NextTokenKind(NextTokenKind) {
356356 Completion.Deprecated = true ; // cleared by any non-deprecated overload.
357357 add (C, SemaCCS, ContextKind);
@@ -561,14 +561,23 @@ struct CodeCompletionBuilder {
561561 }
562562
563563 std::string summarizeSnippet () const {
564+ // / localize ArgumentLists tests for better readability
565+ const bool None = ArgumentLists == Config::ArgumentListsPolicy::None;
566+ const bool Open =
567+ ArgumentLists == Config::ArgumentListsPolicy::OpenDelimiter;
568+ const bool Delim = ArgumentLists == Config::ArgumentListsPolicy::Delimiters;
569+ const bool Full =
570+ ArgumentLists == Config::ArgumentListsPolicy::FullPlaceholders ||
571+ (!None && !Open && !Delim); // <-- failsafe: Full is default
572+
564573 if (IsUsingDeclaration)
565574 return " " ;
566575 auto *Snippet = onlyValue<&BundledEntry::SnippetSuffix>();
567576 if (!Snippet)
568577 // All bundles are function calls.
569578 // FIXME(ibiryukov): sometimes add template arguments to a snippet, e.g.
570579 // we need to complete 'forward<$1>($0)'.
571- return " ( $0)" ;
580+ return None ? " " : (Open ? " ( " : " ( $0)" ) ;
572581
573582 if (Snippet->empty ())
574583 return " " ;
@@ -607,7 +616,7 @@ struct CodeCompletionBuilder {
607616 return " " ;
608617 }
609618 }
610- if (EnableFunctionArgSnippets )
619+ if (Full )
611620 return *Snippet;
612621
613622 // Replace argument snippets with a simplified pattern.
@@ -622,9 +631,9 @@ struct CodeCompletionBuilder {
622631
623632 bool EmptyArgs = llvm::StringRef (*Snippet).ends_with (" ()" );
624633 if (Snippet->front () == ' <' )
625- return EmptyArgs ? " <$1>()$0" : " <$1>($0)" ;
634+ return None ? " " : (Open ? " < " : ( EmptyArgs ? " <$1>()$0" : " <$1>($0)" )) ;
626635 if (Snippet->front () == ' (' )
627- return EmptyArgs ? " ()" : " ($0)" ;
636+ return None ? " " : (Open ? " ( " : ( EmptyArgs ? " ()" : " ($0)" )) ;
628637 return *Snippet; // Not an arg snippet?
629638 }
630639 // 'CompletionItemKind::Interface' matches template type aliases.
@@ -638,7 +647,7 @@ struct CodeCompletionBuilder {
638647 // e.g. Foo<${1:class}>.
639648 if (llvm::StringRef (*Snippet).ends_with (" <>" ))
640649 return " <>" ; // can happen with defaulted template arguments.
641- return " < $0>" ;
650+ return None ? " " : (Open ? " < " : " < $0>" ) ;
642651 }
643652 return *Snippet;
644653 }
@@ -654,7 +663,8 @@ struct CodeCompletionBuilder {
654663 ASTContext *ASTCtx;
655664 CodeCompletion Completion;
656665 llvm::SmallVector<BundledEntry, 1 > Bundled;
657- bool EnableFunctionArgSnippets;
666+ // / the way argument lists are handled.
667+ Config::ArgumentListsPolicy ArgumentLists;
658668 // No snippets will be generated for using declarations and when the function
659669 // arguments are already present.
660670 bool IsUsingDeclaration;
0 commit comments