Simplify buffer constructor methods

Don't expose the `buffer::History` to callers of `language::Buffer`
This commit is contained in:
Max Brunsfeld 2021-10-26 14:26:15 -07:00
parent 4069db4959
commit 5bfbeb55c0
5 changed files with 60 additions and 92 deletions

View file

@ -359,7 +359,7 @@ mod tests {
use super::*; use super::*;
use crate::{movement, test::*}; use crate::{movement, test::*};
use gpui::{color::Color, MutableAppContext}; use gpui::{color::Color, MutableAppContext};
use language::{History, Language, LanguageConfig, RandomCharIter, SelectionGoal}; use language::{Language, LanguageConfig, RandomCharIter, SelectionGoal};
use rand::{prelude::StdRng, Rng}; use rand::{prelude::StdRng, Rng};
use std::{env, sync::Arc}; use std::{env, sync::Arc};
use theme::SyntaxTheme; use theme::SyntaxTheme;
@ -701,9 +701,8 @@ mod tests {
); );
lang.set_theme(&theme); lang.set_theme(&theme);
let buffer = cx.add_model(|cx| { let buffer =
Buffer::from_history(0, History::new(text.into()), None, Some(lang), None, cx) cx.add_model(|cx| Buffer::new(0, text, cx).with_language(Some(lang), None, cx));
});
buffer.condition(&cx, |buf, _| !buf.is_parsing()).await; buffer.condition(&cx, |buf, _| !buf.is_parsing()).await;
let tab_size = 2; let tab_size = 2;
@ -789,9 +788,8 @@ mod tests {
); );
lang.set_theme(&theme); lang.set_theme(&theme);
let buffer = cx.add_model(|cx| { let buffer =
Buffer::from_history(0, History::new(text.into()), None, Some(lang), None, cx) cx.add_model(|cx| Buffer::new(0, text, cx).with_language(Some(lang), None, cx));
});
buffer.condition(&cx, |buf, _| !buf.is_parsing()).await; buffer.condition(&cx, |buf, _| !buf.is_parsing()).await;
let font_cache = cx.font_cache(); let font_cache = cx.font_cache();

View file

