[clang-tools-extra] r340040 - [clangd] Add parantheses while auto-completing functions.
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 17 08:42:55 PDT 2018
Author: kadircet
Date: Fri Aug 17 08:42:54 2018
New Revision: 340040
URL: http://llvm.org/viewvc/llvm-project?rev=340040&view=rev
Log:
[clangd] Add parantheses while auto-completing functions.
Summary:
Currently we only add parantheses to the functions if snippets are
enabled, which also inserts snippets for parameters into parantheses. Adding a
new option to put only parantheses. Also it moves the cursor within parantheses
or at the end of them by looking at whether completion item has any parameters
or not. Still requires snippets support on the client side.
Reviewers: ioeric, ilya-biryukov, hokein
Reviewed By: ioeric
Subscribers: MaskRay, jkorous, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D50835
Modified:
clang-tools-extra/trunk/clangd/CodeComplete.cpp
clang-tools-extra/trunk/clangd/CodeComplete.h
clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
Modified: clang-tools-extra/trunk/clangd/CodeComplete.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/CodeComplete.cpp?rev=340040&r1=340039&r2=340040&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/CodeComplete.cpp (original)
+++ clang-tools-extra/trunk/clangd/CodeComplete.cpp Fri Aug 17 08:42:54 2018
@@ -1413,8 +1413,17 @@ CompletionItem CodeCompletion::render(co
LSP.additionalTextEdits.push_back(FixIt);
}
}
- if (Opts.EnableSnippets)
- LSP.textEdit->newText += SnippetSuffix;
+ if (Opts.EnableSnippets && !SnippetSuffix.empty()) {
+ if (!Opts.EnableFunctionArgSnippets &&
+ ((Kind == CompletionItemKind::Function) ||
+ (Kind == CompletionItemKind::Method)) &&
+ (SnippetSuffix.front() == '(') && (SnippetSuffix.back() == ')'))
+ // Check whether function has any parameters or not.
+ LSP.textEdit->newText += SnippetSuffix.size() > 2 ? "(${0})" : "()";
+ else
+ LSP.textEdit->newText += SnippetSuffix;
+ }
+
// FIXME(kadircet): Do not even fill insertText after making sure textEdit is
// compatible with most of the editors.
LSP.insertText = LSP.textEdit->newText;
Modified: clang-tools-extra/trunk/clangd/CodeComplete.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/CodeComplete.h?rev=340040&r1=340039&r2=340040&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/CodeComplete.h (original)
+++ clang-tools-extra/trunk/clangd/CodeComplete.h Fri Aug 17 08:42:54 2018
@@ -82,6 +82,10 @@ struct CodeCompleteOptions {
/// Include completions that require small corrections, e.g. change '.' to
/// '->' on member access etc.
bool IncludeFixIts = false;
+
+ /// Whether to generate snippets for function arguments on code-completion.
+ /// Needs snippets to be enabled as well.
+ bool EnableFunctionArgSnippets = true;
};
// Semi-structured representation of a code-complete suggestion for our C++ API.
Modified: clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp?rev=340040&r1=340039&r2=340040&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp Fri Aug 17 08:42:54 2018
@@ -1648,6 +1648,58 @@ TEST(SignatureHelpTest, IndexDocumentati
SigDoc("Doc from sema"))));
}
+TEST(CompletionTest, RenderWithSnippetsForFunctionArgsDisabled) {
+ CodeCompleteOptions Opts;
+ Opts.EnableFunctionArgSnippets = true;
+ {
+ CodeCompletion C;
+ C.RequiredQualifier = "Foo::";
+ C.Name = "x";
+ C.SnippetSuffix = "()";
+
+ auto R = C.render(Opts);
+ EXPECT_EQ(R.textEdit->newText, "Foo::x");
+ EXPECT_EQ(R.insertTextFormat, InsertTextFormat::PlainText);
+ }
+
+ Opts.EnableSnippets = true;
+ Opts.EnableFunctionArgSnippets = false;
+ {
+ CodeCompletion C;
+ C.RequiredQualifier = "Foo::";
+ C.Name = "x";
+ C.SnippetSuffix = "";
+
+ auto R = C.render(Opts);
+ EXPECT_EQ(R.textEdit->newText, "Foo::x");
+ EXPECT_EQ(R.insertTextFormat, InsertTextFormat::Snippet);
+ }
+
+ {
+ CodeCompletion C;
+ C.RequiredQualifier = "Foo::";
+ C.Name = "x";
+ C.SnippetSuffix = "()";
+ C.Kind = CompletionItemKind::Method;
+
+ auto R = C.render(Opts);
+ EXPECT_EQ(R.textEdit->newText, "Foo::x()");
+ EXPECT_EQ(R.insertTextFormat, InsertTextFormat::Snippet);
+ }
+
+ {
+ CodeCompletion C;
+ C.RequiredQualifier = "Foo::";
+ C.Name = "x";
+ C.SnippetSuffix = "(${0:bool})";
+ C.Kind = CompletionItemKind::Function;
+
+ auto R = C.render(Opts);
+ EXPECT_EQ(R.textEdit->newText, "Foo::x(${0})");
+ EXPECT_EQ(R.insertTextFormat, InsertTextFormat::Snippet);
+ }
+}
+
} // namespace
} // namespace clangd
} // namespace clang
More information about the cfe-commits
mailing list