Skip to content

docs(symfony): add framework playground - #405

Open
sidux wants to merge 64 commits into
PHPantom-dev:mainfrom
sidux:docs/symfony-playground
Open

sidux wants to merge 64 commits into
PHPantom-dev:mainfrom
sidux:docs/symfony-playground

Conversation

@sidux

@sidux sidux commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add a standalone Symfony editor playground covering PHP, YAML, XML, Twig, translations, Doctrine, forms, validation, events, Messenger, and local configuration schemas
  • include a locked Composer setup while keeping runtime dependencies optional for basic editor exploration
  • document useful files and navigation scenarios
  • keep the example syntax-clean on PHP 8.2

Why

Cross-language framework intelligence is difficult to evaluate from isolated unit fixtures alone. A compact standalone workspace gives users a concrete place to try each interaction and gives maintainers one coherent project for manual regression checks without requiring a bootable application, database, or kernel.

Dependencies

Validation

  • PHP 8.2 syntax lint for all 11 PHP example files
  • cargo clippy --fix --allow-dirty -- -D warnings
  • cargo fmt
  • cargo clippy --all-targets -- -D warnings
  • cargo test — 14,170 passed, 12 ignored

@codecov-commenter

codecov-commenter commented Aug 27, 2026 •

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 87.43998% with 654 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/code_lens.rs 86.86% 121 Missing ⚠️
src/symfony/container.rs 73.72% 108 Missing ⚠️
src/completion/symfony.rs 85.59% 104 Missing ⚠️
src/symfony/events.rs 91.55% 101 Missing ⚠️
src/symfony/expressions.rs 92.92% 45 Missing ⚠️
src/rename/prepare.rs 78.94% 36 Missing ⚠️
src/references/dispatch.rs 58.33% 30 Missing ⚠️
src/references/member_scope.rs 91.14% 24 Missing ⚠️
src/backend/documents.rs 48.83% 22 Missing ⚠️
src/indexing/watch.rs 78.57% 21 Missing ⚠️
... and 8 more

📢 Thoughts on this report? Let us know!

@AJenbo AJenbo added this to the Sprint 8 milestone Aug 27, 2026
@sidux sidux mentioned this pull request Aug 27, 2026
6 tasks
sidux added 7 commits August 30, 2026 17:12
Use the coarse reference index for conclusive zero counts and cache bounded exact member locations for non-zero lenses. Refresh-capable clients avoid eager resolve storms while older clients retain lazy resolution.
Stop reference counts and CodeLens resolves from repeating the full workspace walk for every declaration. Internal annotation requests share the initial index, including callers queued behind it, while an explicit Find References command keeps its single refresh for files created without watcher notifications.
@sidux
sidux force-pushed the docs/symfony-playground branch from d766287 to c2ef704 Compare August 30, 2026 15:33
sidux added 18 commits August 30, 2026 17:40
Resolve fully-qualified classes and Class::member references from arbitrary YAML and XML positions without schema-specific rules.
Feed schema-free class and member occurrences into Find References and CodeLens, including transparent-proxy metadata aliases.
Index semantic framework relationships alongside generic YAML and XML class references.
Pass every indexed target to editor-native navigation and ignore empty PHP resource strings.
Generic YAML and XML navigation now returns early only when it resolves a PHP symbol. Otherwise the semantic Symfony resolver still handles aliases, form fields, validation mappings, and configuration keys.
Build entity-to-repository pairs alongside the framework resource index and update them per URI. CodeLens and reference lookups now read the derived index instead of reopening and rescanning every YAML/XML resource for each declaration.
Discover opt-in generated subclasses by path and marker interface, then canonicalize external metadata without changing PHP type resolution.
Reuse the existing definition and reference pipelines for standard incoming and outgoing call navigation.
sidux and others added 30 commits September 28, 2026 10:51
…oute-intelligence

Brings in main through the updated service-container branch.

- Route parameters rename through the framework index like service ids.
- Twig templates became framework resources here, so the document
  lifecycle indexes YAML, XML, and Twig alike without parsing them as
  PHP, and `*.twig` is now watched so a template changed on disk is
  re-indexed.
- Framework symbol and route-parameter lookups share one location
  helper built on a per-file line index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-intelligence

Brings in main through the updated route-intelligence branch.

- Opening or editing a framework resource schedules its diagnostics in
  the moved document handlers, after the off-loop re-index commits.
- Template names stay out of rename.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lation-intelligence

Brings in main through the updated Twig-template branch. Translation
keys stay out of rename, and translation lookups share the framework
location helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…messenger-intelligence

