# Changelog

## [v0.8.9] - 2026-07-31

### Fixed

- Fixed `Remove unused variable` and `Prefix unused parameter` quick-fixes never being offered: the code-action message match checked for `"Variable '...'"`/`"Parameter '...'"` prefixes that never occurred, instead of the actual `"Unused variable '...'"`/`"Unused parameter '...'"` diagnostic text.
- Fixed `uri_to_file_path` breaking the `lattice.run` and `lattice.runSpec` commands on builds where `File::SEPARATOR` is `'/'`: it now detects a Windows drive-letter path directly instead of branching on `File::SEPARATOR`.
- Fixed `callHierarchy/incomingCalls` returning nearly every method in the workspace as a caller. The search is now scoped to each candidate's own method body instead of scanning its entire file.
- Fixed duplicate `WorkspaceIndex` entries for the same file when a path built by walking the workspace directory tree and a path decoded from a `textDocument` URI differed only in separator or drive-letter casing. Cache keys are now normalized before lookup and storage.
- Fixed the regex-based symbol indexer storing a declaration's indentation width as its `column`, instead of the name token's actual offset, so call/type hierarchy items pointed at the start of the line rather than the symbol name.
- Fixed `textDocument/prepareCallHierarchy` and `textDocument/prepareTypeHierarchy` failing to resolve any namespaced method or nested type, because the lookup only matched a symbol's exact fully-qualified name (e.g. `"MyClass::run"`) against the bare identifier under the cursor (e.g. `"run"`). Both now match on exact name or a `"::name"` suffix via a new `WorkspaceIndex#find_by_name_or_suffix`.
- Fixed `textDocument/prepareCallHierarchy` stripping the `?`/`!` suffix from the identifier under the cursor, so methods like `empty?` or `save!` never resolved. It now uses the same suffix-preserving word extraction already used for document highlighting.
- Fixed `typeHierarchy/supertypes` failing to walk past one level of nesting for the same exact-name-only lookup reason; it now uses `find_by_name_or_suffix` for both the type and its parent-type lookups.

## [v0.8.8] - 2026-07-30

### Fixed

- Fixed `callHierarchy/incomingCalls`, `callHierarchy/outgoingCalls`, `typeHierarchy/supertypes`, and `typeHierarchy/subtypes` failing with a `-32603 Internal error` ("Expected String but was Int") whenever a client sent back a `CallHierarchyItem` or `TypeHierarchyItem` received from the corresponding `prepare` request. `SymbolKind` now has a matching read-side JSON deserializer, so it round-trips consistently as an integer instead of falling back to Crystal's default string-based enum parsing.

## [v0.8.7] - 2026-06-24

### Fixed

- Apply permission guard (File::Info.readable?) to all three recursive directory walkers (scan_directory, scan_directory_for_lib, scan_stdlib_directory), preventing crashes when traversing directories without read permission.

## [v0.8.6] - 2026-05-28

### Fixed

- CI implementations created


## [v0.8.5] - 2026-05-27

### Fixed Issue #1

- Fixed


## [v0.8.3] - 2026-05-19

### Changed

- added a flag to track whether the client supports pull-mode diagnostics, and skip send_diagnostics (push) when it does

## [v0.8.2] - 2026-05-17

### Changed

- CI fixes

## [v0.8.1] - 2026-05-16

### Added

- Added CHANGELOG

### Changed

- version bump

