Skip to content

Commit 2bda744

Browse files
authored
Clangd (#82)
* Working on clangd language server noci * More on Cpp.hs test noci
1 parent c2dffe8 commit 2bda744

4 files changed

Lines changed: 80 additions & 7 deletions

File tree

modules/kernels/cpp/default.nix

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
, cling
55
, clang
66
, xeus-cling
7+
, llvmPackages
78

89
, settings
910
, settingsSchema
@@ -17,8 +18,13 @@ with lib;
1718
let
1819
attrs = [flavor] ++ settings.interface.attrs;
1920

21+
kernelName = "cpp";
22+
2023
common = callPackage ../common.nix {};
2124

25+
languageServers = lib.optionals settings.lsp.clangd.enable
26+
[(callPackage ./language_server_clangd { inherit kernelName llvmPackages; })];
27+
2228
displaySuffix = {
2329
"c++17" = " 17";
2430
"c++20" = " 20";
@@ -80,10 +86,12 @@ symlinkJoin {
8086
(callPackage ./kernel_xeus.nix {
8187
inherit attrs displayName extensions;
8288
std = flavor;
83-
kernelName = "cpp";
89+
inherit kernelName;
8490
})
8591
cling
86-
];
92+
]
93+
++ languageServers
94+
;
8795

8896
passthru = {
8997
meta = clang.meta // {
@@ -100,6 +108,7 @@ symlinkJoin {
100108
clang = clang.version;
101109
cling = cling.unwrapped.version;
102110
xeus-cling = xeus-cling.version;
111+
clangd = llvmPackages.clang-tools.version;
103112
std = flavor;
104113
};
105114
inherit settings settingsSchema;
@@ -117,6 +126,6 @@ symlinkJoin {
117126
code_mirror_mode = "clike";
118127
code_mirror_mime_type = "text/x-c++src";
119128
};
120-
languageServerNames = [];
129+
languageServerNames = map (x: x.languageServerName) languageServers;
121130
};
122131
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{ lib
2+
, callPackage
3+
, llvmPackages
4+
5+
, kernelName
6+
}:
7+
8+
let
9+
common = callPackage ../../common.nix {};
10+
11+
clangd = llvmPackages.clang-tools;
12+
13+
languageServerName = "clangd";
14+
15+
passthru = {
16+
inherit languageServerName;
17+
};
18+
19+
in
20+
21+
common.writeTextDirWithMetaAndPassthru clangd.meta passthru "lib/codedown/language-servers/cpp-${kernelName}-clangd.yaml" (lib.generators.toYAML {} [{
22+
name = languageServerName;
23+
version = clangd.version;
24+
extensions = ["cpp" "hpp" "cxx" "hxx" "c" "h"];
25+
notebook_suffix = ".cpp";
26+
attrs = ["cpp"];
27+
type = "stream";
28+
primary = true;
29+
args = [
30+
"${clangd}/bin/clangd"
31+
];
32+
}])

modules/kernels/cpp/module.nix

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ in
5757
type = types.listOf types.str;
5858
default = ["cpp" "hpp" "cxx" "hxx" "c" "h"];
5959
};
60+
61+
lsp.clangd.enable = mkOption {
62+
example = "Enable clangd language server";
63+
type = types.bool;
64+
default = true;
65+
};
6066
};
6167
};
6268

tests/app/Spec/Tests/Cpp.hs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
{-# LANGUAGE RankNTypes #-}
22
{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
3+
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
34

45
module Spec.Tests.Cpp (tests) where
56

67
import Data.String.Interpolate
78
import Data.Text
9+
import Language.LSP.Protocol.Types
810
import Test.Sandwich as Sandwich
911
import TestLib.JupyterRunnerContext
12+
import TestLib.LSP
1013
import TestLib.NixEnvironmentContext
1114
import TestLib.NixTypes
1215
import TestLib.TestSearchers
@@ -26,24 +29,47 @@ tests = describe "C++" $ parallel $ do
2629
tests' "c++23"
2730
tests' "c++2c"
2831

32+
testsWithLsp "c++23"
33+
2934
tests' :: Text -> LanguageSpec
3035
tests' flavor = describe [i|C++ (#{flavor})|] $ introduceNixEnvironment [kernelSpec flavor] [] "C++" $ introduceJupyterRunner $ do
3136
testKernelStdout "cpp" [__i|\#include <iostream>
3237
using namespace std;
3338
cout << "hi" << endl;|] "hi\n"
3439

40+
testsWithLsp :: Text -> LanguageSpec
41+
testsWithLsp flavor = describe [i|C++ (#{flavor}) with LSP|] $ introduceNixEnvironment [kernelSpecWithLsp flavor] [] "C++" $ do
42+
describe "LSP" $ do
43+
testDiagnostics'' "simple" lsName "test.cpp" (Just "cpp")
44+
[__i|int main() {
45+
undefined_function();
46+
return 0;
47+
}|] [] $ \diags -> do
48+
info [i|Got diags: #{diags}|]
49+
info [i|Got ranges: #{getDiagnosticRanges' diags}|]
50+
getDiagnosticRanges' diags `shouldBe` [(Range (Position 1 2) (Position 1 20), Just (InR "undeclared_var_use"), "Use of undeclared identifier 'undefined_function'")]
51+
52+
lsName :: Text
53+
lsName = "clangd"
3554

3655
kernelSpec :: Text -> NixKernelSpec
37-
kernelSpec flavor = NixKernelSpec {
56+
kernelSpec flavor = kernelSpec' [[i|flavor = "#{flavor}"|]]
57+
58+
kernelSpecWithLsp :: Text -> NixKernelSpec
59+
kernelSpecWithLsp flavor = kernelSpec' [
60+
[i|flavor = "#{flavor}"|]
61+
, "lsp.clangd.enable = true"
62+
]
63+
64+
kernelSpec' :: [Text] -> NixKernelSpec
65+
kernelSpec' extraConfig = NixKernelSpec {
3866
nixKernelName = "cpp"
3967
, nixKernelChannel = "codedown"
4068
, nixKernelDisplayName = Just "CPP"
4169
, nixKernelPackages = []
4270
, nixKernelMeta = Nothing
4371
, nixKernelIcon = Nothing
44-
, nixKernelExtraConfig = Just [
45-
[i|flavor = "#{flavor}"|]
46-
]
72+
, nixKernelExtraConfig = Just extraConfig
4773
}
4874

4975
main :: IO ()

0 commit comments

Comments
 (0)