Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions modules/kernels/cpp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
, cling
, clang
, xeus-cling
, llvmPackages

, settings
, settingsSchema
Expand All @@ -17,8 +18,13 @@ with lib;
let
attrs = [flavor] ++ settings.interface.attrs;

kernelName = "cpp";

common = callPackage ../common.nix {};

languageServers = lib.optionals settings.lsp.clangd.enable
[(callPackage ./language_server_clangd { inherit kernelName llvmPackages; })];

displaySuffix = {
"c++17" = " 17";
"c++20" = " 20";
Expand Down Expand Up @@ -80,10 +86,12 @@ symlinkJoin {
(callPackage ./kernel_xeus.nix {
inherit attrs displayName extensions;
std = flavor;
kernelName = "cpp";
inherit kernelName;
})
cling
];
]
++ languageServers
;

passthru = {
meta = clang.meta // {
Expand All @@ -100,6 +108,7 @@ symlinkJoin {
clang = clang.version;
cling = cling.unwrapped.version;
xeus-cling = xeus-cling.version;
clangd = llvmPackages.clang-tools.version;
std = flavor;
};
inherit settings settingsSchema;
Expand All @@ -117,6 +126,6 @@ symlinkJoin {
code_mirror_mode = "clike";
code_mirror_mime_type = "text/x-c++src";
};
languageServerNames = [];
languageServerNames = map (x: x.languageServerName) languageServers;
};
}
32 changes: 32 additions & 0 deletions modules/kernels/cpp/language_server_clangd/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{ lib
, callPackage
, llvmPackages

, kernelName
}:

let
common = callPackage ../../common.nix {};

clangd = llvmPackages.clang-tools;

languageServerName = "clangd";

passthru = {
inherit languageServerName;
};

in

common.writeTextDirWithMetaAndPassthru clangd.meta passthru "lib/codedown/language-servers/cpp-${kernelName}-clangd.yaml" (lib.generators.toYAML {} [{
name = languageServerName;
version = clangd.version;
extensions = ["cpp" "hpp" "cxx" "hxx" "c" "h"];
notebook_suffix = ".cpp";
attrs = ["cpp"];
type = "stream";
primary = true;
args = [
"${clangd}/bin/clangd"
];
}])
6 changes: 6 additions & 0 deletions modules/kernels/cpp/module.nix
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ in
type = types.listOf types.str;
default = ["cpp" "hpp" "cxx" "hxx" "c" "h"];
};

lsp.clangd.enable = mkOption {
example = "Enable clangd language server";
type = types.bool;
default = true;
};
};
};

Expand Down
34 changes: 30 additions & 4 deletions tests/app/Spec/Tests/Cpp.hs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}

module Spec.Tests.Cpp (tests) where

import Data.String.Interpolate
import Data.Text
import Language.LSP.Protocol.Types
import Test.Sandwich as Sandwich
import TestLib.JupyterRunnerContext
import TestLib.LSP
import TestLib.NixEnvironmentContext
import TestLib.NixTypes
import TestLib.TestSearchers
Expand All @@ -26,24 +29,47 @@ tests = describe "C++" $ parallel $ do
tests' "c++23"
tests' "c++2c"

testsWithLsp "c++23"

tests' :: Text -> LanguageSpec
tests' flavor = describe [i|C++ (#{flavor})|] $ introduceNixEnvironment [kernelSpec flavor] [] "C++" $ introduceJupyterRunner $ do
testKernelStdout "cpp" [__i|\#include <iostream>
using namespace std;
cout << "hi" << endl;|] "hi\n"

testsWithLsp :: Text -> LanguageSpec
testsWithLsp flavor = describe [i|C++ (#{flavor}) with LSP|] $ introduceNixEnvironment [kernelSpecWithLsp flavor] [] "C++" $ do
describe "LSP" $ do
testDiagnostics'' "simple" lsName "test.cpp" (Just "cpp")
[__i|int main() {
undefined_function();
return 0;
}|] [] $ \diags -> do
info [i|Got diags: #{diags}|]
info [i|Got ranges: #{getDiagnosticRanges' diags}|]
getDiagnosticRanges' diags `shouldBe` [(Range (Position 1 2) (Position 1 20), Just (InR "undeclared_var_use"), "Use of undeclared identifier 'undefined_function'")]

lsName :: Text
lsName = "clangd"

kernelSpec :: Text -> NixKernelSpec
kernelSpec flavor = NixKernelSpec {
kernelSpec flavor = kernelSpec' [[i|flavor = "#{flavor}"|]]

kernelSpecWithLsp :: Text -> NixKernelSpec
kernelSpecWithLsp flavor = kernelSpec' [
[i|flavor = "#{flavor}"|]
, "lsp.clangd.enable = true"
]

kernelSpec' :: [Text] -> NixKernelSpec
kernelSpec' extraConfig = NixKernelSpec {
nixKernelName = "cpp"
, nixKernelChannel = "codedown"
, nixKernelDisplayName = Just "CPP"
, nixKernelPackages = []
, nixKernelMeta = Nothing
, nixKernelIcon = Nothing
, nixKernelExtraConfig = Just [
[i|flavor = "#{flavor}"|]
]
, nixKernelExtraConfig = Just extraConfig
}

main :: IO ()
Expand Down
Loading