fix: clean up the render actor a bit and fix the issue that editor_conn_sender is not used (#1159)

This commit is contained in:
Myriad-Dreamin 2025-01-13 11:27:11 +08:00 committed by GitHub
parent 0149663a6f
commit 9cf5f294e9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 48 additions and 55 deletions

View file

@ -11,7 +11,7 @@ use crate::debug_loc::{InternQuery, SpanInterner};
use crate::outline::Outline;
use crate::{
ChangeCursorPositionRequest, DocToSrcJumpInfo, EditorServer, MemoryFiles, MemoryFilesShort,
SrcToDocJumpRequest,
ResolveSourceLocRequest,
};
use super::webview::WebviewActorRequest;
@ -122,7 +122,7 @@ pub enum ControlPlaneMessage {
#[serde(rename = "changeCursorPosition")]
ChangeCursorPosition(ChangeCursorPositionRequest),
#[serde(rename = "panelScrollTo")]
SrcToDocJump(SrcToDocJumpRequest),
ResolveSourceLoc(ResolveSourceLocRequest),
#[serde(rename = "panelScrollByPosition")]
PanelScrollByPosition(PanelScrollByPositionRequest),
#[serde(rename = "sourceScrollBySpan")]
@ -209,9 +209,9 @@ impl<T: EditorServer> EditorActor<T> {
debug!("EditorActor: received message from editor: {:?}", cursor_info);
self.renderer_sender.send(RenderActorRequest::ChangeCursorPosition(cursor_info)).unwrap();
}
ControlPlaneMessage::SrcToDocJump(jump_info) => {
ControlPlaneMessage::ResolveSourceLoc(jump_info) => {
debug!("EditorActor: received message from editor: {:?}", jump_info);
self.renderer_sender.send(RenderActorRequest::SrcToDocJumpResolve(jump_info)).unwrap();
self.renderer_sender.send(RenderActorRequest::ResolveSourceLoc(jump_info)).unwrap();
}
ControlPlaneMessage::PanelScrollByPosition(jump_info) => {
debug!("EditorActor: received message from editor: {:?}", jump_info);
@ -276,10 +276,9 @@ impl<T: EditorServer> EditorActor<T> {
if let Some(span) = jump_info {
let span_and_offset = span.into();
self.renderer_sender
.send(RenderActorRequest::DocToSrcJumpResolve((
span_and_offset,
span_and_offset,
)))
.send(RenderActorRequest::EditorResolveSpanRange(
span_and_offset..span_and_offset,
))
.unwrap();
};
}

View file

@ -1,3 +1,4 @@
use std::ops::Range;
use std::sync::Arc;
use reflexo_typst::debug_loc::{
@ -10,7 +11,7 @@ use tokio::sync::{broadcast, mpsc};
use super::{editor::EditorActorRequest, webview::WebviewActorRequest};
use crate::debug_loc::SpanInterner;
use crate::outline::Outline;
use crate::{ChangeCursorPositionRequest, CompileView, DocToSrcJumpInfo, SrcToDocJumpRequest};
use crate::{ChangeCursorPositionRequest, CompileView, DocToSrcJumpInfo, ResolveSourceLocRequest};
#[derive(Debug, Clone)]
pub struct ResolveSpanRequest(pub Vec<ElementPoint>);
@ -19,9 +20,9 @@ pub struct ResolveSpanRequest(pub Vec<ElementPoint>);
pub enum RenderActorRequest {
RenderFullLatest,
RenderIncremental,
DocToSrcJumpResolve((SourceSpanOffset, SourceSpanOffset)),
SrcToDocJumpResolve(SrcToDocJumpRequest),
ResolveSpan(ResolveSpanRequest),
EditorResolveSpanRange(Range<SourceSpanOffset>),
WebviewResolveSpan(ResolveSpanRequest),
ResolveSourceLoc(ResolveSourceLocRequest),
ChangeCursorPosition(ChangeCursorPositionRequest),
}
@ -30,9 +31,9 @@ impl RenderActorRequest {
match self {
Self::RenderFullLatest => true,
Self::RenderIncremental => false,
Self::ResolveSpan(_) => false,
Self::DocToSrcJumpResolve(_) => false,
Self::SrcToDocJumpResolve(_) => false,
Self::EditorResolveSpanRange(_) => false,
Self::WebviewResolveSpan(_) => false,
Self::ResolveSourceLoc(_) => false,
Self::ChangeCursorPosition(_) => false,
}
}
@ -68,28 +69,17 @@ impl RenderActor {
}
async fn process_message(&mut self, msg: RenderActorRequest) -> bool {
log::trace!("RenderActor: received message: {:?}", msg);
log::trace!("RenderActor: received message: {msg:?}");
let res = msg.is_full_render();
match msg {
RenderActorRequest::DocToSrcJumpResolve(span_range) => {
log::debug!("RenderActor: processing doc2src: {span_range:?}");
RenderActorRequest::EditorResolveSpanRange(span_range) => {
log::debug!("RenderActor: resolving EditorResolveSpanRange: {span_range:?}");
self.doc_to_src_jump_resolve(span_range);
self.editor_resolve_span_range(span_range);
}
RenderActorRequest::ChangeCursorPosition(req) => {
log::debug!("RenderActor: processing src2doc: {:?}", req);
self.change_cursor_position(req);
}
RenderActorRequest::SrcToDocJumpResolve(req) => {
log::debug!("RenderActor: processing src2doc: {:?}", req);
self.src_to_doc_jump_resolve(req);
}
RenderActorRequest::ResolveSpan(ResolveSpanRequest(element_path)) => {
log::info!("RenderActor: resolving span: {:?}", element_path);
RenderActorRequest::WebviewResolveSpan(ResolveSpanRequest(element_path)) => {
log::debug!("RenderActor: resolving WebviewResolveSpan: {element_path:?}");
let spans = match self.renderer.resolve_span_by_element_path(&element_path) {
Ok(spans) => spans,
Err(err) => {
@ -98,12 +88,22 @@ impl RenderActor {
}
};
log::info!("RenderActor: resolved span: {spans:?}");
log::debug!("RenderActor: resolved WebviewResolveSpan: {spans:?}");
// end position is used
if let Some(spans) = spans {
self.doc_to_src_jump_resolve(spans);
self.resolve_span_range(spans.0..spans.1);
}
}
RenderActorRequest::ResolveSourceLoc(req) => {
log::debug!("RenderActor: resolving ResolveSourceLoc: {req:?}");
self.resolve_source_loc(req);
}
RenderActorRequest::ChangeCursorPosition(req) => {
log::debug!("RenderActor: processing ChangeCursorPosition: {req:?}");
self.change_cursor_position(req);
}
RenderActorRequest::RenderFullLatest | RenderActorRequest::RenderIncremental => {}
}
@ -159,15 +159,19 @@ impl RenderActor {
self.view.read().clone()
}
fn resolve_span_range(
&self,
span_range: (SourceSpanOffset, SourceSpanOffset),
) -> Option<DocToSrcJumpInfo> {
fn editor_resolve_span_range(&self, span_range: Range<SourceSpanOffset>) -> Option<()> {
let req = EditorActorRequest::DocToSrcJump(self.resolve_span_range(span_range)?);
let _ = self.editor_conn_sender.send(req);
Some(())
}
fn resolve_span_range(&self, range: Range<SourceSpanOffset>) -> Option<DocToSrcJumpInfo> {
let view = self.view()?;
// Resolves FileLoC of start, end, and the element wide
let st_res = view.resolve_span(span_range.0.span, Some(span_range.0.offset));
let ed_res = view.resolve_span(span_range.1.span, Some(span_range.1.offset));
let elem_res = view.resolve_span(span_range.1.span, None);
let st_res = view.resolve_span(range.start.span, Some(range.start.offset));
let ed_res = view.resolve_span(range.end.span, Some(range.end.offset));
let elem_res = view.resolve_span(range.end.span, None);
// Combines the result of start and end
let range_res = match (st_res, ed_res) {
@ -229,16 +233,6 @@ impl RenderActor {
}
}
fn doc_to_src_jump_resolve(
&self,
span_range: (SourceSpanOffset, SourceSpanOffset),
) -> Option<()> {
let req = EditorActorRequest::DocToSrcJump(self.resolve_span_range(span_range)?);
let _ = self.editor_conn_sender.send(req);
Some(())
}
fn change_cursor_position(&mut self, req: ChangeCursorPositionRequest) -> Option<()> {
let span = self
.view()?
@ -260,7 +254,7 @@ impl RenderActor {
Some(())
}
fn src_to_doc_jump_resolve(&self, req: SrcToDocJumpRequest) -> Option<()> {
fn resolve_source_loc(&self, req: ResolveSourceLocRequest) -> Option<()> {
// todo: change name to resolve resolve src position
let info = self
.view()?

View file

@ -155,7 +155,7 @@ impl<
if let Ok(path) = path {
let path: Vec<(u32, u32, String)> = path;
let path = path.into_iter().map(ElementPoint::from).collect::<Vec<_>>();
self.render_sender.send(RenderActorRequest::ResolveSpan(ResolveSpanRequest(path))).unwrap();
self.render_sender.send(RenderActorRequest::WebviewResolveSpan(ResolveSpanRequest(path))).unwrap();
};
} else {
let err = self.webview_websocket_conn.send(Message::Text(format!("error, received unknown message: {}", msg))).await;

View file

@ -328,7 +328,7 @@ pub struct ChangeCursorPositionRequest {
}
#[derive(Debug, Clone, Deserialize)]
pub struct SrcToDocJumpRequest {
pub struct ResolveSourceLocRequest {
filepath: PathBuf,
line: usize,
/// fixme: character is 0-based, UTF-16 code unit.
@ -336,7 +336,7 @@ pub struct SrcToDocJumpRequest {
character: usize,
}
impl SrcToDocJumpRequest {
impl ResolveSourceLocRequest {
pub fn to_byte_offset(&self, src: &typst::syntax::Source) -> Option<usize> {
src.line_column_to_byte(self.line, self.character)
}