summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2018-08-17 15:42:54 +0000
committerKadir Cetinkaya <kadircet@google.com>2018-08-17 15:42:54 +0000
commit6c9f15c533811937b51be1e1f8975fc54e18f40b (patch)
treeebae8c1be65d7b13314cc5c847f0bc63f09aedf4 /clang-tools-extra
parent2532ac880a3fec0b3282d18a00d54d27b1d5cb5a (diff)
downloadbcm5719-llvm-6c9f15c533811937b51be1e1f8975fc54e18f40b.tar.gz
bcm5719-llvm-6c9f15c533811937b51be1e1f8975fc54e18f40b.zip
[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 llvm-svn: 340040
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/clangd/CodeComplete.cpp13
-rw-r--r--clang-tools-extra/clangd/CodeComplete.h4
-rw-r--r--clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp52
3 files changed, 67 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index 36d0f21ed09..df438b4836d 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -1413,8 +1413,17 @@ CompletionItem CodeCompletion::render(const CodeCompleteOptions &Opts) const {
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;
diff --git a/clang-tools-extra/clangd/CodeComplete.h b/clang-tools-extra/clangd/CodeComplete.h
index 9ef2b1fbaf5..1d85a66ec44 100644
--- a/clang-tools-extra/clangd/CodeComplete.h
+++ b/clang-tools-extra/clangd/CodeComplete.h
@@ -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.
diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
index 5933bb5ff08..3fce86626d8 100644
--- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
+++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
@@ -1648,6 +1648,58 @@ TEST(SignatureHelpTest, IndexDocumentation) {
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
OpenPOWER on IntegriCloud