LuaLS / lua-language-server

A language server that offers Lua language support - programmed in Lua
https://luals.github.io
MIT License
3.34k stars 319 forks source link

Support 'textDocument/diagnostic' method and 'diagnosticProvider' capability #2868

Open DanilovDV-git opened 1 month ago

DanilovDV-git commented 1 month ago

How are you using the lua-language-server?

Command Line

Which OS are you using?

Linux

What is the issue affecting?

Diagnostics/Syntax Checking

Expected Behaviour

Server's capabilities contain the 'diagnosticProvider' and lua language server supports method "textDocument/diagnostic"

Actual Behaviour

Server's capabilities don't contain the 'diagnosticProvider' and doesn't support method "textDocument/diagnostic"

Reproduction steps

  1. Get initialize response from server with capabilities
  2. Check capabilities list
  3. Send "textDocument/diagnostic" request

Additional Notes

No response

Log File

[06:38:37.231][info] [#0:/home/github/lua-language-server/main.lua:68]: Lua Lsp startup, root:  /home/github/lua-language-server
[06:38:37.231][info] [#0:/home/github/lua-language-server/main.lua:69]: ROOT:   /home/github/lua-language-server
[06:38:37.231][info] [#0:/home/github/lua-language-server/main.lua:70]: LOGPATH:    /smsfw/log
[06:38:37.231][info] [#0:/home/github/lua-language-server/main.lua:71]: METAPATH:   /home/github/lua-language-server/meta
[06:38:37.231][info] [#0:/home/github/lua-language-server/main.lua:72]: VERSION:    3.10.6
[06:38:37.264][debug][#0:script/pub/pub.lua:50]: Create brave:  1
[06:38:37.264][debug][#0:script/pub/pub.lua:50]: Create brave:  2
[06:38:37.264][debug][#0:script/pub/pub.lua:50]: Create brave:  3
[06:38:37.264][debug][#0:script/pub/pub.lua:50]: Create brave:  4
[06:38:37.264][info] [#0:script/proto/proto.lua:260]: Listen Mode: stdio
[06:38:37.265][info] [#0:script/service/service.lua:146]: 
========= Medical Examination Report =========
    --------------- Memory ---------------
        Total: 2.237 MB
        # 00 : 2.237 MB
        # 01 : 0.000 MB
        # 02 : 0.000 MB
        # 03 : 0.000 MB
        # 04 : 0.000 MB
    --------------- Coroutine ---------------
        Total:     0
        Running:   0
        Suspended: 0
        Normal:    0
        Dead:      0
    --------------- Cache ---------------
        Total: 1
        Dead:  0
    ---------------  RPC  ---------------
        Holdon:   0
        Waiting:  0
==============================================
[06:38:37.371][info] [#0:script/client.lua:657]: Client init    {
  capabilities = {
    textDocument = {
      diagnostic = {
        dynamicRegistration = true
      }
    },
    workspace = {
      configuration = true,
      didChangeConfiguration = {
        dynamicRegistration = false
      }
    }
  },
  rootPath = "/smsfw",
  rootUri = "file:///smsfw",
  trace = "verbose"
}
[06:38:37.371][info] [#0:script/language.lua:137]: VSC language: nil
[06:38:37.371][info] [#0:script/language.lua:138]: LS  language: en-us
[06:38:37.371][info] [#0:script/workspace/workspace.lua:38]: Workspace init root:   file:///smsfw
[06:38:37.371][info] [#0:script/workspace/workspace.lua:42]: Log path:  /smsfw/log/file_smsfw.log
[06:38:37.372][info] [#0:script/workspace/workspace.lua:48]: Workspace create:  file:///smsfw
[06:38:37.372][debug][#0:script/provider/provider.lua:134]: Server init {
  capabilities = {
    codeActionProvider = {
      codeActionKinds = { "", "quickfix", "refactor.rewrite", "refactor.extract" },
      resolveProvider = false
    },
    codeLensProvider = {
      resolveProvider = true
    },
    colorProvider = true,
    completionProvider = {
      resolveProvider = true,
      triggerCharacters = { "\t", "\n", ".", ":", "(", "'", '"', "[", ",", "#", "*", "@", "|", "=", "-", "{", " ", "+", "?" }
    },
    definitionProvider = true,
    documentFormattingProvider = true,
    documentHighlightProvider = true,
    documentOnTypeFormattingProvider = {
      firstTriggerCharacter = "\n"
    },
    documentRangeFormattingProvider = true,
    documentSymbolProvider = true,
    executeCommandProvider = {
      commands = { "lua.removeSpace", "lua.solve", "lua.jsonToLua", "lua.setConfig", "lua.getConfig", "lua.autoRequire" }
    },
    foldingRangeProvider = true,
    hoverProvider = true,
    implementationProvider = true,
    inlayHintProvider = {
      resolveProvider = true
    },
    offsetEncoding = "utf-16",
    referencesProvider = true,
    renameProvider = {
      prepareProvider = true
    },
    semanticTokensProvider = {
      full = true,
      legend = {
        tokenModifiers = { "declaration", "definition", "readonly", "static", "deprecated", "abstract", "async", "modification", "documentation", "defaultLibrary", "global" },
        tokenTypes = { "namespace", "type", "class", "enum", "interface", "struct", "typeParameter", "parameter", "variable", "property", "enumMember", "event", "function", "method", "macro", "keyword", "modifier", "comment", "string", "number", "regexp", "operator", "decorator" }
      },
      range = true
    },
    signatureHelpProvider = {
      triggerCharacters = { "(", "," }
    },
    textDocumentSync = {
      change = 2,
      openClose = true,
      save = {
        includeText = false
      }
    },
    typeDefinitionProvider = true,
    workspace = {
      fileOperations = {
        didRename = {
          filters = { {
              pattern = {
                glob = "/smsfw/**",
                options = {
                  ignoreCase = true
                }
              }
            } }
        }
      },
      workspaceFolders = {
        changeNotifications = true,
        supported = true
      }
    },
    workspaceSymbolProvider = true
  },
  serverInfo = {
    name = "sumneko.lua"
  }
}
[06:38:37.574][info] [#0:script/provider/provider.lua:36]: Load config from specified   /smsfw/test-luals-annotations/luarc.json
[06:38:37.574][info] [#0:script/provider/provider.lua:37]: {
  ["window.progressBar"] = false,
  ["window.statusBar"] = false
}
[06:38:37.574][debug][#0:script/filewatch.lua:53]: Watch add:   /smsfw/test-luals-annotations/
[06:38:37.574][debug][#0:script/filewatch.lua:59]: fw.add   /smsfw/test-luals-annotations/
[06:38:37.575][debug][#0:script/provider/provider.lua:274]: didOpen file:///smsfw/luals/test_scripts/sccp_ns.lua
[06:38:37.575][trace][#0:script/files.lua:288]: Set text:   file:///smsfw/luals/test_scripts/sccp_ns.lua    takes   9.9000000000002e-05 sec.
[06:38:37.575][debug][#0:script/provider/provider.lua:274]: didOpen file:///smsfw/luals/test_scripts/m3ua_ns.lua
[06:38:37.575][trace][#0:script/files.lua:288]: Set text:   file:///smsfw/luals/test_scripts/m3ua_ns.lua    takes   0.00022 sec.
[06:38:37.575][info] [#0:script/provider/provider.lua:49]: Load config from client  file:///smsfw
[06:38:37.575][info] [#0:script/provider/provider.lua:50]: {
  Lua = {
    diagnostics = {
      enable = true,
      ignoredFiles = "Openned",
      libraryFiles = "Openned"
    },
    workspace = {
      checkThirdParty = "",
      library = { "/smsfw/luals/library", "/smsfw/lua-core/luals_annotations/library" }
    }
  }
}
[06:38:37.676][info] [#0:script/provider/provider.lua:65]: Load config from client  fallback
[06:38:37.676][info] [#0:script/provider/provider.lua:66]: {
  Lua = {
    diagnostics = {
      enable = true,
      ignoredFiles = "Openned",
      libraryFiles = "Openned"
    },
    workspace = {
      checkThirdParty = "",
      library = { "/smsfw/luals/library", "/smsfw/lua-core/luals_annotations/library" }
    }
  }
}
[06:38:37.776][warn] [#0:script/proto/proto.lua:170]: Recieved unknown proto: textDocument/diagnostic
CppCXY commented 1 month ago

This protocol has been around for a long time, but correctly implementing it seems to be not easy, and many language clients do not support this protocol.

DanilovDV-git commented 1 month ago

There are no plans to add this functionality in the near future. Am I right?

CppCXY commented 1 month ago

There are no plans to add this functionality in the near future. Am I right?

I remember that this protocol was supported a long time ago, but I might be mistaken. At least, I tried to support this protocol myself, but the experience was actually quite poor. Diagnostics often failed to refresh in VSCode, so I stopped looking into it. If you want to implement it, you can give it a try and submit a PR.

DanilovDV-git commented 1 month ago

Can you advise to me with my case. I need to get diagnostics for many .lua files, but also I have to be sure the server has finished diagnostic all files. What marker can I use?

CppCXY commented 1 month ago

How do you intend to use this language server? If you want to get all diagnostic results, you can directly use the --check command of the lua-language-server. Check the PR for details on how to use it. I'm not very familiar with this language server.

tomlau10 commented 1 month ago

After full searching the codebase I found this: https://github.com/LuaLS/lua-language-server/blob/6ba0c9362ebfec8a668d452b0a752216fd52d543/script/provider/provider.lua#L1457-L1496