zed-industries / zed

Code at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
https://zed.dev
Other
50.12k stars 3.07k forks source link

lsp settings should support autocomplete via jsonschema #18287

Open notpeter opened 1 month ago

notpeter commented 1 month ago

Describe the feature

Currently we do not support autocomplete/suggestions for keys under the lsp object in settings (not even the name of available language servers) so users are forced to operate blindly.

Beyond that we could actually support JSON schema for autocompleting LSP-specific settings when available. E.g. lsp.vtsls.settings can be validated against the vtsls configuration schema

notpeter commented 1 month ago

Taplo schema: taplo config schema from taplo 0.9.3

taplo.config.schema.json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Config",
  "type": "object",
  "properties": {
    "exclude": {
      "description": "Files to exclude (ignore).\n\nA list of Unix-like [glob](https://en.wikipedia.org/wiki/Glob_(programming)) path patterns. Globstars (`**`) are supported.\n\nRelative paths are **not** relative to the configuration file, but rather depends on the tool using the configuration.\n\nThis has priority over `include`.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string"
      }
    },
    "formatting": {
      "description": "Formatting options.",
      "anyOf": [
        {
          "$ref": "#/definitions/OptionsIncomplete"
        },
        {
          "type": "null"
        }
      ]
    },
    "include": {
      "description": "Files to include.\n\nA list of Unix-like [glob](https://en.wikipedia.org/wiki/Glob_(programming)) path patterns. Globstars (`**`) are supported.\n\nRelative paths are **not** relative to the configuration file, but rather depends on the tool using the configuration.\n\nOmitting this property includes all files, **however an empty array will include none**.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string"
      }
    },
    "plugins": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "$ref": "#/definitions/Plugin"
      }
    },
    "rule": {
      "description": "Rules are used to override configurations by path and keys.",
      "type": "array",
      "items": {
        "$ref": "#/definitions/Rule"
      }
    },
    "schema": {
      "description": "Schema validation options.",
      "anyOf": [
        {
          "$ref": "#/definitions/SchemaOptions"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": false,
  "definitions": {
    "OptionsIncomplete": {
      "description": "All the formatting options.",
      "type": "object",
      "properties": {
        "align_comments": {
          "description": "Align consecutive comments after entries and items vertically.\n\nThis applies to comments that are after entries or array items.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "align_entries": {
          "description": "Align entries vertically.\n\nEntries that have table headers, comments, or blank lines between them are not aligned.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "align_single_comments": {
          "description": "If `align_comments` is true, apply the alignment in cases where there's only one comment.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "allowed_blank_lines": {
          "description": "The maximum amount of consecutive blank lines allowed.",
          "type": [
            "integer",
            "null"
          ],
          "format": "uint",
          "minimum": 0.0
        },
        "array_auto_collapse": {
          "description": "Automatically collapse arrays if they fit in one line.\n\nThe array won't be collapsed if it contains a comment.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "array_auto_expand": {
          "description": "Automatically expand arrays to multiple lines once they exceed the configured `column_width`.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "array_trailing_comma": {
          "description": "Put trailing commas for multiline arrays.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "column_width": {
          "description": "Target maximum column width after which arrays are expanded into new lines.\n\nThis is best-effort and might not be accurate.",
          "type": [
            "integer",
            "null"
          ],
          "format": "uint",
          "minimum": 0.0
        },
        "compact_arrays": {
          "description": "Omit whitespace padding inside single-line arrays.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "compact_entries": {
          "description": "Omit whitespace around `=`.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "compact_inline_tables": {
          "description": "Omit whitespace padding inside inline tables.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "crlf": {
          "description": "Use CRLF line endings",
          "type": [
            "boolean",
            "null"
          ]
        },
        "indent_entries": {
          "description": "Indent entries under tables.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "indent_string": {
          "description": "Indentation to use, should be tabs or spaces but technically could be anything.",
          "type": [
            "string",
            "null"
          ]
        },
        "indent_tables": {
          "description": "Indent subtables if they come in order.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "inline_table_expand": {
          "description": "Expand values (e.g.) inside inline tables where possible.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "reorder_arrays": {
          "description": "Alphabetically reorder array values that are not separated by blank lines.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "reorder_keys": {
          "description": "Alphabetically reorder keys that are not separated by blank lines.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "trailing_newline": {
          "description": "Add trailing newline to the source.",
          "type": [
            "boolean",
            "null"
          ]
        }
      }
    },
    "Plugin": {
      "description": "A plugin to extend Taplo's capabilities.",
      "type": "object",
      "properties": {
        "settings": {
          "description": "Optional settings for the plugin.",
          "default": null
        }
      }
    },
    "Rule": {
      "description": "A rule to override options by either name or file.",
      "type": "object",
      "properties": {
        "exclude": {
          "description": "Files that are excluded from this rule.\n\nA list of Unix-like [glob](https://en.wikipedia.org/wiki/Glob_(programming)) path patterns.\n\nRelative paths are **not** relative to the configuration file, but rather depends on the tool using the configuration.\n\nThis has priority over `include`.",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "formatting": {
          "description": "Formatting options.",
          "anyOf": [
            {
              "$ref": "#/definitions/OptionsIncomplete"
            },
            {
              "type": "null"
            }
          ]
        },
        "include": {
          "description": "Files this rule is valid for.\n\nA list of Unix-like [glob](https://en.wikipedia.org/wiki/Glob_(programming)) path patterns.\n\nRelative paths are **not** relative to the configuration file, but rather depends on the tool using the configuration.\n\nOmitting this property includes all files, **however an empty array will include none**.",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "keys": {
          "description": "Keys the rule is valid for in a document.\n\nA list of Unix-like [glob](https://en.wikipedia.org/wiki/Glob_(programming)) dotted key patterns.\n\nThis allows enabling the rule for specific paths in the document.\n\nFor example:\n\n- `package.metadata` will enable the rule for everything inside the `package.metadata` table, including itself.\n\nIf omitted, the rule will always be valid for all keys.",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "name": {
          "description": "The name of the rule.\n\nUsed in `taplo::` comments.",
          "type": [
            "string",
            "null"
          ]
        },
        "schema": {
          "description": "Schema validation options.",
          "anyOf": [
            {
              "$ref": "#/definitions/SchemaOptions"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "SchemaOptions": {
      "description": "Options for schema validation and completion.\n\nSchemas in rules with defined keys are ignored.",
      "type": "object",
      "properties": {
        "enabled": {
          "description": "Whether the schema should be enabled or not.\n\nDefaults to true if omitted.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "path": {
          "description": "A local file path to the schema, overrides `url` if set.\n\nURLs are also accepted here, but it's not a guarantee and might change in newer releases. Please use the `url` field instead whenever possible.",
          "type": [
            "string",
            "null"
          ]
        },
        "url": {
          "description": "A full absolute URL to the schema.\n\nThe url of the schema, supported schemes are `http`, `https`, `file` and `taplo`.",
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        }
      },
      "additionalProperties": false
    }
  }
}
notpeter commented 1 month ago

~/.ghcup/bin/haskell-language-server-9.10.1 vscode-extension-schema:

haskell-language-server-9.10.1.settings.schema.json
{
    "haskell.plugin.alternateNumberFormat.globalOn": {
        "default": true,
        "description": "Enables alternateNumberFormat plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.cabal-fmt.config.path": {
        "default": "cabal-fmt",
        "markdownDescription": "Set path to 'cabal-fmt' executable",
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.cabal-gild.config.path": {
        "default": "cabal-gild",
        "markdownDescription": "Set path to 'cabal-gild' executable",
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.cabal.codeActionsOn": {
        "default": true,
        "description": "Enables cabal code actions",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.cabal.completionOn": {
        "default": true,
        "description": "Enables cabal completions",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.cabal.diagnosticsOn": {
        "default": true,
        "description": "Enables cabal diagnostics",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.callHierarchy.globalOn": {
        "default": true,
        "description": "Enables callHierarchy plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.changeTypeSignature.globalOn": {
        "default": true,
        "description": "Enables changeTypeSignature plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.class.codeActionsOn": {
        "default": true,
        "description": "Enables class code actions",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.class.codeLensOn": {
        "default": true,
        "description": "Enables class code lenses",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.eval.config.diff": {
        "default": true,
        "markdownDescription": "Enable the diff output (WAS/NOW) of eval lenses",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.eval.config.exception": {
        "default": false,
        "markdownDescription": "Enable marking exceptions with `*** Exception:` similarly to doctest and GHCi.",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.eval.globalOn": {
        "default": true,
        "description": "Enables eval plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.explicit-fields.globalOn": {
        "default": true,
        "description": "Enables explicit-fields plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.explicit-fixity.globalOn": {
        "default": true,
        "description": "Enables explicit-fixity plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.fourmolu.config.external": {
        "default": false,
        "markdownDescription": "Call out to an external \"fourmolu\" executable, rather than using the bundled library.",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.fourmolu.config.path": {
        "default": "fourmolu",
        "markdownDescription": "Set path to executable (for \"external\" mode).",
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.gadt.globalOn": {
        "default": true,
        "description": "Enables gadt plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-code-actions-bindings.globalOn": {
        "default": true,
        "description": "Enables ghcide-code-actions-bindings plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-code-actions-fill-holes.globalOn": {
        "default": true,
        "description": "Enables ghcide-code-actions-fill-holes plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-code-actions-imports-exports.globalOn": {
        "default": true,
        "description": "Enables ghcide-code-actions-imports-exports plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-code-actions-type-signatures.globalOn": {
        "default": true,
        "description": "Enables ghcide-code-actions-type-signatures plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-completions.config.autoExtendOn": {
        "default": true,
        "markdownDescription": "Extends the import list automatically when completing a out-of-scope identifier",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-completions.config.snippetsOn": {
        "default": true,
        "markdownDescription": "Inserts snippets when using code completions",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-completions.globalOn": {
        "default": true,
        "description": "Enables ghcide-completions plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-hover-and-symbols.hoverOn": {
        "default": true,
        "description": "Enables ghcide-hover-and-symbols hover",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-hover-and-symbols.symbolsOn": {
        "default": true,
        "description": "Enables ghcide-hover-and-symbols symbols",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ghcide-type-lenses.config.mode": {
        "default": "always",
        "description": "Control how type lenses are shown",
        "enum": [
            "always",
            "exported",
            "diagnostics"
        ],
        "enumDescriptions": [
            "Always displays type lenses of global bindings",
            "Only display type lenses of exported global bindings",
            "Follows error messages produced by GHC about missing signatures"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.ghcide-type-lenses.globalOn": {
        "default": true,
        "description": "Enables ghcide-type-lenses plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.importLens.codeActionsOn": {
        "default": true,
        "description": "Enables importLens code actions",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.importLens.codeLensOn": {
        "default": true,
        "description": "Enables importLens code lenses",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.moduleName.globalOn": {
        "default": true,
        "description": "Enables moduleName plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.ormolu.config.external": {
        "default": false,
        "markdownDescription": "Call out to an external \"ormolu\" executable, rather than using the bundled library",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.overloaded-record-dot.globalOn": {
        "default": true,
        "description": "Enables overloaded-record-dot plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.pragmas-completion.globalOn": {
        "default": true,
        "description": "Enables pragmas-completion plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.pragmas-disable.globalOn": {
        "default": true,
        "description": "Enables pragmas-disable plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.pragmas-suggest.globalOn": {
        "default": true,
        "description": "Enables pragmas-suggest plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.qualifyImportedNames.globalOn": {
        "default": true,
        "description": "Enables qualifyImportedNames plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.rename.config.crossModule": {
        "default": false,
        "markdownDescription": "Enable experimental cross-module renaming",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.rename.globalOn": {
        "default": true,
        "description": "Enables rename plugin",
        "scope": "resource",
        "type": "boolean"
    },
    "haskell.plugin.semanticTokens.config.classMethodToken": {
        "default": "method",
        "description": "LSP semantic token type to use for typeclass methods",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.classToken": {
        "default": "class",
        "description": "LSP semantic token type to use for typeclasses",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.dataConstructorToken": {
        "default": "enumMember",
        "description": "LSP semantic token type to use for data constructors",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.functionToken": {
        "default": "function",
        "description": "LSP semantic token type to use for functions",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.moduleToken": {
        "default": "namespace",
        "description": "LSP semantic token type to use for modules",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.operatorToken": {
        "default": "operator",
        "description": "LSP semantic token type to use for operators",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.patternSynonymToken": {
        "default": "macro",
        "description": "LSP semantic token type to use for pattern synonyms",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.recordFieldToken": {
        "default": "property",
        "description": "LSP semantic token type to use for record fields",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.typeConstructorToken": {
        "default": "enum",
        "description": "LSP semantic token type to use for type constructors",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.typeFamilyToken": {
        "default": "interface",
        "description": "LSP semantic token type to use for type families",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.typeSynonymToken": {
        "default": "type",
        "description": "LSP semantic token type to use for type synonyms",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.typeVariableToken": {
        "default": "typeParameter",
        "description": "LSP semantic token type to use for type variables",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.config.variableToken": {
        "default": "variable",
        "description": "LSP semantic token type to use for variables",
        "enum": [
            "namespace",
            "type",
            "class",
            "enum",
            "interface",
            "struct",
            "typeParameter",
            "parameter",
            "variable",
            "property",
            "enumMember",
            "event",
            "function",
            "method",
            "macro",
            "keyword",
            "modifier",
            "comment",
            "string",
            "number",
            "regexp",
            "operator",
            "decorator"
        ],
        "enumDescriptions": [
            "LSP Semantic Token Type: namespace",
            "LSP Semantic Token Type: type",
            "LSP Semantic Token Type: class",
            "LSP Semantic Token Type: enum",
            "LSP Semantic Token Type: interface",
            "LSP Semantic Token Type: struct",
            "LSP Semantic Token Type: typeParameter",
            "LSP Semantic Token Type: parameter",
            "LSP Semantic Token Type: variable",
            "LSP Semantic Token Type: property",
            "LSP Semantic Token Type: enumMember",
            "LSP Semantic Token Type: event",
            "LSP Semantic Token Type: function",
            "LSP Semantic Token Type: method",
            "LSP Semantic Token Type: macro",
            "LSP Semantic Token Type: keyword",
            "LSP Semantic Token Type: modifier",
            "LSP Semantic Token Type: comment",
            "LSP Semantic Token Type: string",
            "LSP Semantic Token Type: number",
            "LSP Semantic Token Type: regexp",
            "LSP Semantic Token Type: operator",
            "LSP Semantic Token Type: decorator"
        ],
        "scope": "resource",
        "type": "string"
    },
    "haskell.plugin.semanticTokens.globalOn": {
        "default": false,
        "description": "Enables semanticTokens plugin",
        "scope": "resource",
        "type": "boolean"
    }
}
pjv commented 1 month ago

given that different lsp extensions actually have arbitrary top-level configuration keys (e.g. settings, initialization_options, …), this would be most welcome.