# API設計書

## 概要

本ドキュメントは、Lua Language Server（lua-language-server）が実装するLanguage Server Protocol (LSP) のAPI仕様を記載しています。lua-language-serverは、LSPに準拠したJSON-RPCベースのプロトコルを使用して、エディタ/IDEとの通信を行います。

**重要**: 本プロジェクトはHTTP REST APIではなく、LSP（Language Server Protocol）を実装しています。LSPはJSON-RPC 2.0をベースとしたプロトコルで、stdio（標準入出力）またはソケット経由で通信を行います。

## 共通仕様

### 通信方式

```
プロトコル: JSON-RPC 2.0
トランスポート: stdio（標準入出力）または Unix Socket
エンコーディング: UTF-8 / UTF-16（クライアント設定に依存）
```

### 認証方式

LSPは認証機構を持たないプロトコルです。lua-language-serverはローカルプロセスとして実行され、エディタ/IDEとプロセス間通信（stdio/socket）を行うため、外部からのネットワークアクセスは想定されていません。

### 共通ヘッダー（JSON-RPCメッセージ）

すべてのJSON-RPCメッセージは以下のHTTPライクなヘッダーを持ちます:

| ヘッダー名 | 必須 | 説明 |
| --- | --- | --- |
| Content-Length | ○ | メッセージボディのバイト数 |
| Content-Type | - | デフォルト: `application/vscode-jsonrpc; charset=utf-8` |

### 共通エラーコード

| エラーコード | 名称 | 説明 |
| --- | --- | --- |
| -32700 | ParseError | JSONパースエラー |
| -32600 | InvalidRequest | 無効なリクエスト |
| -32601 | MethodNotFound | メソッドが見つからない |
| -32602 | InvalidParams | 無効なパラメータ |
| -32603 | InternalError | 内部エラー |
| -32002 | ServerNotInitialized | サーバー未初期化 |
| -32001 | UnknownErrorCode | 不明なエラー |
| -32800 | RequestCancelled | リクエストがキャンセルされた |
| -32801 | ContentModified | コンテンツが変更された |

## API一覧

### ライフサイクル管理

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| ライフサイクル | initialize | サーバー初期化 |
| ライフサイクル | initialized | 初期化完了通知 |
| ライフサイクル | shutdown | サーバーシャットダウン |
| ライフサイクル | exit | サーバー終了 |

### ドキュメント同期

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| ドキュメント同期 | textDocument/didOpen | ドキュメントを開いた通知 |
| ドキュメント同期 | textDocument/didClose | ドキュメントを閉じた通知 |
| ドキュメント同期 | textDocument/didChange | ドキュメント変更通知 |
| ドキュメント同期 | textDocument/didSave | ドキュメント保存通知 |

### 言語機能

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| 言語機能 | textDocument/hover | ホバー情報取得 |
| 言語機能 | textDocument/definition | 定義へ移動 |
| 言語機能 | textDocument/typeDefinition | 型定義へ移動 |
| 言語機能 | textDocument/implementation | 実装へ移動 |
| 言語機能 | textDocument/references | 参照検索 |
| 言語機能 | textDocument/documentHighlight | ドキュメントハイライト |
| 言語機能 | textDocument/documentSymbol | ドキュメントシンボル |
| 言語機能 | textDocument/completion | 補完 |
| 言語機能 | completionItem/resolve | 補完項目詳細解決 |
| 言語機能 | textDocument/signatureHelp | シグネチャヘルプ |
| 言語機能 | textDocument/rename | リネーム |
| 言語機能 | textDocument/prepareRename | リネーム準備 |
| 言語機能 | textDocument/codeAction | コードアクション |
| 言語機能 | textDocument/codeLens | コードレンズ |
| 言語機能 | codeLens/resolve | コードレンズ解決 |
| 言語機能 | textDocument/foldingRange | 折りたたみ範囲 |
| 言語機能 | textDocument/formatting | ドキュメントフォーマット |
| 言語機能 | textDocument/rangeFormatting | 範囲フォーマット |
| 言語機能 | textDocument/onTypeFormatting | 入力時フォーマット |
| 言語機能 | textDocument/documentColor | ドキュメントカラー |
| 言語機能 | textDocument/colorPresentation | カラープレゼンテーション |
| 言語機能 | textDocument/semanticTokens/full | セマンティックトークン（全体） |
| 言語機能 | textDocument/semanticTokens/range | セマンティックトークン（範囲） |
| 言語機能 | textDocument/inlayHint | インレイヒント |
| 言語機能 | inlayHint/resolve | インレイヒント解決 |
| 言語機能 | textDocument/diagnostic | ドキュメント診断 |

