From d6e2390a5564a104dc771d0e5d495f6488ba675e Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Fri, 15 Nov 2024 09:59:53 +0800 Subject: [PATCH] nixd/lib/Controller: disable semantic tokens feature during init (#616) Semantic tokens (current implementation) caused a lot of trouble for users. The common reason is confusing attribute path coloring for "same" tokens. i.e. ```nix { program.a = 1; program.b = 2; } ``` Those two "program"s are colored differently, (looks like a bug frankly). So let's disable it for now, for UX improvement. We can re-enable it later if we have a better implementation. Link: https://github.com/nix-community/nixd/issues/573 --- nixd/docs/features.md | 5 +- nixd/lib/Controller/LifeTime.cpp | 2 +- nixd/tools/nixd/test/initialize.md | 26 ----- .../nixd/test/semantic-tokens/initialize.md | 107 ++++++++++++++++++ 4 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 nixd/tools/nixd/test/semantic-tokens/initialize.md diff --git a/nixd/docs/features.md b/nixd/docs/features.md index eeeab4985..7e87e00f3 100644 --- a/nixd/docs/features.md +++ b/nixd/docs/features.md @@ -32,13 +32,16 @@ Screenshots: ### Semantic Tokens +> [!WARNING] +> This feature is experimental and not enabled by default. + [nixd language server](https://github.com/nix-community/nixd) tries to make some tokens looks different by sending your editor some integers. However, types in nix language is pretty different from standard LSP types. So, as a result, attrnames, selection, variables are colored as different integers, but the colors may, or may not rendered properly in your editor. > [!TIP] -> `--semantic-tokens=false` to disable the feature. +> `--semantic-tokens=true` to enable the feature. #### Attribute name coloring diff --git a/nixd/lib/Controller/LifeTime.cpp b/nixd/lib/Controller/LifeTime.cpp index fb693ca1a..4c9b8ba20 100644 --- a/nixd/lib/Controller/LifeTime.cpp +++ b/nixd/lib/Controller/LifeTime.cpp @@ -38,7 +38,7 @@ opt DefaultNixOSOptionsExpr{ opt EnableSemanticTokens{"semantic-tokens", desc("Enable/Disable semantic tokens"), - init(true), cat(NixdCategory)}; + init(false), cat(NixdCategory)}; // Here we try to wrap nixpkgs, nixos options in a single emtpy attrset in test. std::string getDefaultNixpkgsExpr() { diff --git a/nixd/tools/nixd/test/initialize.md b/nixd/tools/nixd/test/initialize.md index 20058dce1..23eecf413 100644 --- a/nixd/tools/nixd/test/initialize.md +++ b/nixd/tools/nixd/test/initialize.md @@ -49,32 +49,6 @@ CHECK-NEXT: "referencesProvider": true, CHECK-NEXT: "renameProvider": { CHECK-NEXT: "prepareProvider": true CHECK-NEXT: }, -CHECK-NEXT: "semanticTokensProvider": { -CHECK-NEXT: "full": true, -CHECK-NEXT: "legend": { -CHECK-NEXT: "tokenModifiers": [ -CHECK-NEXT: "static", -CHECK-NEXT: "abstract", -CHECK-NEXT: "async" -CHECK-NEXT: ], -CHECK-NEXT: "tokenTypes": [ -CHECK-NEXT: "function", -CHECK-NEXT: "string", -CHECK-NEXT: "number", -CHECK-NEXT: "type", -CHECK-NEXT: "keyword", -CHECK-NEXT: "variable", -CHECK-NEXT: "interface", -CHECK-NEXT: "variable", -CHECK-NEXT: "regexp", -CHECK-NEXT: "macro", -CHECK-NEXT: "method", -CHECK-NEXT: "regexp", -CHECK-NEXT: "regexp" -CHECK-NEXT: ] -CHECK-NEXT: }, -CHECK-NEXT: "range": false -CHECK-NEXT: }, CHECK-NEXT: "textDocumentSync": { CHECK-NEXT: "change": 2, CHECK-NEXT: "openClose": true, diff --git a/nixd/tools/nixd/test/semantic-tokens/initialize.md b/nixd/tools/nixd/test/semantic-tokens/initialize.md new file mode 100644 index 000000000..5fa92e212 --- /dev/null +++ b/nixd/tools/nixd/test/semantic-tokens/initialize.md @@ -0,0 +1,107 @@ +# RUN: nixd --lit-test --semantic-tokens=true < %s | FileCheck %s + +Check basic handshake with the server, i.e. "initialize" + +<-- initialize(0) + +```json +{ + "jsonrpc":"2.0", + "id":0, + "method":"initialize", + "params":{ + "processId":123, + "rootPath":"", + "capabilities":{ }, + "trace":"off" + } +} +``` + +<-- reply:initialize(0) + +``` + CHECK: { +CHECK-NEXT: "id": 0, +CHECK-NEXT: "jsonrpc": "2.0", +CHECK-NEXT: "result": { +CHECK-NEXT: "capabilities": { +CHECK-NEXT: "codeActionProvider": { +CHECK-NEXT: "codeActionKinds": [ +CHECK-NEXT: "quickfix" +CHECK-NEXT: ], +CHECK-NEXT: "resolveProvider": false +CHECK-NEXT: }, +CHECK-NEXT: "completionProvider": { +CHECK-NEXT: "resolveProvider": true, +CHECK-NEXT: "triggerCharacters": [ +CHECK-NEXT: "." +CHECK-NEXT: ] +CHECK-NEXT: }, +CHECK-NEXT: "definitionProvider": true, +CHECK-NEXT: "documentFormattingProvider": true, +CHECK-NEXT: "documentHighlightProvider": true, +CHECK-NEXT: "documentLinkProvider": {}, +CHECK-NEXT: "documentSymbolProvider": true, +CHECK-NEXT: "hoverProvider": true, +CHECK-NEXT: "inlayHintProvider": true, +CHECK-NEXT: "referencesProvider": true, +CHECK-NEXT: "renameProvider": { +CHECK-NEXT: "prepareProvider": true +CHECK-NEXT: }, +CHECK-NEXT: "semanticTokensProvider": { +CHECK-NEXT: "full": true, +CHECK-NEXT: "legend": { +CHECK-NEXT: "tokenModifiers": [ +CHECK-NEXT: "static", +CHECK-NEXT: "abstract", +CHECK-NEXT: "async" +CHECK-NEXT: ], +CHECK-NEXT: "tokenTypes": [ +CHECK-NEXT: "function", +CHECK-NEXT: "string", +CHECK-NEXT: "number", +CHECK-NEXT: "type", +CHECK-NEXT: "keyword", +CHECK-NEXT: "variable", +CHECK-NEXT: "interface", +CHECK-NEXT: "variable", +CHECK-NEXT: "regexp", +CHECK-NEXT: "macro", +CHECK-NEXT: "method", +CHECK-NEXT: "regexp", +CHECK-NEXT: "regexp" +CHECK-NEXT: ] +CHECK-NEXT: }, +CHECK-NEXT: "range": false +CHECK-NEXT: }, +CHECK-NEXT: "textDocumentSync": { +CHECK-NEXT: "change": 2, +CHECK-NEXT: "openClose": true, +CHECK-NEXT: "save": true +CHECK-NEXT: } +CHECK-NEXT: } +CHECK-NEXT: "serverInfo": { +CHECK-NEXT: "name": "nixd", +CHECK-NEXT: "version": {{.*}} +CHECK-NEXT: } +CHECK-NEXT: } +CHECK-NEXT: } +``` + +<-- initialized + +```json +{ + "jsonrpc":"2.0", + "method":"initialized", + "params":{ + + } +} +``` + + +```json +{"jsonrpc":"2.0","method":"exit"} +```