ZIm/crates
claytonrcarter 97a9a5de10
snippets: Fix snippets for PHP and ERB languages (#27718)
Closes #21541
Closes #22726

This should fix snippets in languages, like PHP, that are based on the
HTML syntax layer. To be honest, I don't totally get where HTML comes
into it, but the issues outlined in #21541 and #22726 both boil down to
"Zed only shows me HTML snippets in PHP/ERB files; I expected to see
PHP/ERB snippets". This solution is based on the comments between
@mrnugget and @osiewicz in #22726: resolve/combine snippets for all
language layers at the given position, whereas current behavior is to
resolve snippets only for the `.last()` language layer at the given
position.

- add `Buffer:languages_at()` (note the plural)
- update `snippet_completions()` in `editor.rs` to loop over each
language, gathering snippets as it goes
- the primary logic for resolving snippets within a single language has
not changed

### Verifying this change

I couldn't find tests related to snippet and currently active languages
(CI may show them to me 😆 ) but I can add some if desired and w/ perhaps
a little coaching or prompting about another test to look to for
inspiration. I have confirmed that this works for PHP, but I have not
checked ERB because I'm not familiar with it or set up for it.

To check this manually:
1. install the PHP extension
2. install at least 1 snippet for each of html, php and phpdoc. If you
don't have any, these should work:
```sh
# BEWARE these will clobber existing snippets!
echo '{"dddd":{"body":"hello from phpdoc"}}' > ~/.config/zed/snippets/phpdoc.json
echo '{"pppp":{"body":"hello from PHP"}}' > ~/.config/zed/snippets/php.json
echo '{"hhhh":{"body":"hello from HTML"}}' > ~/.config/zed/snippets/html.json
```
3. open any PHP file. If you don't have one, here's one that should
work:
```php
<?php

/**
 *
 */
function function_name()
{
}
```
4. Place your cursor in a PHPdoc comment (eg after the `/**` on line 3)
- you should be able to use the `dddd`, `pppp` and `hhhh` snippets; on
`main`, only the `dddd` snippet works here
5. Move your cursor to a non-comment PHP area (eg after the `{` on line
7)
- you should be able to use the `pppp` and `hhhh` snippets, but not
`dddd`; on `main`, only `hhhh` works here

### Performance

This adds 2 separate (not nested) loops to `snippet_completions()`, each
of which will iterate over the active language scopes at the given
location. I have not looked into the specifics of how many layers most
languages have, but I suspect that *most* users will see identical
performance as before because there will only be 1 scope active most of
the time.

In some cases, though (eg PHP, ERB, maybe template strings in JS), the
editor will be looping over more layers, possibly many in some deeply
injected/embedded cases (I'm thinking of a regex template string in a JS
heredoc string in a PHP script in an HTML file). I don't expect this to
be an issue – nor has it been in my usage and testing – but performance
of snippets could be affected in pathological cases.

### Alternate solutions

Instead of resolving snippets for *all* layers, we could just change how
we pick which language to resolve. Instead of always using `.last()`,
perhaps we could do something more clever. This feels like it could be
tricky and potentially error prone, though.

Release Notes:

- Snippets are now resolved for all languages active at the cursor
location.
- Fixed snippets in PHP, ERB and other languages whose syntax layers are
based on HTML
2025-04-12 00:20:43 +02:00
..
activity_indicator Git activity indicator (#28204) 2025-04-07 18:10:01 +00:00
agent agent: Fix bug where wrong crease for @mention would be displayed (#28558) 2025-04-11 02:04:03 +00:00
anthropic Change zed.dev's default model to Claude 3.7 Sonnet (#28541) 2025-04-10 18:34:04 -03:00
askpass Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
assets Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
assistant assistant: Fix assistant: open prompt library not opening the prompt library (#28156) 2025-04-05 17:10:39 +00:00
assistant_context_editor Remove actions UnfoldAt and FoldAt (#28442) 2025-04-09 17:13:41 +00:00
assistant_settings Actually run the eval and fix a hang when retrieving outline (#28547) 2025-04-11 00:01:33 +00:00
assistant_slash_command Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
assistant_slash_commands Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
assistant_tool Fix diff recalculation hang (#28377) 2025-04-10 22:58:41 +00:00
assistant_tools Actually run the eval and fix a hang when retrieving outline (#28547) 2025-04-11 00:01:33 +00:00
audio Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
auto_update Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
auto_update_ui Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
aws_http_client Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
bedrock bedrock: Add support for tool use, cross-region inference, and Claude 3.7 Thinking (#28137) 2025-04-05 11:16:26 -04:00
breadcrumbs breadcrumbs: Update multibuffer to match singleton (#28267) 2025-04-07 20:26:55 +00:00
buffer_diff Fix diff recalculation hang (#28377) 2025-04-10 22:58:41 +00:00
call Fix deafening new participants (#28330) 2025-04-08 16:01:27 +00:00
channel Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
cli Try to weak-link ScreenCaptureKit always (#28585) 2025-04-11 17:38:14 +00:00
client Upgrade async-tungstenite to tokio (#26193) 2025-04-08 09:17:08 -06:00
clock Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
collab Change zed.dev's default model to Claude 3.7 Sonnet (#28541) 2025-04-10 18:34:04 -03:00
collab_ui Update default vim substitute command behavior and add support for 'g' flag (#28138) 2025-04-09 14:34:51 -06:00
collections Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
command_palette Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
command_palette_hooks Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
component Refine component preview & add serialization (#28545) 2025-04-11 11:43:57 -04:00
component_preview Refine component preview & add serialization (#28545) 2025-04-11 11:43:57 -04:00
context_server agent: Only require confirmation for batch tool when subset of tool calls require confirmation (#28363) 2025-04-08 21:37:10 +00:00
context_server_settings Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
copilot chore: Replace as_any functions with trait upcasting (#28221) 2025-04-08 22:16:27 +02:00
credentials_provider Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
dap debugger: Add support for CodeLLDB (#28376) 2025-04-09 12:57:24 +02:00
dap_adapters debugger: Fix Debugpy spawning & session removal (#28577) 2025-04-11 16:36:54 +02:00
db Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
debugger_tools Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
debugger_ui debugger: UI refinements (#28589) 2025-04-11 17:40:25 +00:00
deepseek Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
diagnostics Introduce "Near" block type (#28032) 2025-04-04 17:37:42 -06:00
docs_preprocessor Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
editor snippets: Fix snippets for PHP and ERB languages (#27718) 2025-04-12 00:20:43 +02:00
eval Actually run the eval and fix a hang when retrieving outline (#28547) 2025-04-11 00:01:33 +00:00
evals Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
extension extension: Use heck instead of convert_case for snake_case check (#28608) 2025-04-11 22:01:25 +00:00
extension_api chore: Bump Rust edition to 2024 (#27800) 2025-03-31 20:55:27 +02:00
extension_cli Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
extension_host Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
extensions_ui Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
feature_flags agent: Auto-capture telemetry feature flag (#28271) 2025-04-10 15:07:48 -05:00
feedback Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
file_finder file_finder: Fix filename matching to require contiguous characters (#28093) 2025-04-05 05:01:56 +05:30
file_icons Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
fs chore: Make objc a workspace level crate (#28258) 2025-04-07 18:46:09 +00:00
fsevent Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
fuzzy Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
git git: Fix logging FromUtf8Error when diffing (#28276) 2025-04-08 11:28:34 -04:00
git_hosting_providers Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
git_ui Fix diff recalculation hang (#28377) 2025-04-10 22:58:41 +00:00
go_to_line editor: Refactor EditorMode::Full (#28546) 2025-04-10 23:22:27 +00:00
google_ai agent: Add support for Google Gemini 2.5 preview (#28326) 2025-04-08 15:00:23 +00:00
gpui History manager (#26369) 2025-04-11 21:34:51 +00:00
gpui_macros Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
gpui_tokio Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
html_to_markdown Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
http_client Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
http_client_tls Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
icons workspace: Implement Extended Terminal Option (#26211) 2025-04-11 16:18:36 +00:00
image_viewer Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
indexed_docs Add --user-data-dir CLI flag and propose renaming support_dir to data_dir (#26886) 2025-04-10 21:16:43 +00:00
inline_completion Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
inline_completion_button Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
install_cli install_cli: Show feedback when installing CLI from welcome screen (#28532) 2025-04-11 01:47:40 +05:30
journal Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
language snippets: Fix snippets for PHP and ERB languages (#27718) 2025-04-12 00:20:43 +02:00
language_extension Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
language_model agent: Add support for Google Gemini 2.5 preview (#28326) 2025-04-08 15:00:23 +00:00
language_model_selector agent: Fix opening configuration view from the model selector (#28154) 2025-04-05 16:32:16 +00:00
language_models language_models: Fix non-streaming Copilot Chat models (#28537) 2025-04-10 20:48:08 +00:00
language_selector Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
language_tools Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
languages task: Poll Rust subcommands on background thread (#28553) 2025-04-11 11:04:10 +00:00
livekit_api Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
livekit_client Fix deafening new participants (#28330) 2025-04-08 16:01:27 +00:00
lmstudio Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
lsp Add support for insert_text_mode of a completion (#28171) 2025-04-07 10:35:11 -06:00
markdown markdown: Track code block metadata in parser (#28543) 2025-04-10 21:49:08 +00:00
markdown_preview Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
media chore: Make objc a workspace level crate (#28258) 2025-04-07 18:46:09 +00:00
menu Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
migrator agent: Use current shell (#28470) 2025-04-09 23:38:36 -06:00
mistral Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
multi_buffer editor: Restore selections to positions after last edit (#28527) 2025-04-10 18:33:49 +00:00
node_runtime Add --user-data-dir CLI flag and propose renaming support_dir to data_dir (#26886) 2025-04-10 21:16:43 +00:00
notifications Merge Component and ComponentPreview trait (#28365) 2025-04-08 16:09:06 -06:00
ollama Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
open_ai open_ai: Disable parallel_tool_calls (#28056) 2025-04-03 22:07:37 +00:00
outline editor: Refactor EditorMode::Full (#28546) 2025-04-10 23:22:27 +00:00
outline_panel editor: Refactor EditorMode::Full (#28546) 2025-04-10 23:22:27 +00:00
panel Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
paths Add --user-data-dir CLI flag and propose renaming support_dir to data_dir (#26886) 2025-04-10 21:16:43 +00:00
picker Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
prettier Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
project Fix a panic in the git store (#28590) 2025-04-11 14:05:51 -04:00
project_panel Fix a bug causing stale optimistic state in the git panel (#28588) 2025-04-11 17:26:39 +00:00
project_symbols Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
prompt_library ai: Separate model settings for each feature (#28088) 2025-04-04 11:40:55 -03:00
prompt_store Actually run the eval and fix a hang when retrieving outline (#28547) 2025-04-11 00:01:33 +00:00
proto Add dedicated actions for LSP completions insertion mode (#28121) 2025-04-08 22:03:03 +00:00
recent_projects History manager (#26369) 2025-04-11 21:34:51 +00:00
refineable Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
release_channel Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
remote Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
remote_server Clean up environment loading a bit (#28356) 2025-04-08 22:16:35 -04:00
repl Upgrade async-tungstenite to tokio (#26193) 2025-04-08 09:17:08 -06:00
reqwest_client Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
rich_text Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
rope chore: Bump Rust version to 1.86 (#28021) 2025-04-03 23:32:50 +02:00
rpc chore: Replace as_any functions with trait upcasting (#28221) 2025-04-08 22:16:27 +02:00
schema_generator Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
search vim: Reset search range after substitute (#28403) 2025-04-09 20:43:53 -06:00
semantic_index Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
semantic_version Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
session Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
settings Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
settings_ui Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
snippet Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
snippet_provider Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
snippets_ui Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
sqlez Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
sqlez_macros Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
story Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
storybook Merge Component and ComponentPreview trait (#28365) 2025-04-08 16:09:06 -06:00
streaming_diff Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
sum_tree Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
supermaven Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
supermaven_api Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
tab_switcher tab_switcher: Add keybind to close tab tooltip (#27212) 2025-04-08 15:57:36 -06:00
task agent: Use current shell (#28470) 2025-04-09 23:38:36 -06:00
tasks_ui debugger: Add console indicator and resolve debug configs from NewSessionModal (#28489) 2025-04-10 22:29:03 +00:00
telemetry Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
telemetry_events telemetry_events: Rename AssistantEvent to AssistantEventData (#28133) 2025-04-04 19:28:32 -04:00
terminal agent: Use current shell (#28470) 2025-04-09 23:38:36 -06:00
terminal_view chore: Replace as_any functions with trait upcasting (#28221) 2025-04-08 22:16:27 +02:00
text format: Re-implement support for formatting with code actions that contain commands (#28392) 2025-04-09 01:53:54 +00:00
theme Add icon for Vyper files (#28307) 2025-04-09 10:49:39 -04:00
theme_extension Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
theme_importer Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
theme_selector Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
time_format Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
title_bar workspace: Implement Extended Terminal Option (#26211) 2025-04-11 16:18:36 +00:00
toolchain_selector Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
ui Refine component preview & add serialization (#28545) 2025-04-11 11:43:57 -04:00
ui_input Merge Component and ComponentPreview trait (#28365) 2025-04-08 16:09:06 -06:00
ui_macros Merge Component and ComponentPreview trait (#28365) 2025-04-08 16:09:06 -06:00
ui_prompt markdown: Don't retain MarkdownStyle in favor of using MarkdownElement directly (#28255) 2025-04-07 19:03:24 +00:00
util agent: Use current shell (#28470) 2025-04-09 23:38:36 -06:00
util_macros Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
vim vim: Add highlighting to set commands (#28600) 2025-04-11 16:03:05 -06:00
vim_mode_setting Add workspace-hack (#27277) 2025-04-02 13:26:34 -07:00
welcome install_cli: Show feedback when installing CLI from welcome screen (#28532) 2025-04-11 01:47:40 +05:30
workspace History manager (#26369) 2025-04-11 21:34:51 +00:00
worktree Fix directory context paths (#28459) 2025-04-09 21:40:46 +00:00
zed History manager (#26369) 2025-04-11 21:34:51 +00:00
zed_actions assistant: Fix assistant: open prompt library not opening the prompt library (#28156) 2025-04-05 17:10:39 +00:00
zeta agent: Add reactions at the response level (#27958) 2025-04-09 14:21:07 -03:00
zlog zlog: Support configuring log levels with env var (#28544) 2025-04-10 22:00:44 +00:00
zlog_settings zlog: Support configuring log levels with env var (#28544) 2025-04-10 22:00:44 +00:00