@ -2903,7 +2903,7 @@ impl SelectionExt for Selection {
mod tests { mod tests {
use super::*; use super::*;
use crate::test::sample_text; use crate::test::sample_text;
use buffer::{History, Point}; use buffer::Point;
use unindent::Unindent; use unindent::Unindent;
#[gpui::test] #[gpui::test]
@ -4406,10 +4406,10 @@ mod tests {
#[gpui::test] #[gpui::test]
async fn test_select_larger_smaller_syntax_node(mut cx: gpui::TestAppContext) { async fn test_select_larger_smaller_syntax_node(mut cx: gpui::TestAppContext) {
let settings = cx.read(EditorSettings::test); let settings = cx.read(EditorSettings::test);
let language = Arc::new(Language::new( let language = Some(Arc::new(Language::new(
LanguageConfig::default(), LanguageConfig::default(),
tree_sitter_rust::language(), tree_sitter_rust::language(),
)); )));
let text = r#" let text = r#"
use mod1::mod2::{mod3, mod4}; use mod1::mod2::{mod3, mod4};
@ -4420,10 +4420,7 @@ mod tests {
"# "#
.unindent(); .unindent();
let buffer = cx.add_model(|cx| { let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, None, cx));
let history = History::new(text.into());
Buffer::from_history(0, history, None, Some(language), None, cx)
});
let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx)); let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx));
view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing()) view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing())
.await; .await;
@ -4550,7 +4547,7 @@ mod tests {
#[gpui::test] #[gpui::test]
async fn test_autoclose_pairs(mut cx: gpui::TestAppContext) { async fn test_autoclose_pairs(mut cx: gpui::TestAppContext) {
let settings = cx.read(EditorSettings::test); let settings = cx.read(EditorSettings::test);
let language = Arc::new(Language::new( let language = Some(Arc::new(Language::new(
LanguageConfig { LanguageConfig {
brackets: vec![ brackets: vec![
BracketPair { BracketPair {
@ -4569,7 +4566,7 @@ mod tests {
..Default::default() ..Default::default()
}, },
tree_sitter_rust::language(), tree_sitter_rust::language(),
)); )));
let text = r#" let text = r#"
a a
@ -4579,10 +4576,7 @@ mod tests {
"# "#
.unindent(); .unindent();
let buffer = cx.add_model(|cx| { let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, None, cx));
let history = History::new(text.into());
Buffer::from_history(0, history, None, Some(language), None, cx)
});
let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx)); let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx));
view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing()) view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing())
.await; .await;
@ -4665,7 +4659,7 @@ mod tests {
#[gpui::test] #[gpui::test]
async fn test_extra_newline_insertion(mut cx: gpui::TestAppContext) { async fn test_extra_newline_insertion(mut cx: gpui::TestAppContext) {
let settings = cx.read(EditorSettings::test); let settings = cx.read(EditorSettings::test);
let language = Arc::new(Language::new( let language = Some(Arc::new(Language::new(
LanguageConfig { LanguageConfig {
brackets: vec![ brackets: vec![
BracketPair { BracketPair {
@ -4684,7 +4678,7 @@ mod tests {
..Default::default() ..Default::default()
}, },
tree_sitter_rust::language(), tree_sitter_rust::language(),
)); )));
let text = concat!( let text = concat!(
"{ }\n", // Suppress rustfmt "{ }\n", // Suppress rustfmt
@ -4694,10 +4688,7 @@ mod tests {
"{{} }\n", // "{{} }\n", //
); );
let buffer = cx.add_model(|cx| { let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, None, cx));
let history = History::new(text.into());
Buffer::from_history(0, history, None, Some(language), None, cx)
});
let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx)); let (_, view) = cx.add_window(|cx| build_editor(buffer, settings, cx));
view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing()) view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing())
.await; .await;

View file

@ -197,26 +197,22 @@ impl Buffer {
History::new(base_text.into()), History::new(base_text.into()),
), ),
None, None,
None,
None,
cx,
) )
} }
pub fn from_history( pub fn from_file<T: Into<Arc<str>>>(
replica_id: ReplicaId, replica_id: ReplicaId,
history: History, base_text: T,
file: Option<Box<dyn File>>, file: Box<dyn File>,
language: Option<Arc<Language>>,
language_server: Option<Arc<lsp::LanguageServer>>,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) -> Self { ) -> Self {
Self::build( Self::build(
TextBuffer::new(replica_id, cx.model_id() as u64, history), TextBuffer::new(
file, replica_id,
language, cx.model_id() as u64,
language_server, History::new(base_text.into()),
cx, ),
Some(file),
) )
} }
@ -224,25 +220,24 @@ impl Buffer {
replica_id: ReplicaId, replica_id: ReplicaId,
message: proto::Buffer, message: proto::Buffer,
file: Option<Box<dyn File>>, file: Option<Box<dyn File>>,
language: Option<Arc<Language>>,
cx: &mut ModelContext<Self>,
) -> Result<Self> { ) -> Result<Self> {
Ok(Self::build( Ok(Self::build(
TextBuffer::from_proto(replica_id, message)?, TextBuffer::from_proto(replica_id, message)?,
file, file,
language,
None,
cx,
)) ))
} }
fn build( pub fn with_language(
buffer: TextBuffer, mut self,
file: Option<Box<dyn File>>,
language: Option<Arc<Language>>, language: Option<Arc<Language>>,
language_server: Option<Arc<lsp::LanguageServer>>, language_server: Option<Arc<LanguageServer>>,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) -> Self { ) -> Self {
self.set_language(language, language_server, cx);
self
}
fn build(buffer: TextBuffer, file: Option<Box<dyn File>>) -> Self {
let saved_mtime; let saved_mtime;
if let Some(file) = file.as_ref() { if let Some(file) = file.as_ref() {
saved_mtime = file.mtime(); saved_mtime = file.mtime();
@ -250,7 +245,7 @@ impl Buffer {
saved_mtime = UNIX_EPOCH; saved_mtime = UNIX_EPOCH;
} }
let mut result = Self { Self {
text: buffer, text: buffer,
saved_mtime, saved_mtime,
saved_version: clock::Global::new(), saved_version: clock::Global::new(),
@ -266,9 +261,7 @@ impl Buffer {
language_server: None, language_server: None,
#[cfg(test)] #[cfg(test)]
operations: Default::default(), operations: Default::default(),
}; }
result.set_language(language, language_server, cx);
result
} }
pub fn snapshot(&self) -> Snapshot { pub fn snapshot(&self) -> Snapshot {

View file

@ -78,10 +78,8 @@ async fn test_apply_diff(mut cx: gpui::TestAppContext) {
#[gpui::test] #[gpui::test]
async fn test_reparse(mut cx: gpui::TestAppContext) { async fn test_reparse(mut cx: gpui::TestAppContext) {
let buffer = cx.add_model(|cx| { let text = "fn a() {}";
let text = "fn a() {}".into(); let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(rust_lang(), None, cx));
Buffer::from_history(0, History::new(text), None, Some(rust_lang()), None, cx)
});
// Wait for the initial text to parse // Wait for the initial text to parse
buffer buffer
@ -222,9 +220,8 @@ fn test_enclosing_bracket_ranges(cx: &mut MutableAppContext) {
} }
} }
" "
.unindent() .unindent();
.into(); Buffer::new(0, text, cx).with_language(rust_lang(), None, cx)
Buffer::from_history(0, History::new(text), None, Some(rust_lang()), None, cx)
}); });
let buffer = buffer.read(cx); let buffer = buffer.read(cx);
assert_eq!( assert_eq!(
@ -253,9 +250,8 @@ fn test_enclosing_bracket_ranges(cx: &mut MutableAppContext) {
#[gpui::test] #[gpui::test]
fn test_edit_with_autoindent(cx: &mut MutableAppContext) { fn test_edit_with_autoindent(cx: &mut MutableAppContext) {
cx.add_model(|cx| { cx.add_model(|cx| {
let text = "fn a() {}".into(); let text = "fn a() {}";
let mut buffer = let mut buffer = Buffer::new(0, text, cx).with_language(rust_lang(), None, cx);
Buffer::from_history(0, History::new(text), None, Some(rust_lang()), None, cx);
buffer.edit_with_autoindent([8..8], "\n\n", cx); buffer.edit_with_autoindent([8..8], "\n\n", cx);
assert_eq!(buffer.text(), "fn a() {\n \n}"); assert_eq!(buffer.text(), "fn a() {\n \n}");
@ -273,8 +269,9 @@ fn test_edit_with_autoindent(cx: &mut MutableAppContext) {
#[gpui::test] #[gpui::test]
fn test_autoindent_moves_selections(cx: &mut MutableAppContext) { fn test_autoindent_moves_selections(cx: &mut MutableAppContext) {
cx.add_model(|cx| { cx.add_model(|cx| {
let text = History::new("fn a() {}".into()); let text = "fn a() {}";
let mut buffer = Buffer::from_history(0, text, None, Some(rust_lang()), None, cx);
let mut buffer = Buffer::new(0, text, cx).with_language(rust_lang(), None, cx);
let selection_set_id = buffer.add_selection_set(Vec::new(), cx); let selection_set_id = buffer.add_selection_set(Vec::new(), cx);
buffer.start_transaction(Some(selection_set_id)).unwrap(); buffer.start_transaction(Some(selection_set_id)).unwrap();
@ -331,10 +328,9 @@ fn test_autoindent_does_not_adjust_lines_with_unchanged_suggestion(cx: &mut Muta
d; d;
} }
" "
.unindent() .unindent();
.into();
let mut buffer = let mut buffer = Buffer::new(0, text, cx).with_language(rust_lang(), None, cx);
Buffer::from_history(0, History::new(text), None, Some(rust_lang()), None, cx);
// Lines 2 and 3 don't match the indentation suggestion. When editing these lines, // Lines 2 and 3 don't match the indentation suggestion. When editing these lines,
// their indentation is not adjusted. // their indentation is not adjusted.
@ -378,14 +374,12 @@ fn test_autoindent_does_not_adjust_lines_with_unchanged_suggestion(cx: &mut Muta
#[gpui::test] #[gpui::test]
fn test_autoindent_adjusts_lines_when_only_text_changes(cx: &mut MutableAppContext) { fn test_autoindent_adjusts_lines_when_only_text_changes(cx: &mut MutableAppContext) {
cx.add_model(|cx| { cx.add_model(|cx| {
let text = History::new( let text = "
" fn a() {}
fn a() {} "
" .unindent();
.unindent()
.into(), let mut buffer = Buffer::new(0, text, cx).with_language(rust_lang(), None, cx);
);
let mut buffer = Buffer::from_history(0, text, None, Some(rust_lang()), None, cx);
buffer.edit_with_autoindent([5..5], "\nb", cx); buffer.edit_with_autoindent([5..5], "\nb", cx);
assert_eq!( assert_eq!(
@ -440,8 +434,8 @@ impl Buffer {
} }
} }
fn rust_lang() -> Arc<Language> { fn rust_lang() -> Option<Arc<Language>> {
Arc::new( Some(Arc::new(
Language::new( Language::new(
LanguageConfig { LanguageConfig {
name: "Rust".to_string(), name: "Rust".to_string(),
@ -461,7 +455,7 @@ fn rust_lang() -> Arc<Language> {
.unwrap() .unwrap()
.with_brackets_query(r#" ("{" @open "}" @close) "#) .with_brackets_query(r#" ("{" @open "}" @close) "#)
.unwrap(), .unwrap(),
) ))
} }
fn empty(point: Point) -> Range<Point> { fn empty(point: Point) -> Range<Point> {

View file

@ -12,7 +12,7 @@ use gpui::{
executor, AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, MutableAppContext, executor, AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, MutableAppContext,
Task, UpgradeModelHandle, WeakModelHandle, Task, UpgradeModelHandle, WeakModelHandle,
}; };
use language::{Buffer, History, LanguageRegistry, Operation, Rope}; use language::{Buffer, LanguageRegistry, Operation, Rope};
use lazy_static::lazy_static; use lazy_static::lazy_static;
use lsp::LanguageServer; use lsp::LanguageServer;
use parking_lot::Mutex; use parking_lot::Mutex;
@ -892,10 +892,7 @@ impl LocalWorktree {
.cloned() .cloned()
}); });
let buffer = cx.add_model(|cx| { let buffer = cx.add_model(|cx| {
Buffer::from_history( Buffer::from_file(0, contents, Box::new(file), cx).with_language(
0,
History::new(contents.into()),
Some(Box::new(file)),
language, language,
language_server, language_server,
cx, cx,
@ -1321,14 +1318,9 @@ impl RemoteWorktree {
let remote_buffer = response.buffer.ok_or_else(|| anyhow!("empty buffer"))?; let remote_buffer = response.buffer.ok_or_else(|| anyhow!("empty buffer"))?;
let buffer_id = remote_buffer.id as usize; let buffer_id = remote_buffer.id as usize;
let buffer = cx.add_model(|cx| { let buffer = cx.add_model(|cx| {
Buffer::from_proto( Buffer::from_proto(replica_id, remote_buffer, Some(Box::new(file)))
replica_id, .unwrap()
remote_buffer, .with_language(language, None, cx)
Some(Box::new(file)),
language,
cx,
)
.unwrap()
}); });
this.update(&mut cx, |this, cx| { this.update(&mut cx, |this, cx| {
let this = this.as_remote_mut().unwrap(); let this = this.as_remote_mut().unwrap();