{"id":42932645,"url":"https://github.com/usagi-coffee/abl-language-server","last_synced_at":"2026-04-04T15:02:04.975Z","repository":{"id":335503209,"uuid":"1143317645","full_name":"usagi-coffee/abl-language-server","owner":"usagi-coffee","description":"Language Server Protocol implementation for OpenEdge ABL","archived":false,"fork":false,"pushed_at":"2026-03-17T13:12:52.000Z","size":517,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-18T03:47:20.849Z","etag":null,"topics":["language-client","language-server-protocol","lsp","openedge","openedge-abl","rust","tree-sitter"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/usagi-coffee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-27T12:39:25.000Z","updated_at":"2026-03-17T13:12:58.000Z","dependencies_parsed_at":"2026-02-21T10:13:15.662Z","dependency_job_id":null,"html_url":"https://github.com/usagi-coffee/abl-language-server","commit_stats":null,"previous_names":["usagi-coffee/abl-language-server"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/usagi-coffee/abl-language-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usagi-coffee%2Fabl-language-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usagi-coffee%2Fabl-language-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usagi-coffee%2Fabl-language-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usagi-coffee%2Fabl-language-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/usagi-coffee","download_url":"https://codeload.github.com/usagi-coffee/abl-language-server/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usagi-coffee%2Fabl-language-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31403952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["language-client","language-server-protocol","lsp","openedge","openedge-abl","rust","tree-sitter"],"created_at":"2026-01-30T19:09:56.537Z","updated_at":"2026-04-04T15:02:04.965Z","avatar_url":"https://github.com/usagi-coffee.png","language":"Rust","funding_links":[],"categories":["Tools and libraries"],"sub_categories":["Zed"],"readme":"# abl-language-server\n\nLanguage Server Protocol (LSP) implementation for ABL (OpenEdge Advanced Business Language), supports parser-based language features for ABL and optional DB schema integration via `.df` dump files.\n\nThe language server supports optional document formatting (auto-indent only). Formatting is disabled by default.\n\n## Extensions\n\n[zed-openedge-abl](https://github.com/usagi-coffee/zed-openedge-abl)\n\n[vscode-openedge-abl](https://github.com/usagi-coffee/vscode-openedge-abl)\n\n## Features\n\n| Feature                               | Notes                                                                                                         |\n| ------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| Text sync                             | `TextDocumentSyncKind::FULL`                                                                                  |\n| Parser diagnostics                    | Tree-sitter syntax errors (`is_error` / `is_missing`)                                                         |\n| Semantic diagnostics: function arity  | Checks `function_call` argument count against known function definitions (current file + included `.i` files) |\n| Completion: local symbols             | Variables/definitions with case-insensitive prefix filtering                                                  |\n| Completion: DB tables                 | Uses configured `.df` dump files                                                                              |\n| Completion: DB fields after `table.`  | Supports table names and buffer aliases (`DEFINE BUFFER ... FOR ...`)                                         |\n| Completion item details/docs          | Field type in `detail`; `LABEL` / `FORMAT` / `DESCRIPTION` in docs when available                             |\n| Go to Definition: local               | Local definitions                                                                                             |\n| Go to Definition: includes            | Scoped include-aware function definitions                                                                     |\n| Go to Definition: DB schema           | Tables, fields, indexes from `.df`; buffer alias -\u003e table definition                                          |\n| Ambient declarations                  | Built-in bundled ABL ambient declarations plus optional configured ambient `.i` files                         |\n| Find References: DB table definitions | Returns matching `ADD TABLE` locations from `.df`                                                             |\n| Hover: local symbols                  | Type/detail hover                                                                                             |\n| Hover: functions                      | Signature with parameters + return type, include-aware, ambient-aware                                         |\n| Hover: DB schema                      | Table / field / index; field metadata includes type/label/format/description                                  |\n| Semantic tokens                       | Highlights DB table identifiers (`token type: type`)                                                          |\n| Formatting (auto-indent)              | Parser-aware indentation only; guarded by AST-shape check and optional idempotence check                      |\n\n## Configuration (`abl.toml`)\n\nThe server searches for `abl.toml` in the opened workspace root.\n\n### Supported options\n\n```toml\n# Optional\n# Inherit one or more other config files (relative to this file or absolute path).\ninherits = [\"shared/abl.base.toml\"]\n\n# Optional (by defualt searches relative to the opened root directory)\n# Supports absolute paths and workspace-root-relative paths, order is preserved.\npropath = [\"/global/a\", \"includes\", \"shared/includes\"]\n\n# Optional\n# Database schemas: supports explicit paths and wildcard patterns.\ndumpfile = [\"schema/*.df\", \"schema/custom.df\"]\n\n[ambient]\n# Optional; defaults to true.\n# Built-in ambient declarations bundled with the language server binary.\nbuiltin = true\n\n# Optional additional ambient declaration files; supports explicit paths and wildcard patterns.\npaths = [\"ambient/*.i\", \"vendor/abl/index.i\"]\n\n[completion]\nenabled = true\n\n[diagnostics]\nenabled = true\n\n[diagnostics.unknown_variables]\nenabled = true\nexclude = [\"legacy/*.p\", \"generated/procedures\"]\nignore = [\"batchrun\", \"today\", \"now\"]\n\n[diagnostics.unknown_functions]\nenabled = true\nexclude = \"generated/sql/*\"\nignore = [\"abs\", \"round\", \"my_dynamic_fn\"]\n\n[semantic_tokens]\nenabled = true\n\n[formatting]\nenabled = false\nindent_size = 2\nuse_tabs = false\nidempotence = true\n```\n\n### Option reference\n\n| Key                       | Type                 | Default | Description                                                                           |\n| ------------------------- | -------------------- | ------- | ------------------------------------------------------------------------------------- |\n| `inherits`                | `string \\| string[]` | `[]`    | Parent config file(s) to load first; child config overrides parent values            |\n| `completion.enabled`      | `bool`               | `true`  | Enables completion responses                                                          |\n| `diagnostics.enabled`     | `bool`               | `true`  | Enables/disables all diagnostic publishing (syntax + semantic arity)                 |\n| `diagnostics.unknown_variables.enabled`  | `bool`               | `true`  | Enables/disables unknown-variable diagnostics                                           |\n| `diagnostics.unknown_variables.exclude`  | `string \\| string[]` | `[]`    | File/path patterns where unknown-variable diagnostics are skipped; relative patterns resolve from the config file that defines them |\n| `diagnostics.unknown_variables.ignore`   | `string \\| string[]` | `[]`    | Symbol names ignored by unknown-variable diagnostics (case-insensitive)               |\n| `diagnostics.unknown_functions.enabled`  | `bool`               | `true`  | Enables/disables unknown-function diagnostics                                           |\n| `diagnostics.unknown_functions.exclude`  | `string \\| string[]` | `[]`    | File/path patterns where unknown-function diagnostics are skipped; relative patterns resolve from the config file that defines them |\n| `diagnostics.unknown_functions.ignore`   | `string \\| string[]` | `[]`    | Function names ignored by unknown-function diagnostics (case-insensitive)             |\n| `semantic_tokens.enabled` | `bool`               | `true`  | Enables semantic token responses (DB table identifier highlighting)                   |\n| `formatting.enabled`      | `bool`               | `false` | Enables/disables `textDocument/formatting` response                                    |\n| `formatting.indent_size`  | `usize`              | `2`     | Spaces per indent level for formatter fallback/default behavior                        |\n| `formatting.use_tabs`      | `bool`               | `false` | Prefer tabs for indentation (LSP editor options may override per request)             |\n| `formatting.idempotence`   | `bool`               | `true`  | Runs second-pass formatting equality check before applying edits                       |\n| `dumpfile`                | `string \\| string[]` | `[]`    | Path(s) or wildcard patterns for `.df` dump files; relative paths resolve from the config file that defines them |\n| `ambient.builtin`         | `bool`               | `true`  | Enables/disables the built-in bundled ambient ABL declarations                         |\n| `ambient.paths`           | `string \\| string[]` | `[]`    | Additional ambient `.i` declaration files or wildcard patterns; relative paths resolve from the config file that defines them |\n| `propath`                 | `string \\| string[]` | `[]`    | Include search roots for `{...}` includes; relative paths resolve from the config file that defines them |\n\n### Inheritance behavior\n\n- `inherits` supports a single path or a list of paths.\n- Relative paths are resolved from the current `abl.toml` directory.\n- Parent config(s) are merged first, then the current file overrides them.\n- `dumpfile`, `ambient.paths`, and `propath` are concatenated in merge order (parent entries first, then child entries).\n- `ambient.builtin` is overridden by the last config in merge order.\n\n### Dumpfile behavior\n\n- `.df` files are parsed with `tree-sitter-df`.\n- Schema index includes tables, fields, and indexes.\n- Wildcard dumpfile patterns are expanded before loading.\n- Index reload is triggered when:\n  - `abl.toml` changes\n  - configured dumpfile is saved/changed\n\n### Ambient declaration behavior\n\n- Built-in ABL ambient declarations from the repository `./ambient` directory are bundled into the binary at compile time.\n- Built-in ambient declarations are enabled by default and can be disabled with `ambient.builtin = false`.\n- Additional ambient declaration files can be added through `ambient.paths`.\n- `ambient.paths` supports wildcard patterns such as `ambient/*.i`.\n\n### Include resolution behavior\n\nWhen resolving `{include.i}`, the server checks in this order:\n\n1. Absolute include path (if include is absolute)\n2. Each `propath` entry in merge order (including inherited configs)\n3. Each config file directory participating in inheritance merge order (implicit include roots)\n\n## License\n\n```LICENSE\nMIT License\n\nCopyright (c) Kamil Jakubus and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusagi-coffee%2Fabl-language-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fusagi-coffee%2Fabl-language-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusagi-coffee%2Fabl-language-server/lists"}