### ワークスペース機能

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| ワークスペース | workspace/symbol | ワークスペースシンボル検索 |
| ワークスペース | workspace/executeCommand | コマンド実行 |
| ワークスペース | workspace/didChangeConfiguration | 設定変更通知 |
| ワークスペース | workspace/didChangeWorkspaceFolders | ワークスペースフォルダ変更通知 |
| ワークスペース | workspace/didRenameFiles | ファイルリネーム通知 |
| ワークスペース | workspace/diagnostic | ワークスペース診断 |

### カスタム拡張

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| カスタム | $/cancelRequest | リクエストキャンセル |
| カスタム | $/requestHint | ヒントリクエスト（レガシー） |
| カスタム | $/status/click | ステータスバークリック |
| カスタム | $/status/refresh | ステータスバーリフレッシュ |
| カスタム | $/api/report | APIレポート生成 |
| カスタム | $/psi/view | PSIビュー |
| カスタム | $/psi/select | PSI選択 |
| カスタム | window/workDoneProgress/cancel | 進捗キャンセル |

## 各APIエンドポイント定義

### ライフサイクル管理

#### 1. initialize

サーバーの初期化を行います。クライアントがサーバーに接続した際に最初に送信されるリクエストです。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `initialize` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "processId": 12345,
  "rootUri": "file:///path/to/workspace",
  "capabilities": {
    "textDocument": {
      "completion": {
        "dynamicRegistration": true
      },
      "hover": {
        "dynamicRegistration": true
      }
    },
    "workspace": {
      "configuration": true,
      "workspaceFolders": true
    }
  },
  "workspaceFolders": [
    {
      "uri": "file:///path/to/workspace",
      "name": "workspace"
    }
  ],
  "initializationOptions": {}
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| processId | integer/null | ○ | 親プロセスのID |
| rootUri | string/null | - | ワークスペースのルートURI |
| capabilities | object | ○ | クライアントの能力 |
| workspaceFolders | array | - | ワークスペースフォルダ |
| initializationOptions | object | - | 初期化オプション |

**レスポンス（成功時）**

```json
{
  "capabilities": {
    "offsetEncoding": "utf-16",
    "textDocumentSync": {
      "openClose": true,
      "change": 2
    },
    "hoverProvider": true,
    "definitionProvider": true,
    "typeDefinitionProvider": true,
    "implementationProvider": true,
    "referencesProvider": true,
    "documentHighlightProvider": true,
    "documentSymbolProvider": true,
    "workspaceSymbolProvider": true,
    "codeActionProvider": {
      "codeActionKinds": ["", "quickfix", "refactor.rewrite", "refactor.extract"],
      "resolveProvider": false
    },
    "codeLensProvider": {
      "resolveProvider": true
    },
    "documentFormattingProvider": true,
    "documentRangeFormattingProvider": true,
    "documentOnTypeFormattingProvider": {
      "firstTriggerCharacter": "\n"
    },
    "renameProvider": {
      "prepareProvider": true
    },
    "foldingRangeProvider": true,
    "colorProvider": true,
    "signatureHelpProvider": {
      "triggerCharacters": ["(", ","]
    },
    "semanticTokensProvider": {
      "legend": {
        "tokenTypes": ["namespace", "type", "class", "enum", "interface", "struct", "typeParameter", "parameter", "variable", "property", "enumMember", "event", "function", "method", "macro", "keyword", "modifier", "comment", "string", "number", "regexp", "operator", "decorator"],
        "tokenModifiers": ["declaration", "definition", "readonly", "static", "deprecated", "abstract", "async", "modification", "documentation", "defaultLibrary", "global"]
      },
      "full": true,
      "range": true
    },
    "inlayHintProvider": {
      "resolveProvider": true
    },
    "executeCommandProvider": {
      "commands": ["lua.removeSpace", "lua.solve", "lua.jsonToLua", "lua.setConfig", "lua.getConfig", "lua.autoRequire"]
    }
  },
  "serverInfo": {
    "name": "sumneko.lua",
    "version": "3.x.x"
  }
}
```

---

#### 2. initialized

