Re implement variable list completions

This commit is contained in:
Anthony
2025-02-28 10:17:06 -05:00
parent d50d3e4342
commit 3c4acf045e
2 changed files with 75 additions and 80 deletions

View File

@@ -2,11 +2,13 @@ use super::{
stack_frame_list::{StackFrameList, StackFrameListEvent},
variable_list::VariableList,
};
use collections::HashMap;
use dap::{OutputEvent, OutputEventGroup};
use editor::{
display_map::{Crease, CreaseId},
Anchor, CompletionProvider, Editor, EditorElement, EditorStyle, FoldPlaceholder,
};
use fuzzy::StringMatchCandidate;
use gpui::{Context, Entity, Render, Subscription, Task, TextStyle, WeakEntity};
use language::{Buffer, CodeLabel, LanguageServerId};
use menu::Confirm;
@@ -33,7 +35,7 @@ pub struct Console {
query_bar: Entity<Editor>,
session: Entity<Session>,
_subscriptions: Vec<Subscription>,
_variable_list: Entity<VariableList>,
variable_list: Entity<VariableList>,
stack_frame_list: Entity<StackFrameList>,
}
@@ -99,7 +101,7 @@ impl Console {
session,
console,
query_bar,
_variable_list: variable_list,
variable_list,
_subscriptions,
stack_frame_list,
groups: Vec::default(),
@@ -391,78 +393,74 @@ impl CompletionProvider for ConsoleQueryBarCompletionProvider {
impl ConsoleQueryBarCompletionProvider {
fn variable_list_completions(
&self,
_console: &Entity<Console>,
_buffer: &Entity<Buffer>,
_buffer_position: language::Anchor,
_cx: &mut Context<Editor>,
console: &Entity<Console>,
buffer: &Entity<Buffer>,
buffer_position: language::Anchor,
cx: &mut Context<Editor>,
) -> gpui::Task<gpui::Result<Vec<project::Completion>>> {
unimplemented!("Need to fix this for the refactor");
// let (variables, string_matches) = console.update(cx, |console, cx| {
// let mut variables = HashMap::new();
// let mut string_matches = Vec::new();
let (variables, string_matches) = console.update(cx, |console, cx| {
let mut variables = HashMap::new();
let mut string_matches = Vec::new();
// for variable in console.variable_list.update(cx, |variable_list, cx| {
// variable_list.completion_variables(cx)
// }) {
// if let Some(evaluate_name) = &variable.variable.dap.evaluate_name {
// variables.insert(evaluate_name.clone(), variable.variable.dap.value.clone());
// string_matches.push(StringMatchCandidate {
// id: 0,
// string: evaluate_name.clone(),
// char_bag: evaluate_name.chars().collect(),
// });
// }
for variable in console.variable_list.update(cx, |variable_list, cx| {
variable_list.completion_variables(cx)
}) {
if let Some(evaluate_name) = &variable.evaluate_name {
variables.insert(evaluate_name.clone(), variable.value.clone());
string_matches.push(StringMatchCandidate {
id: 0,
string: evaluate_name.clone(),
char_bag: evaluate_name.chars().collect(),
});
}
// variables.insert(
// variable.variable.dap.name.clone(),
// variable.variable.dap.value.clone(),
// );
variables.insert(variable.name.clone(), variable.value.clone());
// string_matches.push(StringMatchCandidate {
// id: 0,
// string: variable.variable.dap.name.clone(),
// char_bag: variable.variable.dap.name.chars().collect(),
// });
// }
string_matches.push(StringMatchCandidate {
id: 0,
string: variable.name.clone(),
char_bag: variable.name.chars().collect(),
});
}
// (variables, string_matches)
// });
(variables, string_matches)
});
// let query = buffer.read(cx).text();
let query = buffer.read(cx).text();
// cx.spawn(|_, cx| async move {
// let matches = fuzzy::match_strings(
// &string_matches,
// &query,
// true,
// 10,
// &Default::default(),
// cx.background_executor().clone(),
// )
// .await;
cx.spawn(|_, cx| async move {
let matches = fuzzy::match_strings(
&string_matches,
&query,
true,
10,
&Default::default(),
cx.background_executor().clone(),
)
.await;
// Ok(matches
// .iter()
// .filter_map(|string_match| {
// let variable_value = variables.get(&string_match.string)?;
Ok(matches
.iter()
.filter_map(|string_match| {
let variable_value = variables.get(&string_match.string)?;
// Some(project::Completion {
// old_range: buffer_position..buffer_position,
// new_text: string_match.string.clone(),
// label: CodeLabel {
// filter_range: 0..string_match.string.len(),
// text: format!("{} {}", string_match.string.clone(), variable_value),
// runs: Vec::new(),
// },
// server_id: LanguageServerId(usize::MAX),
// documentation: None,
// lsp_completion: Default::default(),
// confirm: None,
// resolved: true,
// })
// })
// .collect())
// })
Some(project::Completion {
old_range: buffer_position..buffer_position,
new_text: string_match.string.clone(),
label: CodeLabel {
filter_range: 0..string_match.string.len(),
text: format!("{} {}", string_match.string.clone(), variable_value),
runs: Vec::new(),
},
server_id: LanguageServerId(usize::MAX),
documentation: None,
lsp_completion: Default::default(),
confirm: None,
resolved: true,
})
})
.collect())
})
}
fn client_completions(

View File

@@ -6,11 +6,7 @@ use gpui::{
ListState, MouseDownEvent, Point, Subscription,
};
use project::debugger::session::Session;
use std::{
collections::HashMap,
path::{Path, PathBuf},
sync::Arc,
};
use std::{collections::HashMap, sync::Arc};
use ui::{prelude::*, ContextMenu, ListItem};
use util::debug_panic;
@@ -195,16 +191,17 @@ impl VariableList {
}
}
// pub fn completion_variables(&self, cx: &mut Context<Self>) -> Vec<VariableContainer> {
// let stack_frame_id = self
// .stack_frame_list
// .update(cx, |this, cx| this.get_main_stack_frame_id(cx));
// self.variables
// .range((stack_frame_id, u64::MIN)..(stack_frame_id, u64::MAX))
// .flat_map(|(_, containers)| containers.variables.iter().cloned())
// .collect()
// }
// debugger(todo): This only returns visible variables will need to change it to show all variables
// within a stack frame scope
pub fn completion_variables(&self, _cx: &mut Context<Self>) -> Vec<dap::Variable> {
self.entries
.iter()
.filter_map(|entry| match entry {
VariableListEntry::Variable((variable, ..)) => Some(variable.clone()),
_ => None,
})
.collect()
}
fn render_entry(&mut self, ix: usize, cx: &mut Context<Self>) -> AnyElement {
let Some(entry) = self.entries.get(ix) else {