Start on a refactoring assistant
This commit is contained in:
parent
8451e7eb7e
commit
3ad7f528cb
3 changed files with 100 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
pub mod assistant;
|
pub mod assistant;
|
||||||
mod assistant_settings;
|
mod assistant_settings;
|
||||||
|
mod refactor;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
pub use assistant::AssistantPanel;
|
pub use assistant::AssistantPanel;
|
||||||
|
|
88
crates/ai/src/refactor.rs
Normal file
88
crates/ai/src/refactor.rs
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
use collections::HashMap;
|
||||||
|
use editor::Editor;
|
||||||
|
use gpui::{
|
||||||
|
actions, elements::*, AnyViewHandle, AppContext, Entity, Task, View, ViewContext, ViewHandle,
|
||||||
|
};
|
||||||
|
use std::sync::Arc;
|
||||||
|
use workspace::{Modal, Workspace};
|
||||||
|
|
||||||
|
actions!(assistant, [Refactor]);
|
||||||
|
|
||||||
|
fn init(cx: &mut AppContext) {
|
||||||
|
cx.set_global(RefactoringAssistant::new());
|
||||||
|
cx.add_action(RefactoringModal::deploy);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct RefactoringAssistant {
|
||||||
|
pending_edits_by_editor: HashMap<usize, Task<Option<()>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RefactoringAssistant {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
pending_edits_by_editor: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn refactor(&mut self, editor: &ViewHandle<Editor>, prompt: &str, cx: &mut AppContext) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct RefactoringModal {
|
||||||
|
prompt_editor: ViewHandle<Editor>,
|
||||||
|
has_focus: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Entity for RefactoringModal {
|
||||||
|
type Event = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
impl View for RefactoringModal {
|
||||||
|
fn ui_name() -> &'static str {
|
||||||
|
"RefactoringModal"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn focus_in(&mut self, _: AnyViewHandle, _: &mut ViewContext<Self>) {
|
||||||
|
self.has_focus = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext<Self>) {
|
||||||
|
self.has_focus = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Modal for RefactoringModal {
|
||||||
|
fn has_focus(&self) -> bool {
|
||||||
|
self.has_focus
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dismiss_on_event(event: &Self::Event) -> bool {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RefactoringModal {
|
||||||
|
fn deploy(workspace: &mut Workspace, _: &Refactor, cx: &mut ViewContext<Workspace>) {
|
||||||
|
workspace.toggle_modal(cx, |_, cx| {
|
||||||
|
let prompt_editor = cx.add_view(|cx| {
|
||||||
|
Editor::auto_height(
|
||||||
|
4,
|
||||||
|
Some(Arc::new(|theme| theme.search.editor.input.clone())),
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
cx.add_view(|_| RefactoringModal {
|
||||||
|
prompt_editor,
|
||||||
|
has_focus: false,
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABCDEFG
|
||||||
|
// XCDEFG
|
||||||
|
//
|
||||||
|
//
|
11
prompt.md
Normal file
11
prompt.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Given a snippet as the input, you must produce an array of edits. An edit has the following structure:
|
||||||
|
|
||||||
|
{ skip: "skip", delete: "delete", insert: "insert" }
|
||||||
|
|
||||||
|
`skip` is a string in the input that should be left unchanged. `delete` is a string in the input located right after the skipped text that should be deleted. `insert` is a new string that should be inserted after the end of the text in `skip`. It's crucial that a string in the input can only be skipped or deleted once and only once.
|
||||||
|
|
||||||
|
Your task is to produce an array of edits. `delete` and `insert` can be empty if nothing changed. When `skip`, `delete` or `insert` are longer than 20 characters, split them into multiple edits.
|
||||||
|
|
||||||
|
Check your reasoning by concatenating all the strings in `skip` and `delete`. If the text is the same as the input snippet then the edits are valid.
|
||||||
|
|
||||||
|
It's crucial that you reply only with edits. No prose or remarks.
|
Loading…
Add table
Add a link
Reference in a new issue