初期化完了の通知です。クライアントがinitializeレスポンスを処理した後に送信します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `initialized` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "luarcParentUri": "file:///path/to/workspace"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| luarcParentUri | string | - | .luarc.doc.jsonファイルの親フォルダURI |

---

#### 3. shutdown

サーバーのシャットダウンを要求します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `shutdown` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

なし

**レスポンス（成功時）**

```json
true
```

---

#### 4. exit

サーバープロセスを終了します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `exit` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

なし

---

### ドキュメント同期

#### 5. textDocument/didOpen

ドキュメントが開かれたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didOpen` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua",
    "languageId": "lua",
    "version": 1,
    "text": "-- Lua source code\nlocal x = 1"
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| textDocument.languageId | string | ○ | 言語ID（"lua"） |
| textDocument.version | integer | ○ | バージョン番号 |
| textDocument.text | string | ○ | ドキュメントの内容 |

---

#### 6. textDocument/didClose

ドキュメントが閉じられたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didClose` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |

---

#### 7. textDocument/didChange

ドキュメントの内容が変更されたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didChange` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua",
    "version": 2
  },
  "contentChanges": [
    {
      "range": {
        "start": { "line": 0, "character": 0 },
        "end": { "line": 0, "character": 5 }
      },
      "text": "local"
    }
  ]
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| textDocument.version | integer | ○ | 新しいバージョン番号 |
| contentChanges | array | ○ | 変更内容の配列 |

---

#### 8. textDocument/didSave

ドキュメントが保存されたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didSave` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |

---

### 言語機能

#### 9. textDocument/hover

カーソル位置の情報（ホバー情報）を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/hover` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.hover.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 5
  },
  "level": 1
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| position.line | integer | ○ | 行番号（0始まり） |
| position.character | integer | ○ | 文字位置（0始まり） |
| level | integer | - | 詳細レベル |

**レスポンス（成功時）**

```json
{
  "contents": {
    "value": "```lua\nlocal x: integer\n```\n\n---\nxは変数です",
    "kind": "markdown"
  },
  "range": {
    "start": { "line": 10, "character": 0 },
    "end": { "line": 10, "character": 5 }
  },
  "maxLevel": 1
}
```

---

#### 10. textDocument/definition

シンボルの定義位置へ移動します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/definition` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 5
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| position.line | integer | ○ | 行番号（0始まり） |
| position.character | integer | ○ | 文字位置（0始まり） |

**レスポンス（成功時）**

```json
[
  {
    "uri": "file:///path/to/definition.lua",
    "range": {
      "start": { "line": 5, "character": 0 },
      "end": { "line": 5, "character": 10 }
    }
  }
]
```

---

#### 11. textDocument/typeDefinition

シンボルの型定義位置へ移動します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/typeDefinition` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

`textDocument/definition`と同じ形式

**レスポンス（成功時）**

`textDocument/definition`と同じ形式

---

#### 12. textDocument/implementation

インターフェースの実装位置へ移動します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/implementation` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

`textDocument/definition`と同じ形式

**レスポンス（成功時）**

`textDocument/definition`と同じ形式

---

#### 13. textDocument/references

シンボルの参照を検索します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/references` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 5
  },
  "context": {
    "includeDeclaration": true
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| position | object | ○ | カーソル位置 |
| context.includeDeclaration | boolean | ○ | 宣言を含むかどうか |

**レスポンス（成功時）**

```json
[
  {
    "uri": "file:///path/to/file.lua",
    "range": {
      "start": { "line": 15, "character": 0 },
      "end": { "line": 15, "character": 5 }
    }
  }
]
```

---

#### 14. textDocument/documentHighlight

ドキュメント内の関連シンボルをハイライトします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/documentHighlight` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

`textDocument/definition`と同じ形式

**レスポンス（成功時）**

```json
[
  {
    "range": {
      "start": { "line": 10, "character": 0 },
      "end": { "line": 10, "character": 5 }
    },
    "kind": 2
  }
]
```

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| kind | integer | 1: Text, 2: Read, 3: Write |

---

#### 15. textDocument/documentSymbol

ドキュメント内のシンボル一覧を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/documentSymbol` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "name": "myFunction",
    "kind": 12,
    "range": {
      "start": { "line": 0, "character": 0 },
      "end": { "line": 10, "character": 3 }
    },
    "selectionRange": {
      "start": { "line": 0, "character": 15 },
      "end": { "line": 0, "character": 25 }
    },
    "children": []
  }
]
```

---

#### 16. textDocument/completion

補完候補を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/completion` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.completion.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 5
  },
  "context": {
    "triggerKind": 1,
    "triggerCharacter": "."
  }
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| position | object | ○ | カーソル位置 |
| context.triggerKind | integer | - | トリガー種別 |
| context.triggerCharacter | string | - | トリガー文字 |

**レスポンス（成功時）**

```json
{
  "isIncomplete": false,
  "items": [
    {
      "label": "myFunction",
      "kind": 3,
      "detail": "function myFunction()",
      "sortText": "0001",
      "insertText": "myFunction",
      "insertTextFormat": 1,
      "documentation": {
        "value": "関数の説明",
        "kind": "markdown"
      }
    }
  ]
}
```

---

#### 17. completionItem/resolve

補完項目の詳細情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `completionItem/resolve` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

補完項目オブジェクト（`textDocument/completion`のレスポンスの項目）

**レスポンス（成功時）**

詳細情報が追加された補完項目オブジェクト

---

#### 18. textDocument/signatureHelp

関数のシグネチャヘルプを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/signatureHelp` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.signatureHelp.enable |
| トリガー文字 | `(`, `,` |

**リクエストパラメータ**

`textDocument/definition`と同じ形式

**レスポンス（成功時）**

```json
{
  "signatures": [
    {
      "label": "function myFunction(a: integer, b: string)",
      "parameters": [
        {
          "label": [20, 31]
        },
        {
          "label": [33, 44]
        }
      ],
      "activeParameter": 0,
      "documentation": {
        "value": "関数の説明",
        "kind": "markdown"
      }
    }
  ]
}
```

---

#### 19. textDocument/rename

シンボルの名前を変更します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/rename` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 5
  },
  "newName": "newVariableName"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントのURI |
| position | object | ○ | カーソル位置 |
| newName | string | ○ | 新しい名前 |

**レスポンス（成功時）**

```json
{
  "changes": {
    "file:///path/to/file.lua": [
      {
        "range": {
          "start": { "line": 10, "character": 0 },
          "end": { "line": 10, "character": 5 }
        },
        "newText": "newVariableName"
      }
    ]
  }
}
```

---

#### 20. textDocument/prepareRename

リネームが可能かどうかを確認します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/prepareRename` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

`textDocument/definition`と同じ形式

**レスポンス（成功時）**

```json
{
  "range": {
    "start": { "line": 10, "character": 0 },
    "end": { "line": 10, "character": 5 }
  },
  "placeholder": "oldName"
}
```

---

#### 21. textDocument/codeAction

コードアクション（クイックフィックス、リファクタリング）を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/codeAction` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 対応アクション | quickfix, refactor.rewrite, refactor.extract |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "range": {
    "start": { "line": 10, "character": 0 },
    "end": { "line": 10, "character": 20 }
  },
  "context": {
    "diagnostics": []
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "title": "未使用の変数を削除",
    "kind": "quickfix",
    "edit": {
      "changes": {
        "file:///path/to/file.lua": [
          {
            "range": {
              "start": { "line": 10, "character": 0 },
              "end": { "line": 10, "character": 20 }
            },
            "newText": ""
          }
        ]
      }
    }
  }
]
```

---

#### 22. textDocument/codeLens

コードレンズを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/codeLens` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.codeLens.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "range": {
      "start": { "line": 0, "character": 0 },
      "end": { "line": 0, "character": 0 }
    },
    "data": {
      "uri": "file:///path/to/file.lua",
      "id": 1
    }
  }
]
```

---

#### 23. codeLens/resolve

コードレンズの詳細を解決します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `codeLens/resolve` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

コードレンズオブジェクト

**レスポンス（成功時）**

コマンドが追加されたコードレンズオブジェクト

---

#### 24. textDocument/foldingRange

折りたたみ可能な範囲を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/foldingRange` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "startLine": 0,
    "endLine": 10,
    "kind": "region"
  }
]
```

---

#### 25. textDocument/formatting

ドキュメント全体をフォーマットします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/formatting` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.format.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "options": {
    "tabSize": 4,
    "insertSpaces": true
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "range": {
      "start": { "line": 0, "character": 0 },
      "end": { "line": 100, "character": 0 }
    },
    "newText": "-- formatted code\n..."
  }
]
```

---

#### 26. textDocument/rangeFormatting

選択範囲をフォーマットします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/rangeFormatting` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.format.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "range": {
    "start": { "line": 0, "character": 0 },
    "end": { "line": 10, "character": 0 }
  },
  "options": {
    "tabSize": 4,
    "insertSpaces": true
  }
}
```

**レスポンス（成功時）**

`textDocument/formatting`と同じ形式

---

#### 27. textDocument/onTypeFormatting

入力時のフォーマットを行います。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/onTypeFormatting` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| トリガー文字 | `\n`（改行） |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "position": {
    "line": 10,
    "character": 0
  },
  "ch": "\n",
  "options": {
    "tabSize": 4,
    "insertSpaces": true
  }
}
```

**レスポンス（成功時）**

`textDocument/formatting`と同じ形式

---

#### 28. textDocument/documentColor

ドキュメント内のカラー情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/documentColor` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "range": {
      "start": { "line": 5, "character": 10 },
      "end": { "line": 5, "character": 20 }
    },
    "color": {
      "red": 1.0,
      "green": 0.0,
      "blue": 0.0,
      "alpha": 1.0
    }
  }
]
```

---

#### 29. textDocument/colorPresentation

カラーのプレゼンテーション（表示形式）を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/colorPresentation` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "color": {
    "red": 1.0,
    "green": 0.0,
    "blue": 0.0,
    "alpha": 1.0
  },
  "range": {
    "start": { "line": 5, "character": 10 },
    "end": { "line": 5, "character": 20 }
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "label": "#FF0000"
  }
]
```

---

#### 30. textDocument/semanticTokens/full

ドキュメント全体のセマンティックトークンを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/semanticTokens/full` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
{
  "data": [0, 0, 5, 14, 0, 1, 0, 10, 8, 1]
}
```

データは5つの値のグループで構成されます: deltaLine, deltaStartChar, length, tokenType, tokenModifiers

---

#### 31. textDocument/semanticTokens/range

指定範囲のセマンティックトークンを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/semanticTokens/range` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "range": {
    "start": { "line": 0, "character": 0 },
    "end": { "line": 50, "character": 0 }
  }
}
```

**レスポンス（成功時）**

`textDocument/semanticTokens/full`と同じ形式

---

#### 32. textDocument/inlayHint

インレイヒントを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/inlayHint` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.hint.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "range": {
    "start": { "line": 0, "character": 0 },
    "end": { "line": 50, "character": 0 }
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "label": [
      {
        "value": ": integer",
        "tooltip": "変数の型"
      }
    ],
    "position": { "line": 5, "character": 10 },
    "kind": 1,
    "paddingLeft": false,
    "paddingRight": true
  }
]
```

| フィールド名 | 型 | 説明 |
| --- | --- | --- |
| kind | integer | 0: Other, 1: Type, 2: Parameter |

---

#### 33. inlayHint/resolve

インレイヒントの詳細を解決します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `inlayHint/resolve` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

インレイヒントオブジェクト

**レスポンス（成功時）**

インレイヒントオブジェクト

---

#### 34. textDocument/diagnostic

ドキュメントの診断情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/diagnostic` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| プレビュー | true（実験的機能） |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  }
}
```

**レスポンス（成功時）**

```json
{
  "kind": "unchanged",
  "resultId": "file:///path/to/file.lua"
}
```

---

### ワークスペース機能

#### 35. workspace/symbol

ワークスペース内のシンボルを検索します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/symbol` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "query": "myFunction"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| query | string | ○ | 検索クエリ |

**レスポンス（成功時）**

```json
[
  {
    "name": "myFunction",
    "kind": 12,
    "location": {
      "uri": "file:///path/to/file.lua",
      "range": {
        "start": { "line": 0, "character": 0 },
        "end": { "line": 0, "character": 15 }
      }
    }
  }
]
```

---

#### 36. workspace/executeCommand

コマンドを実行します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/executeCommand` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**対応コマンド**

| コマンド | 説明 |
| --- | --- |
| lua.removeSpace | 余分な空白を削除 |
| lua.solve | 問題を解決 |
| lua.jsonToLua | JSONをLuaに変換 |
| lua.setConfig | 設定を変更 |
| lua.getConfig | 設定を取得 |
| lua.autoRequire | 自動require |

**リクエストパラメータ**

```json
{
  "command": "lua.setConfig",
  "arguments": [
    {
      "key": "Lua.diagnostics.enable",
      "action": "set",
      "value": true
    }
  ]
}
```

---

#### 37. workspace/didChangeConfiguration

