Skip to content

Commit 6e5e698

Browse files
committed
[clangd][Sema] add noexcept to override functions during code completion
1 parent f412b78 commit 6e5e698

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# RUN: clangd -lit-test < %s | FileCheck %s
2+
# RUN: clangd -lit-test -pch-storage=memory < %s | FileCheck %s
3+
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
4+
---
5+
{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///main.cpp","languageId":"cpp","version":1,"text":"struct Base {\n virtual void virt_method() noexcept = 0;\n};\n\nstruct Derived : Base {\n virt_\n};"}}}
6+
---
7+
{"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:///main.cpp"},"position":{"line":5,"character":6}}}
8+
# CHECK: "id": 1,
9+
# CHECK-NEXT: "jsonrpc": "2.0",
10+
# CHECK-NEXT: "result": {
11+
# CHECK-NEXT: "isIncomplete": false,
12+
# CHECK-NEXT: "items": [
13+
# CHECK-NEXT: {
14+
# CHECK-NEXT: "filterText": "virt_method() noexcept override",
15+
# CHECK-NEXT: "insertText": "void virt_method() noexcept override",
16+
# CHECK-NEXT: "insertTextFormat": 1,
17+
# CHECK-NEXT: "kind": 2,
18+
# CHECK-NEXT: "label": " void virt_method() noexcept override",
19+
# CHECK-NEXT: "score": {{[0-9]+.[0-9]+}},
20+
# CHECK-NEXT: "sortText": "{{.*}}virt_method() noexcept override",
21+
# CHECK-NEXT: "textEdit": {
22+
# CHECK-NEXT: "newText": "void virt_method() noexcept override",
23+
# CHECK-NEXT: "range": {
24+
# CHECK-NEXT: "end": {
25+
# CHECK-NEXT: "character": 6,
26+
# CHECK-NEXT: "line": 5
27+
# CHECK-NEXT: },
28+
# CHECK-NEXT: "start": {
29+
# CHECK-NEXT: "character": 2,
30+
# CHECK-NEXT: "line": 5
31+
# CHECK-NEXT: }
32+
# CHECK-NEXT: }
33+
# CHECK-NEXT: }
34+
# CHECK-NEXT: },
35+
---
36+
{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"test:///main.cpp","version":2},"contentChanges":[{"text":"struct Base {\n virtual void virt_method() = 0;\n};\n\nstruct Derived : Base {\n virt_\n};"}]}}
37+
---
38+
{"jsonrpc":"2.0","id":3,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:///main.cpp"},"position":{"line":5,"character":6}}}
39+
# CHECK: "id": 3,
40+
# CHECK-NEXT: "jsonrpc": "2.0",
41+
# CHECK-NEXT: "result": {
42+
# CHECK-NEXT: "isIncomplete": false,
43+
# CHECK-NEXT: "items": [
44+
# CHECK-NEXT: {
45+
# CHECK-NEXT: "filterText": "virt_method() override",
46+
# CHECK-NEXT: "insertText": "void virt_method() override",
47+
# CHECK-NEXT: "insertTextFormat": 1,
48+
# CHECK-NEXT: "kind": 2,
49+
# CHECK-NEXT: "label": " void virt_method() override",
50+
# CHECK-NEXT: "score": {{[0-9]+.[0-9]+}},
51+
# CHECK-NEXT: "sortText": "{{.*}}virt_method() override",
52+
# CHECK-NEXT: "textEdit": {
53+
# CHECK-NEXT: "newText": "void virt_method() override",
54+
# CHECK-NEXT: "range": {
55+
# CHECK-NEXT: "end": {
56+
# CHECK-NEXT: "character": 6,
57+
# CHECK-NEXT: "line": 5
58+
# CHECK-NEXT: },
59+
# CHECK-NEXT: "start": {
60+
# CHECK-NEXT: "character": 2,
61+
# CHECK-NEXT: "line": 5
62+
# CHECK-NEXT: }
63+
# CHECK-NEXT: }
64+
# CHECK-NEXT: }
65+
# CHECK-NEXT: },
66+
---
67+
{"jsonrpc":"2.0","id":4,"method":"shutdown"}
68+
---
69+
{"jsonrpc":"2.0","method":"exit"}

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "clang/AST/Type.h"
2626
#include "clang/Basic/AttributeCommonInfo.h"
2727
#include "clang/Basic/CharInfo.h"
28+
#include "clang/Basic/ExceptionSpecificationType.h"
2829
#include "clang/Basic/OperatorKinds.h"
2930
#include "clang/Basic/Specifiers.h"
3031
#include "clang/Lex/HeaderSearch.h"
@@ -3292,6 +3293,25 @@ AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
32923293
Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr));
32933294
}
32943295

3296+
static void
3297+
AddFunctionExceptSpecToCompletionString(CodeCompletionBuilder &Result,
3298+
const FunctionDecl *Function) {
3299+
const auto *Proto = Function->getType()->getAs<FunctionProtoType>();
3300+
if (!Proto)
3301+
return;
3302+
3303+
auto ExceptInfo = Proto->getExceptionSpecInfo();
3304+
switch (ExceptInfo.Type) {
3305+
case EST_BasicNoexcept:
3306+
case EST_NoexceptTrue:
3307+
Result.AddInformativeChunk(" noexcept");
3308+
break;
3309+
3310+
default:
3311+
break;
3312+
}
3313+
}
3314+
32953315
/// Add the name of the given declaration
32963316
static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy,
32973317
const NamedDecl *ND,
@@ -3560,6 +3580,7 @@ CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl(
35603580
AddFunctionParameterChunks(PP, Policy, Function, Result);
35613581
Result.AddChunk(CodeCompletionString::CK_RightParen);
35623582
AddFunctionTypeQualsToCompletionString(Result, Function);
3583+
AddFunctionExceptSpecToCompletionString(Result, Function);
35633584
};
35643585

35653586
if (const auto *Function = dyn_cast<FunctionDecl>(ND)) {
@@ -3642,6 +3663,7 @@ CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl(
36423663
AddFunctionParameterChunks(PP, Policy, Function, Result);
36433664
Result.AddChunk(CodeCompletionString::CK_RightParen);
36443665
AddFunctionTypeQualsToCompletionString(Result, Function);
3666+
AddFunctionExceptSpecToCompletionString(Result, Function);
36453667
return Result.TakeString();
36463668
}
36473669

0 commit comments

Comments
 (0)