Brings in main through the updated translation branch. Call hierarchy
already landed upstream (PHPantom-dev#413), so only the proxy and events commits
are applied on top of it.

- Transparent proxies: in YAML/XML a proxy name counts as a reference to
  its real class inside upstream's reworked class search; proxy and
  compiled-container paths are recognised before the watcher's exclusion
  filter, since both usually live in ignored cache directories; startup
  indexing moved to backend/startup.rs.
- Event calls join upstream's cached call-hierarchy resolution; event
  definitions and references run after the workspace index is ready.
- Messenger handler lookups share the framework location helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pression-language-intelligence

Brings in main through the updated events branch. ExpressionLanguage
definitions follow the event definitions in upstream's go-to-definition
handler.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-forms-validation-config-intelligence

Brings in main through the updated ExpressionLanguage branch.

- Mapped properties join the cross-file-type rename: a rename started in
  a validation or form mapping renames the PHP property, and the rename
  search now leaves out only class occurrences in YAML/XML (the escaped
  ones), keeping member-name occurrences for the PHP edit.
- Framework property lookups filter through MemberScope like method
  lookups; property lenses build the class scope once per class and only
  when a resource names the property.
- Config-key lookups share the framework location helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fony-playground

Brings in main through the updated forms/validation branch.

- README: the comparison table was rewritten upstream; the Symfony & Twig
  row now marks PHPantom as supported, and the Symfony feature bullet
  joins the new list.
- The playground lint step pipes through xargs, as the PHP example step
  does, so a file that fails `php -l` fails CI (`find -exec ... \;`
  exits 0 regardless).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Service-proxy and Doctrine proxies are created at runtime, and every
input the event features read names the real class: the compiled
container records the class it hands to the proxy factory, and the
configured #[Event]/#[Listen] rules live on the real methods. The
proxy-to-real-class relation had nothing to feed it, so remove it
along with the [[php.proxies]] setting.
…pression-language-intelligence

Brings in the removal of the transparent proxy mapping. ExpressionLanguage navigation resolves the class it names directly.
…-forms-validation-config-intelligence

Brings in the removal of the transparent proxy mapping.
…fony-playground

Brings in the removal of the transparent proxy mapping.
- Skip vendor/var/cache directories relative to the workspace root, so a
  project that itself lives under /var/www or a temp directory is still
  indexed.
- Convert framework reference offsets through one line index per file
  instead of rescanning the file for every reference.
- Let the type engine answer a member receiver first; the getRepository()
  shortcut only applies when it knows nothing or only Doctrine's generic
  repository, and only reads assignments inside the enclosing function.
- Treat a class as a Doctrine repository only when it extends or
  implements one of Doctrine's repository types, so a project's own
  UserRepository gets no Doctrine lenses, and look repositories and
  entities up by convention and the inheritance index instead of scanning
  every indexed class on each lens request.
…ntainer-intelligence

Brings in the resource indexing and Doctrine lookup fixes. The PHP
configuration paths this branch indexes get the same workspace-relative
skip check, and a `config` directory above the workspace no longer makes
every PHP file look like configuration.

Symfony diagnostics now gather every declared name in one pass over the
framework index, and only for a file that uses one, instead of scanning
the whole index once per symbol kind. Declared names are de-duplicated
through a hash set rather than a linear search per name.
…oute-intelligence

Route declarations are checked through the single-pass declared-name lookup.
…-intelligence

Template declarations are checked through the single-pass declared-name lookup.
…lation-intelligence

Brings in the resource indexing, Doctrine, and diagnostics fixes. The
translation catalogs this branch indexes get the workspace-relative path
checks, and translation usages open the single-pass declared-name lookup.

XLIFF catalogs are now watched alongside YAML, XML, and Twig, so a key
added on disk while the catalog is closed is known without a restart.
…messenger-intelligence

Brings in the resource indexing, Doctrine, diagnostics, and XLIFF watching fixes. Event and bus declarations are checked through the single-pass declared-name lookup.
Refreshing a file's event sites on every parse cloned the whole
configuration and took the event index's write lock even in projects
with no publisher or subscriber rules, where there is nothing to scan.
Check the rules under the configuration lock and only take the write
lock when a previous rule set left sites to drop.

Pass the attributed method to the publisher and subscriber scanners as
one value instead of eight arguments, which removes the clippy allows.
…pression-language-intelligence

Brings in the lower-PR fixes. The attributed-method context sits next to the argument type this branch moved into php_attributes.rs.
…-forms-validation-config-intelligence

Brings in the lower-PR fixes. Configuration-key usages open the single-pass declared-name lookup too, so a YAML file that only sets bundle options keeps its unknown-key diagnostics.
…fony-playground

Brings in the lower-PR fixes.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants