[PATCH] D38083: [clangd] Skip informative qualifier chunks.
This revision was automatically updated to reflect the committed changes. Closed by commit rL314445: [clangd] Skip informative qualifier chunks. (authored by ibiryukov). Repository: rL LLVM https://reviews.llvm.org/D38083 Files: clang-tools-extra/trunk/clangd/ClangdUnit.cpp clang-tools-extra/trunk/test/clangd/completion-qualifiers.test Index: clang-tools-extra/trunk/clangd/ClangdUnit.cpp === --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp @@ -409,6 +409,11 @@ }; // CompletionItemsCollector +bool isInformativeQualifierChunk(CodeCompletionString::Chunk const ) { + return Chunk.Kind == CodeCompletionString::CK_Informative && + StringRef(Chunk.Text).endswith("::"); +} + class PlainTextCompletionItemsCollector final : public CompletionItemsCollector { @@ -421,6 +426,11 @@ void ProcessChunks(const CodeCompletionString , CompletionItem ) const override { for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // There's always exactly one CK_TypedText chunk. @@ -453,6 +463,11 @@ CompletionItem ) const override { unsigned ArgCount = 0; for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // The piece of text that the user is expected to type to match Index: clang-tools-extra/trunk/test/clangd/completion-qualifiers.test === --- clang-tools-extra/trunk/test/clangd/completion-qualifiers.test +++ clang-tools-extra/trunk/test/clangd/completion-qualifiers.test @@ -0,0 +1,18 @@ +# RUN: clangd -run-synchronously < %s | FileCheck %s +Content-Length: 125 + +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +Content-Length: 297 + +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"class Foo {\n public:\nint foo() const;\nint bar() const;\n};\n\nclass Bar : public Foo {\n int foo() const;\n};\n\nvoid test() {\n Bar().\n}"}}} +Content-Length: 151 + +{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}} +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHECK-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"200035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"37bar","filterText":"bar","insertText":"bar","insertTextFormat":1} +# CHECK-DAG: {"label":"Foo::foo() const","kind":2,"detail":"int","sortText":"37foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK: ]} +Content-Length: 44 + +{"jsonrpc":"2.0","id":4,"method":"shutdown"} Index: clang-tools-extra/trunk/clangd/ClangdUnit.cpp === --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp @@ -409,6 +409,11 @@ }; // CompletionItemsCollector +bool isInformativeQualifierChunk(CodeCompletionString::Chunk const ) { + return Chunk.Kind == CodeCompletionString::CK_Informative && + StringRef(Chunk.Text).endswith("::"); +} + class PlainTextCompletionItemsCollector final : public CompletionItemsCollector { @@ -421,6 +426,11 @@ void ProcessChunks(const CodeCompletionString , CompletionItem ) const override { for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // There's always exactly one CK_TypedText chunk. @@ -453,6 +463,11 @@ CompletionItem ) const override { unsigned ArgCount = 0; for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // The piece of text that the user is expected to type to match Index: clang-tools-extra/trunk/test/clangd/completion-qualifiers.test === ---
[PATCH] D38083: [clangd] Skip informative qualifier chunks.
rwols accepted this revision. rwols added a comment. This revision is now accepted and ready to land. LGTM https://reviews.llvm.org/D38083 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38083: [clangd] Skip informative qualifier chunks.
ilya-biryukov updated this revision to Diff 116297. ilya-biryukov added a comment. - Fixed CHECK-DAG typo. https://reviews.llvm.org/D38083 Files: clangd/ClangdUnit.cpp test/clangd/completion-qualifiers.test Index: test/clangd/completion-qualifiers.test === --- /dev/null +++ test/clangd/completion-qualifiers.test @@ -0,0 +1,18 @@ +# RUN: clangd -run-synchronously < %s | FileCheck %s +Content-Length: 125 + +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +Content-Length: 297 + +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"class Foo {\n public:\nint foo() const;\nint bar() const;\n};\n\nclass Bar : public Foo {\n int foo() const;\n};\n\nvoid test() {\n Bar().\n}"}}} +Content-Length: 151 + +{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}} +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHECK-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"200035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"37bar","filterText":"bar","insertText":"bar","insertTextFormat":1} +# CHECK-DAG: {"label":"Foo::foo() const","kind":2,"detail":"int","sortText":"37foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK: ]} +Content-Length: 44 + +{"jsonrpc":"2.0","id":4,"method":"shutdown"} Index: clangd/ClangdUnit.cpp === --- clangd/ClangdUnit.cpp +++ clangd/ClangdUnit.cpp @@ -409,6 +409,11 @@ }; // CompletionItemsCollector +bool isInformativeQualifierChunk(CodeCompletionString::Chunk const ) { + return Chunk.Kind == CodeCompletionString::CK_Informative && + StringRef(Chunk.Text).endswith("::"); +} + class PlainTextCompletionItemsCollector final : public CompletionItemsCollector { @@ -421,6 +426,11 @@ void ProcessChunks(const CodeCompletionString , CompletionItem ) const override { for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // There's always exactly one CK_TypedText chunk. @@ -453,6 +463,11 @@ CompletionItem ) const override { unsigned ArgCount = 0; for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // The piece of text that the user is expected to type to match Index: test/clangd/completion-qualifiers.test === --- /dev/null +++ test/clangd/completion-qualifiers.test @@ -0,0 +1,18 @@ +# RUN: clangd -run-synchronously < %s | FileCheck %s +Content-Length: 125 + +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +Content-Length: 297 + +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"class Foo {\n public:\nint foo() const;\nint bar() const;\n};\n\nclass Bar : public Foo {\n int foo() const;\n};\n\nvoid test() {\n Bar().\n}"}}} +Content-Length: 151 + +{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}} +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHECK-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"200035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"37bar","filterText":"bar","insertText":"bar","insertTextFormat":1} +# CHECK-DAG: {"label":"Foo::foo() const","kind":2,"detail":"int","sortText":"37foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK: ]} +Content-Length: 44 + +{"jsonrpc":"2.0","id":4,"method":"shutdown"} Index: clangd/ClangdUnit.cpp === --- clangd/ClangdUnit.cpp +++ clangd/ClangdUnit.cpp @@ -409,6 +409,11 @@ }; // CompletionItemsCollector +bool isInformativeQualifierChunk(CodeCompletionString::Chunk const ) { + return Chunk.Kind == CodeCompletionString::CK_Informative && + StringRef(Chunk.Text).endswith("::"); +} + class PlainTextCompletionItemsCollector final : public CompletionItemsCollector { @@
[PATCH] D38083: [clangd] Skip informative qualifier chunks.
ilya-biryukov added inline comments. Comment at: test/clangd/completion-qualifiers.test:12 +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHEKC-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"00035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHEKC-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"00037bar","filterText":"bar","insertText":"bar","insertTextFormat":1} rwols wrote: > CHECK-DAG typo? Totally! Thanks for spotting this. https://reviews.llvm.org/D38083 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38083: [clangd] Skip informative qualifier chunks.
rwols added inline comments. Comment at: test/clangd/completion-qualifiers.test:12 +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHEKC-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"00035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHEKC-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"00037bar","filterText":"bar","insertText":"bar","insertTextFormat":1} CHECK-DAG typo? https://reviews.llvm.org/D38083 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38083: [clangd] Skip informative qualifier chunks.
ilya-biryukov created this revision. Completion results look much nicer without them. Informative qualifiers are stored for every method from a base class, even when calling those methods does not require any qualifiers. For example, struct Foo { int foo(); }; struct Bar : Foo { }; void test() { Bar(). // Completion item label was 'Foo::foo' before, // but inserted text was simply 'foo'. // We now simply show 'foo' in completion item label. They effectively cluttered the completion list without providing much value. https://reviews.llvm.org/D38083 Files: clangd/ClangdUnit.cpp test/clangd/completion-qualifiers.test Index: test/clangd/completion-qualifiers.test === --- /dev/null +++ test/clangd/completion-qualifiers.test @@ -0,0 +1,18 @@ +# RUN: clangd -run-synchronously < %s | FileCheck %s +Content-Length: 125 + +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +Content-Length: 297 + +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"class Foo {\n public:\nint foo() const;\nint bar() const;\n};\n\nclass Bar : public Foo {\n int foo() const;\n};\n\nvoid test() {\n Bar().\n}"}}} +Content-Length: 151 + +{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}} +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHEKC-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"00035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHEKC-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"00037bar","filterText":"bar","insertText":"bar","insertTextFormat":1} +# CHEKC-DAG: {"label":"Foo::foo() const","kind":2,"detail":"int","sortText":"00037foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK: ]} +Content-Length: 44 + +{"jsonrpc":"2.0","id":4,"method":"shutdown"} Index: clangd/ClangdUnit.cpp === --- clangd/ClangdUnit.cpp +++ clangd/ClangdUnit.cpp @@ -383,6 +383,11 @@ }; // CompletionItemsCollector +bool isInformativeQualifierChunk(CodeCompletionString::Chunk const ) { + return Chunk.Kind == CodeCompletionString::CK_Informative && + StringRef(Chunk.Text).endswith("::"); +} + class PlainTextCompletionItemsCollector final : public CompletionItemsCollector { @@ -395,6 +400,11 @@ void ProcessChunks(const CodeCompletionString , CompletionItem ) const override { for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // There's always exactly one CK_TypedText chunk. @@ -427,6 +437,11 @@ CompletionItem ) const override { unsigned ArgCount = 0; for (const auto : CCS) { + // Informative qualifier chunks only clutter completion results, skip + // them. + if (isInformativeQualifierChunk(Chunk)) +continue; + switch (Chunk.Kind) { case CodeCompletionString::CK_TypedText: // The piece of text that the user is expected to type to match Index: test/clangd/completion-qualifiers.test === --- /dev/null +++ test/clangd/completion-qualifiers.test @@ -0,0 +1,18 @@ +# RUN: clangd -run-synchronously < %s | FileCheck %s +Content-Length: 125 + +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}} +Content-Length: 297 + +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///main.cpp","languageId":"cpp","version":1,"text":"class Foo {\n public:\nint foo() const;\nint bar() const;\n};\n\nclass Bar : public Foo {\n int foo() const;\n};\n\nvoid test() {\n Bar().\n}"}}} +Content-Length: 151 + +{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"file:///main.cpp"},"position":{"line":11,"character":8}}} +# CHECK: {"jsonrpc":"2.0","id":2,"result":[ +# CHEKC-DAG: {"label":"foo() const","kind":2,"detail":"int","sortText":"00035foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHEKC-DAG: {"label":"bar() const","kind":2,"detail":"int","sortText":"00037bar","filterText":"bar","insertText":"bar","insertTextFormat":1} +# CHEKC-DAG: {"label":"Foo::foo() const","kind":2,"detail":"int","sortText":"00037foo","filterText":"foo","insertText":"foo","insertTextFormat":1} +# CHECK: ]} +Content-Length: 44 + +{"jsonrpc":"2.0","id":4,"method":"shutdown"} Index: