# ER図

## 概要

本ドキュメントは、lua-language-serverプロジェクトにおける主要なデータ構造間の関係をER図として表現したものです。

## ER図（Mermaid形式）

```mermaid
erDiagram
    files ||--o{ file : contains
    files ||--o{ parser_state : manages
    file ||--o| parser_state : "has state"

    file {
        string uri PK "ファイルURI"
        integer id "内部ID"
        integer ref "参照カウント"
        boolean trusted "信頼フラグ"
        string originText "元テキスト"
        string text "処理済テキスト"
        integer version "バージョン"
        integer compileCount "コンパイル回数"
    }

    parser_state {
        string uri FK "関連ファイルURI"
        string lua "Luaソース"
        table ast "抽象構文木"
        string originText "元テキスト"
    }

    vm_global ||--|{ vm_global_link : "has links"
    vm_global_link ||--o{ parser_object : "references sets"
    vm_global_link ||--o{ parser_object : "references gets"

    vm_global {
        string name PK "グローバル名"
        string cate "カテゴリ"
        string uri "定義元URI"
    }

    vm_global_link {
        string uri PK "ファイルURI"
    }

    parser_object {
        integer start "開始位置"
        integer finish "終了位置"
        string type "ノードタイプ"
    }

    scope_manager ||--o{ scope : manages
    scope ||--o{ file : "contains files"

    scope {
        string type PK "スコープタイプ"
        string uri "ルートURI"
        string folderName "フォルダ名"
        boolean _removed "削除フラグ"
    }

    scope_manager {
        scope override "オーバーライドスコープ"
        scope fallback "フォールバックスコープ"
    }

    config ||--|| scope : "applied to"

    config {
        table data "設定データ"
        string uri "設定ファイルURI"
    }
```

## 関係の説明

### files - file
- `files` モジュールは複数の `file` エンティティを `fileMap` で管理
- 1対多の関係

### file - parser_state
- 各 `file` は1つの `parser_state` を持つことができる
- `stateMap` を通じて関連付けられる
- 1対0または1の関係

### vm_global - vm_global_link
- 各 `vm_global` は複数のURIに対する `vm_global_link` を持つ
- 1対多の関係

### vm_global_link - parser_object
- 各リンクは `sets`（代入箇所）と `gets`（参照箇所）のリストを持つ
- 1対多の関係

### scope_manager - scope
- スコープマネージャーは複数の `scope` を管理
- `override`、`fallback`、および複数の `folder` スコープ
- 1対多の関係

### scope - file
- 各 `scope` は複数の `file` を含むことができる
- `isChildUri` と `isLinkedUri` で所属を判定
- 1対多の関係

### config - scope
- 設定はスコープに適用される
- 1対1の関係

## クラス図（補足）

```mermaid
classDiagram
    class files {
        +table openMap
        +table fileMap
        +table dllMap
        +integer globalVersion
        +integer fileCount
        +open(uri)
        +close(uri)
        +setText(uri, text)
        +remove(uri)
        +getState(uri)
    }

    class file {
        +string uri
        +integer id
        +integer ref
        +boolean trusted
        +string text
        +string originText
        +integer version
        +parser_state state
    }

    class parser_state {
        +string uri
        +string lua
        +table ast
        +table diffInfo
    }

    class vm_global {
        +string name
        +string cate
        +string uri
        +table links
        +addSet(uri, source)
        +addGet(uri, source)
        +getSets(suri)
        +dropUri(uri)
    }

    class scope {
        +string type
        +string uri
        +string folderName
        +table _links
        +table _data
        +isChildUri(uri)
        +isLinkedUri(uri)
        +isVisible(uri)
    }

    files "1" --> "*" file : manages
    file "1" --> "0..1" parser_state : has
    vm_global "1" --> "*" parser_object : references
    scope "1" --> "*" file : contains
```

## データフロー

```mermaid
flowchart TD
    A[エディタからのファイル変更] --> B[files.setText]
    B --> C[file エンティティ作成/更新]
    C --> D[parser.compile]
    D --> E[parser_state 生成]
    E --> F[vm.global 更新]
    F --> G[診断・補完等の機能提供]

    H[ワークスペース設定変更] --> I[scope 更新]
    I --> J[config リロード]
    J --> K[関連ファイル再解析]
    K --> D
```