設定変更の通知を処理します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/didChangeConfiguration` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "settings": {}
}
```

---

#### 38. workspace/didChangeWorkspaceFolders

ワークスペースフォルダの変更を通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/didChangeWorkspaceFolders` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "event": {
    "added": [
      {
        "uri": "file:///path/to/new/folder",
        "name": "newFolder"
      }
    ],
    "removed": []
  }
}
```

---

#### 39. workspace/didRenameFiles

ファイルリネームの通知を処理します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/didRenameFiles` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "files": [
    {
      "oldUri": "file:///path/to/old.lua",
      "newUri": "file:///path/to/new.lua"
    }
  ]
}
```

---

#### 40. workspace/diagnostic

ワークスペース全体の診断を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/diagnostic` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "previousResultIds": []
}
```

**レスポンス（成功時）**

```json
{
  "items": []
}
```

---

### カスタム拡張

#### 41. $/cancelRequest

進行中のリクエストをキャンセルします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/cancelRequest` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "id": 123
}
```

---

#### 42. $/requestHint

ヒント情報を取得します（レガシーAPI）。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/requestHint` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |
| 設定依存 | Lua.hint.enable |

**リクエストパラメータ**

```json
{
  "textDocument": {
    "uri": "file:///path/to/file.lua"
  },
  "range": {
    "start": { "line": 0, "character": 0 },
    "end": { "line": 50, "character": 0 }
  }
}
```

**レスポンス（成功時）**

```json
[
  {
    "text": ": integer",
    "pos": { "line": 5, "character": 10 },
    "kind": 1
  }
]
```

---

#### 43. $/status/click

ステータスバーのクリックイベントを処理します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/status/click` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

---

#### 44. $/status/refresh

ステータスバーの表示を更新します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/status/refresh` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

---

#### 45. $/api/report

APIレポートを生成し、ライブラリとして登録します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/api/report` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "name": "myapi"
}
```

---

#### 46. $/psi/view

PSI（Program Structure Interface）ビューを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/psi/view` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "uri": "file:///path/to/file.lua"
}
```

---

#### 47. $/psi/select

PSI選択を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `$/psi/select` |
| タイプ | Request |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "uri": "file:///path/to/file.lua",
  "position": {
    "line": 10,
    "character": 5
  }
}
```

---

#### 48. window/workDoneProgress/cancel

進行中の作業をキャンセルします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `window/workDoneProgress/cancel` |
| タイプ | Notification |
| 方向 | クライアント -> サーバー |

**リクエストパラメータ**

```json
{
  "token": "progress-token-123"
}
```

---

## シンボル種別

コード補完やシンボル検索で使用される種別コード:

| コード | 名称 | 説明 |
| --- | --- | --- |
| 1 | Text | テキスト |
| 2 | Method | メソッド |
| 3 | Function | 関数 |
| 4 | Constructor | コンストラクタ |
| 5 | Field | フィールド |
| 6 | Variable | 変数 |
| 7 | Class | クラス |
| 8 | Interface | インターフェース |
| 9 | Module | モジュール |
| 10 | Property | プロパティ |
| 11 | Unit | ユニット |
| 12 | Value | 値 |
| 13 | Enum | 列挙型 |
| 14 | Keyword | キーワード |
| 15 | Snippet | スニペット |
| 16 | Color | カラー |
| 17 | File | ファイル |
| 18 | Reference | 参照 |
| 19 | Folder | フォルダ |
| 20 | EnumMember | 列挙メンバー |
| 21 | Constant | 定数 |
| 22 | Struct | 構造体 |
| 23 | Event | イベント |
| 24 | Operator | 演算子 |
| 25 | TypeParameter | 型パラメータ |

## 診断の重要度

| コード | 名称 | 説明 |
| --- | --- | --- |
| 1 | Error | エラー |
| 2 | Warning | 警告 |
| 3 | Information | 情報 |
| 4 | Hint | ヒント |

## 備考

- 本ドキュメントはLua Language Server v3.xの実装に基づいています
- LSPバージョン3.17に準拠していますが、一部の機能はプレビュー段階です
- カスタム拡張メソッド（`$/`プレフィックス）は標準LSPの一部ではなく、特定のクライアント（VSCode拡張など）向けの機能です
- 設定値（`Lua.*`）はクライアントの設定に依存します
- セマンティックトークンの凡例（tokenTypes/tokenModifiers）は初期化時のcapabilitiesで提供されます
