429 lines · plain
1# We specify a custom path in XDG_CONFIG_HOME, which only works on some systems.2# UNSUPPORTED: system-windows3# UNSUPPORTED: system-darwin4 5# RUN: rm -rf %t6# RUN: mkdir -p %t/clangd7# RUN: cp -r %S/Inputs/include-cleaner %t/include8# RUN: echo '-I%t/include' > %t/compile_flags.txt9# Create a config file enabling include-cleaner features.10# RUN: echo 'Diagnostics:' > %t/clangd/config.yaml11# RUN: echo ' UnusedIncludes: Strict' >> %t/clangd/config.yaml12# RUN: echo ' MissingIncludes: Strict' >> %t/clangd/config.yaml13 14# RUN: env XDG_CONFIG_HOME=%t clangd -lit-test -enable-config --compile-commands-dir=%t < %s | FileCheck -strict-whitespace %s15{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{"workspace":{"workspaceEdit":{"documentChanges":true, "changeAnnotationSupport":{"groupsOnLabel":true}}}},"trace":"off"}}16---17{18 "jsonrpc": "2.0",19 "method": "textDocument/didOpen",20 "params": {21 "textDocument": {22 "uri": "test:///simple.cpp",23 "languageId": "cpp",24 "text": "#include \"all1.h\"\n#include \"all2.h\"\n Foo* foo; Bar* bar;"25 }26 }27}28# First, the diagnostic from the config file.29# CHECK: "method": "textDocument/publishDiagnostics",30# CHECK-NEXT: "params": {31# CHECK-NEXT: "diagnostics": [],32 33# Then, diagnostic from the main cpp file.34# CHECK: "method": "textDocument/publishDiagnostics",35# CHECK-NEXT: "params": {36# CHECK-NEXT: "diagnostics": [37# CHECK-NEXT: {38# CHECK-NEXT: "code": "missing-includes",39# CHECK-NEXT: "codeDescription": {40# CHECK-NEXT: "href": "{{.*}}"41# CHECK-NEXT: },42# CHECK-NEXT: "message": "No header providing \"Foo\" is directly included (fixes available)",43# CHECK-NEXT: "range": {44# CHECK-NEXT: "end": {45# CHECK-NEXT: "character": 4,46# CHECK-NEXT: "line": 247# CHECK-NEXT: },48# CHECK-NEXT: "start": {49# CHECK-NEXT: "character": 1,50# CHECK-NEXT: "line": 251# CHECK-NEXT: }52# CHECK-NEXT: },53# CHECK-NEXT: "severity": 3,54# CHECK-NEXT: "source": "clangd"55# CHECK-NEXT: },56# CHECK-NEXT: {57# CHECK-NEXT: "code": "missing-includes",58# CHECK-NEXT: "codeDescription": {59# CHECK-NEXT: "href": "{{.*}}"60# CHECK-NEXT: },61# CHECK-NEXT: "message": "No header providing \"Bar\" is directly included (fixes available)",62# CHECK-NEXT: "range": {63# CHECK-NEXT: "end": {64# CHECK-NEXT: "character": 14,65# CHECK-NEXT: "line": 266# CHECK-NEXT: },67# CHECK-NEXT: "start": {68# CHECK-NEXT: "character": 11,69# CHECK-NEXT: "line": 270# CHECK-NEXT: }71# CHECK-NEXT: },72# CHECK-NEXT: "severity": 3,73# CHECK-NEXT: "source": "clangd"74# CHECK-NEXT: },75# CHECK-NEXT: {76# CHECK-NEXT: "code": "unused-includes",77# CHECK-NEXT: "codeDescription": {78# CHECK-NEXT: "href": "{{.*}}"79# CHECK-NEXT: },80# CHECK-NEXT: "message": "Included header all1.h is not used directly (fixes available)",81# CHECK-NEXT: "range": {82# CHECK-NEXT: "end": {83# CHECK-NEXT: "character": 17,84# CHECK-NEXT: "line": 085# CHECK-NEXT: },86# CHECK-NEXT: "start": {87# CHECK-NEXT: "character": 0,88# CHECK-NEXT: "line": 089# CHECK-NEXT: }90# CHECK-NEXT: },91# CHECK-NEXT: "severity": 2,92# CHECK-NEXT: "source": "clangd",93# CHECK-NEXT: "tags": [94# CHECK-NEXT: 195# CHECK-NEXT: ]96# CHECK-NEXT: },97# CHECK-NEXT: {98# CHECK-NEXT: "code": "unused-includes",99# CHECK-NEXT: "codeDescription": {100# CHECK-NEXT: "href": "{{.*}}"101# CHECK-NEXT: },102# CHECK-NEXT: "message": "Included header all2.h is not used directly (fixes available)",103# CHECK-NEXT: "range": {104# CHECK-NEXT: "end": {105# CHECK-NEXT: "character": 17,106# CHECK-NEXT: "line": 1107# CHECK-NEXT: },108# CHECK-NEXT: "start": {109# CHECK-NEXT: "character": 0,110# CHECK-NEXT: "line": 1111# CHECK-NEXT: }112# CHECK-NEXT: },113# CHECK-NEXT: "severity": 2,114# CHECK-NEXT: "source": "clangd",115# CHECK-NEXT: "tags": [116# CHECK-NEXT: 1117# CHECK-NEXT: ]118# CHECK-NEXT: }119# CHECK-NEXT: ],120# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",121# CHECK-NEXT: "version": 0122# CHECK-NEXT: }123---124{"jsonrpc":"2.0","id":2,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///simple.cpp"},"range":{"start":{"line":2,"character":1},"end":{"line":2,"character":4}},"context":{"diagnostics":[{"range":{"start": {"line": 2, "character": 1}, "end": {"line": 2, "character": 4}},"severity":3,"message":"No header providing \"Foo\" is directly included (fixes available)", "code": "missing-includes", "source": "clangd"}]}}}125# CHECK: "id": 2,126# CHECK-NEXT: "jsonrpc": "2.0",127# CHECK-NEXT: "result": [128# CHECK-NEXT: {129# CHECK-NEXT: "arguments": [130# CHECK-NEXT: {131# CHECK-NEXT: "documentChanges": [132# CHECK-NEXT: {133# CHECK-NEXT: "edits": [134# CHECK-NEXT: {135# CHECK-NEXT: "newText": "#include {{.*}}foo.h{{.*}}",136# CHECK-NEXT: "range": {137# CHECK-NEXT: "end": {138# CHECK-NEXT: "character": 0,139# CHECK-NEXT: "line": 2140# CHECK-NEXT: },141# CHECK-NEXT: "start": {142# CHECK-NEXT: "character": 0,143# CHECK-NEXT: "line": 2144# CHECK-NEXT: }145# CHECK-NEXT: }146# CHECK-NEXT: }147# CHECK-NEXT: ],148# CHECK-NEXT: "textDocument": {149# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",150# CHECK-NEXT: "version": 0151# CHECK-NEXT: }152# CHECK-NEXT: }153# CHECK-NEXT: ]154# CHECK-NEXT: }155# CHECK-NEXT: ],156# CHECK-NEXT: "command": "clangd.applyFix",157# CHECK-NEXT: "title": "Apply fix: #include {{.*}}foo.h{{.*}}"158# CHECK-NEXT: },159# CHECK-NEXT: {160# CHECK-NEXT: "arguments": [161# CHECK-NEXT: {162# CHECK-NEXT: "documentChanges": [163# CHECK-NEXT: {164# CHECK-NEXT: "edits": [165# CHECK-NEXT: {166# CHECK-NEXT: "newText": "#include {{.*}}bar.h{{.*}}",167# CHECK-NEXT: "range": {168# CHECK-NEXT: "end": {169# CHECK-NEXT: "character": 0,170# CHECK-NEXT: "line": 2171# CHECK-NEXT: },172# CHECK-NEXT: "start": {173# CHECK-NEXT: "character": 0,174# CHECK-NEXT: "line": 2175# CHECK-NEXT: }176# CHECK-NEXT: }177# CHECK-NEXT: },178# CHECK-NEXT: {179# CHECK-NEXT: "newText": "#include {{.*}}foo.h{{.*}}",180# CHECK-NEXT: "range": {181# CHECK-NEXT: "end": {182# CHECK-NEXT: "character": 0,183# CHECK-NEXT: "line": 2184# CHECK-NEXT: },185# CHECK-NEXT: "start": {186# CHECK-NEXT: "character": 0,187# CHECK-NEXT: "line": 2188# CHECK-NEXT: }189# CHECK-NEXT: }190# CHECK-NEXT: }191# CHECK-NEXT: ],192# CHECK-NEXT: "textDocument": {193# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",194# CHECK-NEXT: "version": 0195# CHECK-NEXT: }196# CHECK-NEXT: }197# CHECK-NEXT: ]198# CHECK-NEXT: }199# CHECK-NEXT: ],200# CHECK-NEXT: "command": "clangd.applyFix",201# CHECK-NEXT: "title": "Apply fix: add all missing includes"202# CHECK-NEXT: },203# CHECK-NEXT: {204# CHECK-NEXT: "arguments": [205# CHECK-NEXT: {206# CHECK-NEXT: "documentChanges": [207# CHECK-NEXT: {208# CHECK-NEXT: "edits": [209# CHECK-NEXT: {210# CHECK-NEXT: "newText": "",211# CHECK-NEXT: "range": {212# CHECK-NEXT: "end": {213# CHECK-NEXT: "character": 0,214# CHECK-NEXT: "line": 1215# CHECK-NEXT: },216# CHECK-NEXT: "start": {217# CHECK-NEXT: "character": 0,218# CHECK-NEXT: "line": 0219# CHECK-NEXT: }220# CHECK-NEXT: }221# CHECK-NEXT: },222# CHECK-NEXT: {223# CHECK-NEXT: "newText": "",224# CHECK-NEXT: "range": {225# CHECK-NEXT: "end": {226# CHECK-NEXT: "character": 0,227# CHECK-NEXT: "line": 2228# CHECK-NEXT: },229# CHECK-NEXT: "start": {230# CHECK-NEXT: "character": 0,231# CHECK-NEXT: "line": 1232# CHECK-NEXT: }233# CHECK-NEXT: }234# CHECK-NEXT: },235# CHECK-NEXT: {236# CHECK-NEXT: "newText": "#include {{.*}}bar.h{{.*}}",237# CHECK-NEXT: "range": {238# CHECK-NEXT: "end": {239# CHECK-NEXT: "character": 0,240# CHECK-NEXT: "line": 2241# CHECK-NEXT: },242# CHECK-NEXT: "start": {243# CHECK-NEXT: "character": 0,244# CHECK-NEXT: "line": 2245# CHECK-NEXT: }246# CHECK-NEXT: }247# CHECK-NEXT: },248# CHECK-NEXT: {249# CHECK-NEXT: "newText": "#include {{.*}}foo.h{{.*}}",250# CHECK-NEXT: "range": {251# CHECK-NEXT: "end": {252# CHECK-NEXT: "character": 0,253# CHECK-NEXT: "line": 2254# CHECK-NEXT: },255# CHECK-NEXT: "start": {256# CHECK-NEXT: "character": 0,257# CHECK-NEXT: "line": 2258# CHECK-NEXT: }259# CHECK-NEXT: }260# CHECK-NEXT: }261# CHECK-NEXT: ],262# CHECK-NEXT: "textDocument": {263# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",264# CHECK-NEXT: "version": 0265# CHECK-NEXT: }266# CHECK-NEXT: }267# CHECK-NEXT: ]268# CHECK-NEXT: }269# CHECK-NEXT: ],270# CHECK-NEXT: "command": "clangd.applyFix",271# CHECK-NEXT: "title": "Apply fix: fix all includes"272# CHECK-NEXT: }273# CHECK-NEXT: ]274---275{"jsonrpc":"2.0","id":3,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"test:///simple.cpp"},"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":17}},"context":{"diagnostics":[{"range":{"start": {"line": 0, "character": 0}, "end": {"line": 0, "character": 17}},"severity":2,"message":"Included header all1.h is not used directly (fixes available)", "code": "unused-includes", "source": "clangd"}]}}}276# CHECK: "id": 3,277# CHECK-NEXT: "jsonrpc": "2.0",278# CHECK-NEXT: "result": [279# CHECK-NEXT: {280# CHECK-NEXT: "arguments": [281# CHECK-NEXT: {282# CHECK-NEXT: "documentChanges": [283# CHECK-NEXT: {284# CHECK-NEXT: "edits": [285# CHECK-NEXT: {286# CHECK-NEXT: "newText": "",287# CHECK-NEXT: "range": {288# CHECK-NEXT: "end": {289# CHECK-NEXT: "character": 0,290# CHECK-NEXT: "line": 1291# CHECK-NEXT: },292# CHECK-NEXT: "start": {293# CHECK-NEXT: "character": 0,294# CHECK-NEXT: "line": 0295# CHECK-NEXT: }296# CHECK-NEXT: }297# CHECK-NEXT: }298# CHECK-NEXT: ],299# CHECK-NEXT: "textDocument": {300# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",301# CHECK-NEXT: "version": 0302# CHECK-NEXT: }303# CHECK-NEXT: }304# CHECK-NEXT: ]305# CHECK-NEXT: }306# CHECK-NEXT: ],307# CHECK-NEXT: "command": "clangd.applyFix",308# CHECK-NEXT: "title": "Apply fix: remove #include directive"309# CHECK-NEXT: },310# CHECK-NEXT: {311# CHECK-NEXT: "arguments": [312# CHECK-NEXT: {313# CHECK-NEXT: "documentChanges": [314# CHECK-NEXT: {315# CHECK-NEXT: "edits": [316# CHECK-NEXT: {317# CHECK-NEXT: "newText": "",318# CHECK-NEXT: "range": {319# CHECK-NEXT: "end": {320# CHECK-NEXT: "character": 0,321# CHECK-NEXT: "line": 1322# CHECK-NEXT: },323# CHECK-NEXT: "start": {324# CHECK-NEXT: "character": 0,325# CHECK-NEXT: "line": 0326# CHECK-NEXT: }327# CHECK-NEXT: }328# CHECK-NEXT: },329# CHECK-NEXT: {330# CHECK-NEXT: "newText": "",331# CHECK-NEXT: "range": {332# CHECK-NEXT: "end": {333# CHECK-NEXT: "character": 0,334# CHECK-NEXT: "line": 2335# CHECK-NEXT: },336# CHECK-NEXT: "start": {337# CHECK-NEXT: "character": 0,338# CHECK-NEXT: "line": 1339# CHECK-NEXT: }340# CHECK-NEXT: }341# CHECK-NEXT: }342# CHECK-NEXT: ],343# CHECK-NEXT: "textDocument": {344# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",345# CHECK-NEXT: "version": 0346# CHECK-NEXT: }347# CHECK-NEXT: }348# CHECK-NEXT: ]349# CHECK-NEXT: }350# CHECK-NEXT: ],351# CHECK-NEXT: "command": "clangd.applyFix",352# CHECK-NEXT: "title": "Apply fix: remove all unused includes"353# CHECK-NEXT: },354# CHECK-NEXT: {355# CHECK-NEXT: "arguments": [356# CHECK-NEXT: {357# CHECK-NEXT: "documentChanges": [358# CHECK-NEXT: {359# CHECK-NEXT: "edits": [360# CHECK-NEXT: {361# CHECK-NEXT: "newText": "",362# CHECK-NEXT: "range": {363# CHECK-NEXT: "end": {364# CHECK-NEXT: "character": 0,365# CHECK-NEXT: "line": 1366# CHECK-NEXT: },367# CHECK-NEXT: "start": {368# CHECK-NEXT: "character": 0,369# CHECK-NEXT: "line": 0370# CHECK-NEXT: }371# CHECK-NEXT: }372# CHECK-NEXT: },373# CHECK-NEXT: {374# CHECK-NEXT: "newText": "",375# CHECK-NEXT: "range": {376# CHECK-NEXT: "end": {377# CHECK-NEXT: "character": 0,378# CHECK-NEXT: "line": 2379# CHECK-NEXT: },380# CHECK-NEXT: "start": {381# CHECK-NEXT: "character": 0,382# CHECK-NEXT: "line": 1383# CHECK-NEXT: }384# CHECK-NEXT: }385# CHECK-NEXT: },386# CHECK-NEXT: {387# CHECK-NEXT: "newText": "#include {{.*}}bar.h{{.*}}",388# CHECK-NEXT: "range": {389# CHECK-NEXT: "end": {390# CHECK-NEXT: "character": 0,391# CHECK-NEXT: "line": 2392# CHECK-NEXT: },393# CHECK-NEXT: "start": {394# CHECK-NEXT: "character": 0,395# CHECK-NEXT: "line": 2396# CHECK-NEXT: }397# CHECK-NEXT: }398# CHECK-NEXT: },399# CHECK-NEXT: {400# CHECK-NEXT: "newText": "#include {{.*}}foo.h{{.*}}",401# CHECK-NEXT: "range": {402# CHECK-NEXT: "end": {403# CHECK-NEXT: "character": 0,404# CHECK-NEXT: "line": 2405# CHECK-NEXT: },406# CHECK-NEXT: "start": {407# CHECK-NEXT: "character": 0,408# CHECK-NEXT: "line": 2409# CHECK-NEXT: }410# CHECK-NEXT: }411# CHECK-NEXT: }412# CHECK-NEXT: ],413# CHECK-NEXT: "textDocument": {414# CHECK-NEXT: "uri": "file://{{.*}}/simple.cpp",415# CHECK-NEXT: "version": 0416# CHECK-NEXT: }417# CHECK-NEXT: }418# CHECK-NEXT: ]419# CHECK-NEXT: }420# CHECK-NEXT: ],421# CHECK-NEXT: "command": "clangd.applyFix",422# CHECK-NEXT: "title": "Apply fix: fix all includes"423# CHECK-NEXT: }424# CHECK-NEXT: ]425---426{"jsonrpc":"2.0","id":4,"method":"shutdown"}427---428{"jsonrpc":"2.0","method":"exit"}429