Thanks for your interest in contributing!
- Fork and clone the repository
- Follow the build instructions to get a working development environment
- Read ARCHITECTURE.md for an overview of how the codebase is structured
All six CI checks must pass with zero warnings and zero failures:
cargo test
cargo clippy -- -D warnings
cargo clippy --tests -- -D warnings
cargo fmt --check
php -l example.php
php -d zend.assertions=1 example.phpNote that clippy runs twice, once for library code and once including test code. The php -l check ensures example.php remains valid PHP. The php -d zend.assertions=1 run executes runDemoAssertions() to verify that scaffolding stubs actually return what their docblocks claim.
- Run
cargo fmtbefore committing - Fix clippy warnings rather than suppressing them. Avoid
#[allow(clippy::...)]unless truly necessary. - Add
///doc comments to all public functions and struct fields
- Integration tests go in
tests/completion_*.rsortests/definition_*.rs, one file per feature area - Use
create_test_backend()fromtests/common/mod.rsfor same-file tests - Use
create_psr4_workspace()for cross-file / PSR-4 tests - Test the happy path, edge cases, and interactions with existing features
- When adding a feature, update
example.phpwith working examples (and verify withphp -l example.php)
See BUILDING.md for more on running tests and manual LSP testing.
Update CHANGELOG.md when your PR adds, changes, or fixes something a user would notice. Add entries under ## [Unreleased] in the appropriate subsection (### Added, ### Fixed, ### Changed, or ### Removed). Write for end users, not developers: describe what changed in the editor, not which internal modules were touched. See the existing entries for the style and level of detail expected.
Open an issue on GitHub with:
- What you expected to happen
- What actually happened
- Steps to reproduce (a minimal PHP snippet is ideal)