All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Laravel Facade support: static calls like
Cache::get()now resolve through the container viagetFacadeAccessor(), providing completions and hover cards from the concrete class's methods. - Facade concrete method completion: methods not declared in
@method staticannotations but present on the resolved concrete class are surfaced as static completions. - Nested trait member resolution at all depth levels (trait using another trait using another trait, etc.), propagating methods and properties through the full chain.
@method staticdocblock annotations not settingIsStaticon virtual members, causing them to be filtered out ofClassName::completions.- Trait
usedeclarations inside other traits being silently discarded by the parser, preventing nested trait members from appearing in completions and hover. traitMapentries not being cleaned up on file re-index, causing stale trait associations to persist until process restart.- Windows workspace path containing percent-encoded characters (
%3Afor:) not being decoded, causing the LSP server to index zero files. - All
file://URI-to-path conversions now use proper URL decoding and Windows drive letter handling via the sharedsymbols.URIToPathhelper.
- VSCode extension shipping without bundled LSP binaries due to release CI not copying platform binaries into the extension's
bin/directory before packaging the.vsix.
- VSCode extension failing to start the bundled LSP binary on Windows (
spawn php-lsp ENOENT) by appending.exeto the PATH fallback command. - VSCode extension failing to start the bundled LSP binary on Linux/macOS remote environments by ensuring execute permissions after
.vsixextraction. - Zed extension build failure caused by
unicode-segmentation1.13.0 breakingheck0.4.1 (UnicodeWordsmade private); pinned to 1.12.0.
- Generic-aware type resolution for template-annotated classes and methods, preserving concrete type parameters through completions, hover, and chained calls.
- Generic-aware support for Laravel Eloquent builders and collections, including concrete model propagation for methods such as
query(),where(),get(),first(),find(), and related collection helpers. - Array literal and array-shape inference in resolved expression types, improving type preservation for inferred variables and collection payloads.
- Local
scripts/set-version.shutility to update repository version strings for releases.
- Release automation now targets plain semantic version tags without the previous release prefix.
- Expanded Laravel and Symfony end-to-end fixtures and coverage around generics, array shapes, and framework controller flows.
- Incorrect generic propagation across LSP completions, hover results, and shared resolver paths.
- Variable type inference for generic return values, including Laravel helpers such as
Arr::first()andCollection::first(). - Symfony test fixture compatibility issues that were causing CI instability.
- Multi-source model attribute discovery for Eloquent and Doctrine ORM models.
- Virtual property injection from
@property/@methoddocblock tags on classes. - IDE helper file support (
_ide_helper_models.php,_ide_helper.php) with member merging into existing indexed classes. - Eloquent relation discovery from method return types and
$this->hasMany()/belongsTo()/etc. calls. - Eloquent accessor/mutator detection (both legacy
getNameAttribute()and modernAttributecast). - Eloquent virtual static methods (
where,find,first,with,orderBy, etc.) mimicking__callStaticforwarding. - Doctrine ORM entity support:
#[Column],#[Id],#[GeneratedValue],#[OneToMany],#[ManyToOne],#[OneToOne],#[ManyToMany]PHP 8 attribute parsing. - Doctrine repository class detection and association to entities via
#[Entity(repositoryClass: ...)]. - Database schema introspection for MySQL, PostgreSQL, and SQLite via
.envcredentials with in-memory caching. - Laravel migration file parsing to extract column definitions (
$table->string(),$table->foreignId(),$table->timestamps(), etc.). - Builder string argument completion for column names inside
where(',orderBy(',select(',pluck(',groupBy(', etc. - Builder string argument completion for relation names inside
with(',has(',whereHas(',load(',withCount(', etc. - Array argument support for Builder completions (
select([',get([',with([', etc.). - Strict DB-only column filtering for
get()(only suggests columns from IDE helper, database introspection, or migrations). .envfile parser for reading database connection settings.databaseconfiguration option in LSP initialization settings to enable/disable DB introspection.- Built-in diagnostics engine with standalone
internal/checks/package reusable by CLI tools and CI pipelines. - Unused import detection with word-boundary scanning, aliased imports,
use function/use const, and PHP 8 attributes. - Unused private method and property detection (excludes magic methods).
- Unreachable code detection after
return,throw,exit/die,continue,break. - Redundant union member detection (duplicates,
?Type|null, supertype subsumption formixed,object,iterable). - Redundant nullsafe
?->operator detection on non-nullable types. - Unknown column validation in Builder string arguments (
where,orderBy,select,get, etc.). - Unknown relation validation in Builder string arguments (
with,has,whereHas,load, etc.). - Aggregate relation method second-arg validation (
withSum('relation', 'column')checks column on the related model). DiagnosticTagsupport: unused code greyed out (Unnecessary), deprecated functions struck through (Deprecated).diagnosticRulesconfiguration in.php-lsp.jsonto enable/disable individual diagnostic rules.- Multi-line method chain resolution for hover, go-to-definition, and completions.
resolve.JoinChainLines()helper to join continuation lines starting with->,::, or?->.- Comprehensive chain resolution test suite covering single-line and multi-line Eloquent method chains.
- Hover cards and go-to-definition landing on wrong vendor symbols when method chains span multiple lines.
- Completion provider now resolves multi-line chains correctly instead of falling through to global completions.
- Initial
Tusk PHP LSPrelease with a Go-based PHP language server binary. - VS Code extension packaging for the bundled LSP client.
- Zed extension packaging for the WebAssembly-based extension.
- Cross-platform release artifacts for Linux, macOS, and Windows.