diff --git a/compiler/module/src/symbol.rs b/compiler/module/src/symbol.rs index 8b4d3e6718..890c746020 100644 --- a/compiler/module/src/symbol.rs +++ b/compiler/module/src/symbol.rs @@ -66,7 +66,6 @@ impl Symbol { } pub fn ident_string(self, interns: &Interns) -> &InlinableString { - let ident_ids = interns .all_ident_ids .get(&self.module_id()) @@ -543,8 +542,11 @@ impl IdentIds { } } - pub fn update_key(&mut self, old_ident_name: InlinableString, new_ident_name: InlinableString) -> Result { - + pub fn update_key( + &mut self, + old_ident_name: InlinableString, + new_ident_name: InlinableString, + ) -> Result { let ident_id_ref_opt = self.by_ident.get(&old_ident_name); match ident_id_ref_opt { diff --git a/compiler/parse/src/test_helpers.rs b/compiler/parse/src/test_helpers.rs index 68aeda0d2e..148b43fd54 100644 --- a/compiler/parse/src/test_helpers.rs +++ b/compiler/parse/src/test_helpers.rs @@ -1,11 +1,11 @@ use crate::ast; use crate::module::module_defs; // use crate::module::module_defs; -use crate::parser::{State, SyntaxError}; -use bumpalo::Bump; -use bumpalo::collections::Vec as BumpVec; -use roc_region::all::Located; use crate::parser::Parser; +use crate::parser::{State, SyntaxError}; +use bumpalo::collections::Vec as BumpVec; +use bumpalo::Bump; +use roc_region::all::Located; pub fn parse_expr_with<'a>( arena: &'a Bump, diff --git a/editor/src/editor/code_lines.rs b/editor/src/editor/code_lines.rs index 34d3da43cb..bbdfbf361e 100644 --- a/editor/src/editor/code_lines.rs +++ b/editor/src/editor/code_lines.rs @@ -109,7 +109,7 @@ impl fmt::Display for CodeLines { .collect::>() .join(" "); - let escaped_row_str = row_str.replace("\n","\\n"); + let escaped_row_str = row_str.replace("\n", "\\n"); write!(f, "\n{}", escaped_row_str)?; } diff --git a/editor/src/editor/ed_error.rs b/editor/src/editor/ed_error.rs index 9c66b28182..9ca5bc52eb 100644 --- a/editor/src/editor/ed_error.rs +++ b/editor/src/editor/ed_error.rs @@ -46,9 +46,7 @@ pub enum EdError { #[snafu(display( "EmptyCodeString: I need to have a code string (code_str) that contains either an app, interface or Package-Config header. The code string was empty.", ))] - EmptyCodeString { - backtrace: Backtrace, - }, + EmptyCodeString { backtrace: Backtrace }, #[snafu(display("GetContentOnNestedNode: tried to get string content from Nested MarkupNode. Can only get content from Text or Blank nodes."))] GetContentOnNestedNode { backtrace: Backtrace }, @@ -172,7 +170,10 @@ pub enum EdError { }, #[snafu(display("ParseError: Failed to parse AST: SyntaxError: {}.", syntax_err))] - SrcParseError { syntax_err: String, backtrace: Backtrace }, + SrcParseError { + syntax_err: String, + backtrace: Backtrace, + }, #[snafu(display("RecordWithoutFields: expected record to have at least one field because it is not an EmptyRecord."))] RecordWithoutFields { backtrace: Backtrace }, diff --git a/editor/src/editor/grid_node_map.rs b/editor/src/editor/grid_node_map.rs index fc157a9b5a..1c50da2cde 100644 --- a/editor/src/editor/grid_node_map.rs +++ b/editor/src/editor/grid_node_map.rs @@ -285,7 +285,7 @@ impl fmt::Display for GridNodeMap { write!(f, "{}\n", row_str)?; } - + write!(f, "(grid_node_map, {:?} lines)\n", self.lines.len())?; Ok(()) diff --git a/editor/src/editor/main.rs b/editor/src/editor/main.rs index 4cf2272092..d5b2a1911b 100644 --- a/editor/src/editor/main.rs +++ b/editor/src/editor/main.rs @@ -30,8 +30,8 @@ use roc_load::file::LoadedModule; use roc_module::symbol::IdentIds; use roc_types::subs::VarStore; use std::fs::File; +use std::io::Write; use std::{error::Error, io, path::Path}; -use std::io::{Write}; use wgpu::{CommandEncoder, RenderPass, TextureView}; use wgpu_glyph::GlyphBrush; use winit::{ @@ -157,13 +157,7 @@ fn run_event_loop(file_path_opt: Option<&Path>) -> Result<(), Box> { let ed_model_opt = { let ed_model_res = - ed_model::init_model( - &code_str, - file_path, - env, - loaded_module, - &code_arena, - ); + ed_model::init_model(&code_str, file_path, env, loaded_module, &code_arena); match ed_model_res { Ok(mut ed_model) => { @@ -403,28 +397,23 @@ fn begin_render_pass<'a>( } fn read_file(file_path_opt: Option<&Path>) -> (&Path, String) { - if let Some(file_path) = file_path_opt { + let file_as_str = std::fs::read_to_string(file_path).expect(&format!( + "Failed to read from provided file path: {:?}", + file_path + )); - let file_as_str = - std::fs::read_to_string(file_path) - .expect( - &format!("Failed to read from provided file path: {:?}", file_path) - ); - (file_path, file_as_str) } else { let untitled_path = Path::new("UntitledApp.roc"); - let code_str = - if !untitled_path.exists() { - let mut untitled_file = - File::create(untitled_path) - .expect( - &format!("I wanted to create {:?}, but it failed.", untitled_path) - ); + let code_str = if !untitled_path.exists() { + let mut untitled_file = File::create(untitled_path).expect(&format!( + "I wanted to create {:?}, but it failed.", + untitled_path + )); - let hello_world_roc = r#"app "untitled-app" + let hello_world_roc = r#"app "untitled-app" packages { base: "platform" } imports [] provides [ main ] to base @@ -432,28 +421,22 @@ fn read_file(file_path_opt: Option<&Path>) -> (&Path, String) { main = "Hello, world!" "#; - write!(untitled_file, "{}", hello_world_roc) - .expect( - &format!( - r#"I wanted to write: + write!(untitled_file, "{}", hello_world_roc).expect(&format!( + r#"I wanted to write: {:?} -to file {:?}, but it failed."# - , hello_world_roc - , untitled_file - ) - ); - - hello_world_roc.to_string() - } else { +to file {:?}, but it failed."#, + hello_world_roc, untitled_file + )); - std::fs::read_to_string(untitled_path) - .expect( - &format!("I detected an existing {:?}, but I failed to read from it.", untitled_path) - ) - - }; + hello_world_roc.to_string() + } else { + std::fs::read_to_string(untitled_path).expect(&format!( + "I detected an existing {:?}, but I failed to read from it.", + untitled_path + )) + }; (untitled_path, code_str) } @@ -467,7 +450,10 @@ pub fn load_module(src_file: &Path) -> LoadedModule { &arena, src_file.to_path_buf(), arena.alloc(roc_builtins::std::standard_stdlib()), - src_file.parent().expect(&format!("src_file {:?} did not have a parent directory but I need to have one.", src_file)), + src_file.parent().expect(&format!( + "src_file {:?} did not have a parent directory but I need to have one.", + src_file + )), subs_by_module, 8, builtin_defs_map, @@ -476,9 +462,15 @@ pub fn load_module(src_file: &Path) -> LoadedModule { match loaded { Ok(x) => x, Err(roc_load::file::LoadingProblem::FormattedReport(report)) => { - panic!("Failed to load module from src_file {:?}. Report: {:?}", src_file,report); + panic!( + "Failed to load module from src_file {:?}. Report: {:?}", + src_file, report + ); } - Err(e) => panic!("Failed to load module from src_file {:?}: {:?}", src_file, e), + Err(e) => panic!( + "Failed to load module from src_file {:?}: {:?}", + src_file, e + ), } } diff --git a/editor/src/editor/markup/common_nodes.rs b/editor/src/editor/markup/common_nodes.rs index 4a6af524f3..2eafbdec11 100644 --- a/editor/src/editor/markup/common_nodes.rs +++ b/editor/src/editor/markup/common_nodes.rs @@ -1,7 +1,9 @@ -use crate::{editor::{slow_pool::{MarkNodeId}, syntax_highlight::HighlightStyle}, lang::ast::ExprId}; - -use super::{attribute::Attributes, nodes::MarkupNode, nodes}; +use crate::{ + editor::{slow_pool::MarkNodeId, syntax_highlight::HighlightStyle}, + lang::ast::ExprId, +}; +use super::{attribute::Attributes, nodes, nodes::MarkupNode}; pub fn new_equals_mn(ast_node_id: ExprId, parent_id_opt: Option) -> MarkupNode { MarkupNode::Text { @@ -48,7 +50,7 @@ pub fn new_left_accolade_mn(ast_node_id: ExprId, parent_id_opt: Option) -> Ma parent_id_opt, } } - diff --git a/editor/src/editor/markup/mod.rs b/editor/src/editor/markup/mod.rs index e291a4fa47..de015ebd80 100644 --- a/editor/src/editor/markup/mod.rs +++ b/editor/src/editor/markup/mod.rs @@ -1,3 +1,3 @@ pub mod attribute; -pub mod nodes; pub mod common_nodes; +pub mod nodes; diff --git a/editor/src/editor/markup/nodes.rs b/editor/src/editor/markup/nodes.rs index b55e9ecf49..9b76f71a2d 100644 --- a/editor/src/editor/markup/nodes.rs +++ b/editor/src/editor/markup/nodes.rs @@ -187,8 +187,7 @@ impl MarkupNode { } pub fn is_all_alphanumeric(&self) -> bool { - self - .get_content() + self.get_content() .chars() .all(|chr| chr.is_ascii_alphanumeric()) } @@ -265,7 +264,6 @@ pub fn expr2_to_markup<'a, 'b>( markup_node_pool: &mut SlowPool, interns: &Interns, ) -> EdResult { - let mark_node_id = match expr2 { Expr2::SmallInt { text, .. } | Expr2::I128 { text, .. } @@ -307,14 +305,8 @@ pub fn expr2_to_markup<'a, 'b>( ) } Expr2::List { elems, .. } => { - let mut children_ids = vec![ - markup_node_pool.add( - new_left_square_mn( - expr2_node_id, - None - ) - ) - ]; + let mut children_ids = + vec![markup_node_pool.add(new_left_square_mn(expr2_node_id, None))]; let indexed_node_ids: Vec<(usize, ExprId)> = elems.iter(env.pool).copied().enumerate().collect(); @@ -328,28 +320,14 @@ pub fn expr2_to_markup<'a, 'b>( sub_expr2, *node_id, markup_node_pool, - interns + interns, )?); if idx + 1 < elems.len() { - children_ids.push( - markup_node_pool.add( - new_comma_mn( - expr2_node_id, - None - ) - ) - ); + children_ids.push(markup_node_pool.add(new_comma_mn(expr2_node_id, None))); } } - children_ids.push( - markup_node_pool.add( - new_right_square_mn( - expr2_node_id, - None - ) - ) - ); + children_ids.push(markup_node_pool.add(new_right_square_mn(expr2_node_id, None))); let list_node = MarkupNode::Nested { ast_node_id: expr2_node_id, @@ -361,18 +339,8 @@ pub fn expr2_to_markup<'a, 'b>( } Expr2::EmptyRecord => { let children_ids = vec![ - markup_node_pool.add( - new_left_accolade_mn( - expr2_node_id, - None - ) - ), - markup_node_pool.add( - new_right_accolade_mn( - expr2_node_id, - None - ) - ), + markup_node_pool.add(new_left_accolade_mn(expr2_node_id, None)), + markup_node_pool.add(new_right_accolade_mn(expr2_node_id, None)), ]; let record_node = MarkupNode::Nested { @@ -384,12 +352,8 @@ pub fn expr2_to_markup<'a, 'b>( markup_node_pool.add(record_node) } Expr2::Record { fields, .. } => { - let mut children_ids = vec![markup_node_pool.add( - new_left_accolade_mn( - expr2_node_id, - None - ) - )]; + let mut children_ids = + vec![markup_node_pool.add(new_left_accolade_mn(expr2_node_id, None))]; for (idx, field_node_id) in fields.iter_node_ids().enumerate() { let record_field = env.pool.get(field_node_id); @@ -407,15 +371,7 @@ pub fn expr2_to_markup<'a, 'b>( RecordField::InvalidLabelOnly(_, _) => (), RecordField::LabelOnly(_, _, _) => (), RecordField::LabeledValue(_, _, sub_expr2_node_id) => { - - children_ids.push( - markup_node_pool.add( - new_colon_mn( - expr2_node_id, - None - ) - ) - ); + children_ids.push(markup_node_pool.add(new_colon_mn(expr2_node_id, None))); let sub_expr2 = env.pool.get(*sub_expr2_node_id); children_ids.push(expr2_to_markup( @@ -424,31 +380,17 @@ pub fn expr2_to_markup<'a, 'b>( sub_expr2, *sub_expr2_node_id, markup_node_pool, - interns + interns, )?); } } if idx + 1 < fields.len() { - children_ids.push( - markup_node_pool.add( - new_comma_mn( - expr2_node_id, - None - ) - ) - ); + children_ids.push(markup_node_pool.add(new_comma_mn(expr2_node_id, None))); } } - children_ids.push( - markup_node_pool.add( - new_right_accolade_mn( - expr2_node_id, - None - ) - ) - ); + children_ids.push(markup_node_pool.add(new_right_accolade_mn(expr2_node_id, None))); let record_node = MarkupNode::Nested { ast_node_id: expr2_node_id, @@ -458,27 +400,22 @@ pub fn expr2_to_markup<'a, 'b>( markup_node_pool.add(record_node) } - Expr2::Blank => markup_node_pool.add( - new_blank_mn( - expr2_node_id, - None - ) - ), - Expr2::LetValue { def_id, body_id:_, body_var:_} => { + Expr2::Blank => markup_node_pool.add(new_blank_mn(expr2_node_id, None)), + Expr2::LetValue { + def_id, + body_id: _, + body_var: _, + } => { + let pattern_id = env.pool.get(*def_id).get_pattern_id(); - let pattern_id = - env.pool.get(*def_id).get_pattern_id(); - - let pattern2 = - env.pool.get(pattern_id); + let pattern2 = env.pool.get(pattern_id); //TODO remove me /*dbg!(env.pool.get(expr_id)); dbg!(env.pool.get(env.pool.get(*def_id).get_pattern_id())); dbg!(env.pool.get(*body_id));*/ - let val_name = - get_identifier_string(pattern2, interns)?; + let val_name = get_identifier_string(pattern2, interns)?; let val_name_mn = MarkupNode::Text { content: val_name, @@ -496,9 +433,9 @@ pub fn expr2_to_markup<'a, 'b>( match value_def { ValueDef::NoAnnotation { - pattern_id:_, + pattern_id: _, expr_id, - expr_var:_, + expr_var: _, } => { let body_mn_id = expr2_to_markup( arena, @@ -506,22 +443,25 @@ pub fn expr2_to_markup<'a, 'b>( env.pool.get(*expr_id), *expr_id, markup_node_pool, - interns + interns, )?; - + let full_let_node = MarkupNode::Nested { ast_node_id: expr2_node_id, children_ids: vec![val_name_mn_id, equals_mn_id, body_mn_id], parent_id_opt: None, }; - + markup_node_pool.add(full_let_node) - }, + } other => { - unimplemented!("I don't know how to convert {:?} into a MarkupNode yet.", other) + unimplemented!( + "I don't know how to convert {:?} into a MarkupNode yet.", + other + ) } } - }, + } Expr2::RuntimeError() => new_markup_node( "RunTimeError".to_string(), expr2_node_id, @@ -591,7 +531,12 @@ fn header_mn(content: String, ast_node_id: ExprId, mark_node_pool: &mut SlowPool mark_node_pool.add(mark_node) } -fn header_val_mn(content: String, ast_node_id: ExprId, highlight_style: HighlightStyle, mark_node_pool: &mut SlowPool) -> MarkNodeId { +fn header_val_mn( + content: String, + ast_node_id: ExprId, + highlight_style: HighlightStyle, + mark_node_pool: &mut SlowPool, +) -> MarkNodeId { let mark_node = MarkupNode::Text { content: content, ast_node_id, @@ -606,16 +551,14 @@ fn header_val_mn(content: String, ast_node_id: ExprId, highlight_style: Highligh pub fn header_to_markup(app_header: &AppHeader, mark_node_pool: &mut SlowPool) -> MarkNodeId { let ast_node_id = app_header.ast_node_id; - let app_node_id = - header_mn("app ".to_owned(), ast_node_id, mark_node_pool); + let app_node_id = header_mn("app ".to_owned(), ast_node_id, mark_node_pool); - let app_name_node_id = - header_val_mn( - app_header.app_name.clone(), - ast_node_id, - HighlightStyle::String, - mark_node_pool - ); + let app_name_node_id = header_val_mn( + app_header.app_name.clone(), + ast_node_id, + HighlightStyle::String, + mark_node_pool, + ); let full_app_node = MarkupNode::Nested { ast_node_id, @@ -623,123 +566,109 @@ pub fn header_to_markup(app_header: &AppHeader, mark_node_pool: &mut SlowPool) - parent_id_opt: None, }; - let packages_node_id = - header_mn(" packages ".to_owned(), ast_node_id, mark_node_pool); + let packages_node_id = header_mn(" packages ".to_owned(), ast_node_id, mark_node_pool); - let pack_left_acc_node_id = mark_node_pool.add(new_left_accolade_mn(ast_node_id, None)); + let pack_left_acc_node_id = mark_node_pool.add(new_left_accolade_mn(ast_node_id, None)); - let pack_base_node_id = - header_val_mn( - "base: ".to_owned(), - ast_node_id, - HighlightStyle::RecordField, - mark_node_pool - ); + let pack_base_node_id = header_val_mn( + "base: ".to_owned(), + ast_node_id, + HighlightStyle::RecordField, + mark_node_pool, + ); - let pack_val_node_id = - header_val_mn( - app_header.packages_base.clone(), - ast_node_id, - HighlightStyle::String, - mark_node_pool - ); + let pack_val_node_id = header_val_mn( + app_header.packages_base.clone(), + ast_node_id, + HighlightStyle::String, + mark_node_pool, + ); let pack_right_acc_node_id = mark_node_pool.add(new_right_accolade_mn(ast_node_id, None)); let full_packages_node = MarkupNode::Nested { ast_node_id, - children_ids: vec![packages_node_id, pack_left_acc_node_id, pack_base_node_id, pack_val_node_id, pack_right_acc_node_id], + children_ids: vec![ + packages_node_id, + pack_left_acc_node_id, + pack_base_node_id, + pack_val_node_id, + pack_right_acc_node_id, + ], parent_id_opt: None, }; - let imports_node_id = - header_mn(" imports ".to_owned(), ast_node_id, mark_node_pool); + let imports_node_id = header_mn(" imports ".to_owned(), ast_node_id, mark_node_pool); - let imports_left_square_node_id = - mark_node_pool.add(new_left_square_mn(ast_node_id, None)); + let imports_left_square_node_id = mark_node_pool.add(new_left_square_mn(ast_node_id, None)); let nr_of_imports = app_header.imports.len(); - let mut import_child_ids: Vec = - app_header.imports.iter().enumerate().map(|(indx, import)| { - - let import_val_mn_id = - header_val_mn( - import.to_owned(), - ast_node_id, - HighlightStyle::Import, - mark_node_pool - ); + let mut import_child_ids: Vec = app_header + .imports + .iter() + .enumerate() + .map(|(indx, import)| { + let import_val_mn_id = header_val_mn( + import.to_owned(), + ast_node_id, + HighlightStyle::Import, + mark_node_pool, + ); if indx != nr_of_imports - 1 { vec![ import_val_mn_id, - mark_node_pool.add(new_comma_mn(ast_node_id, None)) + mark_node_pool.add(new_comma_mn(ast_node_id, None)), ] } else { - vec![ - import_val_mn_id - ] + vec![import_val_mn_id] } - }).flatten().collect(); + }) + .flatten() + .collect(); - let imports_right_square_node_id = - mark_node_pool.add(new_right_square_mn(ast_node_id, None)); + let imports_right_square_node_id = mark_node_pool.add(new_right_square_mn(ast_node_id, None)); let mut full_import_children = vec![imports_node_id, imports_left_square_node_id]; full_import_children.append(&mut import_child_ids); full_import_children.push(imports_right_square_node_id); - - let full_import_node = - MarkupNode::Nested { - ast_node_id, - children_ids: full_import_children, - parent_id_opt: None, - }; - let provides_node_id = - header_mn( - " provides ".to_owned(), - ast_node_id, - mark_node_pool - ); + let full_import_node = MarkupNode::Nested { + ast_node_id, + children_ids: full_import_children, + parent_id_opt: None, + }; - let provides_left_square_node_id = - mark_node_pool.add(new_left_square_mn(ast_node_id, None)); + let provides_node_id = header_mn(" provides ".to_owned(), ast_node_id, mark_node_pool); - let provides_val_node_id = - header_val_mn( - // TODO iter over provides like with imports - app_header.provides.first().unwrap().to_owned(), - ast_node_id, - HighlightStyle::Provides, - mark_node_pool - ); + let provides_left_square_node_id = mark_node_pool.add(new_left_square_mn(ast_node_id, None)); - let provides_right_square_node_id = - mark_node_pool.add(new_right_square_mn(ast_node_id, None)); + let provides_val_node_id = header_val_mn( + // TODO iter over provides like with imports + app_header.provides.first().unwrap().to_owned(), + ast_node_id, + HighlightStyle::Provides, + mark_node_pool, + ); - let provides_end_node_id = - header_mn( - " to base".to_owned(), - ast_node_id, - mark_node_pool - ); + let provides_right_square_node_id = mark_node_pool.add(new_right_square_mn(ast_node_id, None)); + + let provides_end_node_id = header_mn(" to base".to_owned(), ast_node_id, mark_node_pool); + + let full_provides_node = MarkupNode::Nested { + ast_node_id, + children_ids: vec![ + provides_node_id, + provides_left_square_node_id, + provides_val_node_id, + provides_right_square_node_id, + provides_end_node_id, + ], + parent_id_opt: None, + }; - let full_provides_node = - MarkupNode::Nested { - ast_node_id, - children_ids: vec![ - provides_node_id, - provides_left_square_node_id, - provides_val_node_id, - provides_right_square_node_id, - provides_end_node_id - ], - parent_id_opt: None, - }; - let full_app_node_id = mark_node_pool.add(full_app_node); let newline_node_id_1 = mark_node_pool.add(new_line_mn(ast_node_id, None)); let full_packages_node = mark_node_pool.add(full_packages_node); @@ -749,23 +678,22 @@ pub fn header_to_markup(app_header: &AppHeader, mark_node_pool: &mut SlowPool) - let full_provides_node_id = mark_node_pool.add(full_provides_node); let newline_node_id_4 = mark_node_pool.add(new_line_mn(ast_node_id, None)); let newline_node_id_5 = mark_node_pool.add(new_line_mn(ast_node_id, None)); - - let header_mark_node = - MarkupNode::Nested { - ast_node_id, - children_ids: vec![ - full_app_node_id, - newline_node_id_1, - full_packages_node, - newline_node_id_2, - full_import_node_id, - newline_node_id_3, - full_provides_node_id, - newline_node_id_4, - newline_node_id_5, - ], - parent_id_opt: None, - }; + + let header_mark_node = MarkupNode::Nested { + ast_node_id, + children_ids: vec![ + full_app_node_id, + newline_node_id_1, + full_packages_node, + newline_node_id_2, + full_import_node_id, + newline_node_id_3, + full_provides_node_id, + newline_node_id_4, + newline_node_id_5, + ], + parent_id_opt: None, + }; let header_mn_id = mark_node_pool.add(header_mark_node); @@ -779,13 +707,11 @@ pub fn ast_to_mark_nodes<'a, 'b>( env: &mut Env<'b>, ast: &AST, mark_node_pool: &mut SlowPool, - interns: &Interns,) -> EdResult> { - + interns: &Interns, +) -> EdResult> { let mut all_mark_node_ids = vec![]; - all_mark_node_ids.push( - header_to_markup(&ast.header, mark_node_pool) - ); + all_mark_node_ids.push(header_to_markup(&ast.header, mark_node_pool)); for &expr_id in ast.expression_ids.iter() { let expr2 = env.pool.get(expr_id); @@ -794,22 +720,15 @@ pub fn ast_to_mark_nodes<'a, 'b>( set_parent_for_all(expr2_markup_id, mark_node_pool); - all_mark_node_ids.push( - expr2_markup_id - ); + all_mark_node_ids.push(expr2_markup_id); } - + Ok(all_mark_node_ids) } impl fmt::Display for MarkupNode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{} ({})", - self.node_type_as_string(), - self.get_content() - ) + write!(f, "{} ({})", self.node_type_as_string(), self.get_content()) } } @@ -839,7 +758,7 @@ fn tree_as_string_helper( .to_owned(); let child = mark_node_pool.get(child_id); - let child_str = format!("{}", mark_node_pool.get(child_id)).replace("\n","\\n"); + let child_str = format!("{}", mark_node_pool.get(child_id)).replace("\n", "\\n"); full_str.push_str(&format!("{} mn_id {}\n", child_str, child_id)); diff --git a/editor/src/editor/mvc/ed_model.rs b/editor/src/editor/mvc/ed_model.rs index 29084a45ec..416e8e0550 100644 --- a/editor/src/editor/mvc/ed_model.rs +++ b/editor/src/editor/mvc/ed_model.rs @@ -4,13 +4,13 @@ use crate::editor::markup::nodes::ast_to_mark_nodes; use crate::editor::slow_pool::{MarkNodeId, SlowPool}; use crate::editor::{ ed_error::SrcParseError, - ed_error::{EdResult, MissingParent, NoNodeAtCaretPosition, EmptyCodeString}, + ed_error::{EdResult, EmptyCodeString, MissingParent, NoNodeAtCaretPosition}, }; use crate::graphics::primitives::rect::Rect; -use crate::lang::ast::{Expr2}; -use crate::lang::expr::{Env}; +use crate::lang::ast::Expr2; +use crate::lang::expr::Env; use crate::lang::parse::AST; -use crate::lang::pool::{NodeId}; +use crate::lang::pool::NodeId; use crate::lang::pool::PoolStr; use crate::ui::text::caret_w_select::CaretWSelect; use crate::ui::text::lines::SelectableLines; @@ -55,27 +55,21 @@ pub fn init_model<'a>( loaded_module: LoadedModule, code_arena: &'a Bump, ) -> EdResult> { - let mut module = EdModule::new(&code_str, env, &code_arena)?; let mut markup_node_pool = SlowPool::new(); - let markup_ids = - if code_str.is_empty() { - - EmptyCodeString{}.fail() - - } else { - - ast_to_mark_nodes( - &code_arena, - &mut module.env, - &module.ast, - &mut markup_node_pool, - &loaded_module.interns - ) - - }?; + let markup_ids = if code_str.is_empty() { + EmptyCodeString {}.fail() + } else { + ast_to_mark_nodes( + &code_arena, + &mut module.env, + &module.ast, + &mut markup_node_pool, + &loaded_module.interns, + ) + }?; let code_lines = EdModel::build_code_lines_from_markup(&markup_ids, &markup_node_pool)?; let grid_node_map = EdModel::build_node_map_from_markup(&markup_ids, &markup_node_pool)?; @@ -160,25 +154,17 @@ pub struct EdModule<'a> { impl<'a> EdModule<'a> { pub fn new(code_str: &'a str, mut env: Env<'a>, ast_arena: &'a Bump) -> EdResult> { if !code_str.is_empty() { - let parse_res = AST::parse_from_string(code_str, &mut env, ast_arena); match parse_res { - Ok(ast) => { - Ok( - EdModule { - env, - ast, - } - ) - }, + Ok(ast) => Ok(EdModule { env, ast }), Err(err) => SrcParseError { syntax_err: format!("{:?}", err), - }.fail() + } + .fail(), } - } else { - EmptyCodeString{}.fail() + EmptyCodeString {}.fail() } } } @@ -200,12 +186,12 @@ pub mod test_ed_model { use roc_module::symbol::IdentIds; use roc_module::symbol::ModuleIds; use roc_types::subs::VarStore; - use tempfile::tempdir; - use uuid::Uuid; use std::fs::File; + use std::io::Write; use std::path::Path; use std::path::PathBuf; - use std::io::Write; + use tempfile::tempdir; + use uuid::Uuid; pub fn init_dummy_model<'a>( code_str: &'a str, @@ -229,13 +215,7 @@ pub mod test_ed_model { exposed_ident_ids, ); - ed_model::init_model( - code_str, - file_path, - env, - loaded_module, - code_arena, - ) + ed_model::init_model(code_str, file_path, env, loaded_module, code_arena) } pub struct EdModelRefs { @@ -274,30 +254,28 @@ main = "Hello, world!" *clean_code_str = [header_str, clean_code_str.as_str()].join(""); let temp_dir = tempdir().expect("Failed to create temporary directory for test."); - let temp_file_path_buf = PathBuf::from( - [Uuid::new_v4().to_string(), ".roc".to_string()].join("") - ); + let temp_file_path_buf = + PathBuf::from([Uuid::new_v4().to_string(), ".roc".to_string()].join("")); let temp_file_full_path = temp_dir.path().join(temp_file_path_buf); - - let mut file = File::create(temp_file_full_path.clone()) - .expect( - &format!("Failed to create temporary file for path {:?}", temp_file_full_path) - ); - writeln!(file, "{}", clean_code_str) - .expect( - &format!("Failed to write {:?} to file: {:?}", clean_code_str, file) - ); + + let mut file = File::create(temp_file_full_path.clone()).expect(&format!( + "Failed to create temporary file for path {:?}", + temp_file_full_path + )); + writeln!(file, "{}", clean_code_str).expect(&format!( + "Failed to write {:?} to file: {:?}", + clean_code_str, file + )); let loaded_module = load_module(&temp_file_full_path); - let mut ed_model = - init_dummy_model( - clean_code_str, - loaded_module, - module_ids, - ed_model_refs, - code_arena, - )?; + let mut ed_model = init_dummy_model( + clean_code_str, + loaded_module, + module_ids, + ed_model_refs, + code_arena, + )?; ed_model.set_caret(caret_w_select.caret_pos); diff --git a/editor/src/editor/mvc/ed_update.rs b/editor/src/editor/mvc/ed_update.rs index 3e5dacd85e..d7d31c6b3d 100644 --- a/editor/src/editor/mvc/ed_update.rs +++ b/editor/src/editor/mvc/ed_update.rs @@ -96,12 +96,16 @@ impl<'a> EdModel<'a> { markup_ids: &[MarkNodeId], markup_node_pool: &SlowPool, ) -> EdResult { - let mut grid_node_map = GridNodeMap::new(); let mut line_ctr = 0; for mark_id in markup_ids.iter() { - EdModel::build_grid_node_map(*mark_id, &mut grid_node_map, &mut line_ctr, markup_node_pool)?; + EdModel::build_grid_node_map( + *mark_id, + &mut grid_node_map, + &mut line_ctr, + markup_node_pool, + )?; } Ok(grid_node_map) @@ -191,16 +195,20 @@ impl<'a> EdModel<'a> { index: usize, node_ids: &[MarkNodeId], ) -> UIResult<()> { - let mut col_nr = index; for &node_id in node_ids { let node_content_str = self.markup_node_pool.get(node_id).get_content(); - self.grid_node_map - .insert_between_line(line_nr, col_nr, node_content_str.len(), node_id)?; + self.grid_node_map.insert_between_line( + line_nr, + col_nr, + node_content_str.len(), + node_id, + )?; - self.code_lines.insert_between_line(line_nr, col_nr, &node_content_str)?; + self.code_lines + .insert_between_line(line_nr, col_nr, &node_content_str)?; col_nr += node_content_str.len(); } @@ -317,7 +325,12 @@ impl<'a> EdModel<'a> { let content = subs.get(var).content; PoolStr::new( - &content_to_string(content, &subs, self.module.env.home, &self.loaded_module.interns), + &content_to_string( + content, + &subs, + self.module.env.home, + &self.loaded_module.interns, + ), self.module.env.pool, ) } @@ -931,14 +944,19 @@ pub mod test_ed_update { expected_post_lines: &[&str], new_char_seq: &str, ) -> Result<(), String> { - let mut code_str = pre_lines.join("\n").replace("┃", ""); let mut model_refs = init_model_refs(); let code_arena = Bump::new(); let module_ids = ModuleIds::default(); - let mut ed_model = ed_model_from_dsl(&mut code_str, pre_lines, &mut model_refs, &module_ids, &code_arena)?; + let mut ed_model = ed_model_from_dsl( + &mut code_str, + pre_lines, + &mut model_refs, + &module_ids, + &code_arena, + )?; for input_char in new_char_seq.chars() { if input_char == '🡲' { @@ -1809,7 +1827,7 @@ pub mod test_ed_update { #[test] fn test_ignore_let_value() -> Result<(), String> { - assert_insert_seq_ignore(&["a ┃= 0","a"], IGNORE_CHARS)?; + assert_insert_seq_ignore(&["a ┃= 0", "a"], IGNORE_CHARS)?; assert_insert_seq_ignore(&["a =┃ 0", "a"], IGNORE_CHARS)?; Ok(()) @@ -1822,14 +1840,19 @@ pub mod test_ed_update { expected_post_lines: &[&str], repeats: usize, ) -> Result<(), String> { - let mut code_str = pre_lines.join("").replace("┃", ""); let mut model_refs = init_model_refs(); let code_arena = Bump::new(); let module_ids = ModuleIds::default(); - let mut ed_model = ed_model_from_dsl(&mut code_str, pre_lines, &mut model_refs, &module_ids, &code_arena)?; + let mut ed_model = ed_model_from_dsl( + &mut code_str, + pre_lines, + &mut model_refs, + &module_ids, + &code_arena, + )?; for _ in 0..repeats { ed_model.ed_handle_key_down(&ctrl_cmd_shift(), Up)?; @@ -2082,14 +2105,19 @@ pub mod test_ed_update { expected_tooltips: &[&str], new_char_seq: &str, ) -> Result<(), String> { - let mut code_str = pre_lines.join("").replace("┃", ""); let mut model_refs = init_model_refs(); let code_arena = Bump::new(); let module_ids = ModuleIds::default(); - let mut ed_model = ed_model_from_dsl(&mut code_str, pre_lines, &mut model_refs, &module_ids, &code_arena)?; + let mut ed_model = ed_model_from_dsl( + &mut code_str, + pre_lines, + &mut model_refs, + &module_ids, + &code_arena, + )?; for input_char in new_char_seq.chars() { if input_char == '🡲' { @@ -2244,7 +2272,13 @@ pub mod test_ed_update { let code_arena = Bump::new(); let module_ids = ModuleIds::default(); - let mut ed_model = ed_model_from_dsl(&mut code_str, pre_lines, &mut model_refs, &module_ids, &code_arena)?; + let mut ed_model = ed_model_from_dsl( + &mut code_str, + pre_lines, + &mut model_refs, + &module_ids, + &code_arena, + )?; for _ in 0..repeats { ed_model.ed_handle_key_down(&ctrl_cmd_shift(), Up)?; @@ -2374,7 +2408,13 @@ pub mod test_ed_update { let code_arena = Bump::new(); let module_ids = ModuleIds::default(); - let mut ed_model = ed_model_from_dsl(&mut code_str, pre_lines, &mut model_refs, &module_ids, &code_arena)?; + let mut ed_model = ed_model_from_dsl( + &mut code_str, + pre_lines, + &mut model_refs, + &module_ids, + &code_arena, + )?; for _ in 0..repeats { ed_model.ed_handle_key_down(&ctrl_cmd_shift(), Up)?; diff --git a/editor/src/editor/mvc/let_update.rs b/editor/src/editor/mvc/let_update.rs index 421e7bdc46..626054454b 100644 --- a/editor/src/editor/mvc/let_update.rs +++ b/editor/src/editor/mvc/let_update.rs @@ -1,7 +1,7 @@ use inlinable_string::InlinableString; use roc_module::symbol::Symbol; -use crate::editor::ed_error::{EdResult}; +use crate::editor::ed_error::EdResult; use crate::editor::markup::attribute::Attributes; use crate::editor::markup::common_nodes::new_blank_mn; use crate::editor::markup::common_nodes::new_equals_mn; @@ -18,7 +18,6 @@ use crate::lang::pool::NodeId; use crate::ui::text::lines::SelectableLines; use std::iter::FromIterator; - pub fn start_new_let_value(ed_model: &mut EdModel, new_char: &char) -> EdResult { let NodeContext { old_caret_pos, @@ -39,17 +38,16 @@ pub fn start_new_let_value(ed_model: &mut EdModel, new_char: &char) -> EdResult< let ident_id = ed_model.module.env.ident_ids.add(ident_string); let var_symbol = Symbol::new(ed_model.module.env.home, ident_id); let body = Expr2::Var(var_symbol); - let body_id = ed_model.module.env.pool.add(body); + let body_id = ed_model.module.env.pool.add(body); let pattern = Pattern2::Identifier(var_symbol); let pattern_id = ed_model.module.env.pool.add(pattern); - let value_def = - ValueDef::NoAnnotation { - pattern_id, - expr_id: val_expr_id, - expr_var: ed_model.module.env.var_store.fresh() - }; + let value_def = ValueDef::NoAnnotation { + pattern_id, + expr_id: val_expr_id, + expr_var: ed_model.module.env.var_store.fresh(), + }; let def_id = ed_model.module.env.pool.add(value_def); let expr2_node = Expr2::LetValue { @@ -104,7 +102,13 @@ pub fn start_new_let_value(ed_model: &mut EdModel, new_char: &char) -> EdResult< } } -pub fn update_let_value(val_name_mn_id: MarkNodeId, def_id: NodeId, body_id: NodeId, ed_model: &mut EdModel, new_char: &char) -> EdResult { +pub fn update_let_value( + val_name_mn_id: MarkNodeId, + def_id: NodeId, + body_id: NodeId, + ed_model: &mut EdModel, + new_char: &char, +) -> EdResult { if new_char.is_ascii_alphanumeric() { let old_caret_pos = ed_model.get_caret(); @@ -128,13 +132,26 @@ pub fn update_let_value(val_name_mn_id: MarkNodeId, def_id: NodeId, bo let ident_string = InlinableString::from_iter(content_str_mut.chars()); // TODO no unwrap - let ident_id = ed_model.module.env.ident_ids.update_key(old_val_ident_string, ident_string).unwrap(); + let ident_id = ed_model + .module + .env + .ident_ids + .update_key(old_val_ident_string, ident_string) + .unwrap(); let new_var_symbol = Symbol::new(ed_model.module.env.home, ident_id); - ed_model.module.env.pool.set(value_ident_pattern_id, Pattern2::Identifier(new_var_symbol)); - - ed_model.module.env.pool.set(body_id, Expr2::Var(new_var_symbol)); + ed_model + .module + .env + .pool + .set(value_ident_pattern_id, Pattern2::Identifier(new_var_symbol)); + + ed_model + .module + .env + .pool + .set(body_id, Expr2::Var(new_var_symbol)); // update GridNodeMap and CodeLines ed_model.insert_between_line( @@ -151,7 +168,6 @@ pub fn update_let_value(val_name_mn_id: MarkNodeId, def_id: NodeId, bo } else { Ok(InputOutcome::Ignored) } - } else { Ok(InputOutcome::Ignored) } diff --git a/editor/src/editor/mvc/list_update.rs b/editor/src/editor/mvc/list_update.rs index ae9da44505..1a2ee18ea4 100644 --- a/editor/src/editor/mvc/list_update.rs +++ b/editor/src/editor/mvc/list_update.rs @@ -1,6 +1,8 @@ use crate::editor::ed_error::EdResult; use crate::editor::ed_error::{MissingParent, UnexpectedASTNode}; -use crate::editor::markup::common_nodes::{new_blank_mn, new_comma_mn, new_left_square_mn, new_right_square_mn}; +use crate::editor::markup::common_nodes::{ + new_blank_mn, new_comma_mn, new_left_square_mn, new_right_square_mn, +}; use crate::editor::markup::nodes; use crate::editor::markup::nodes::MarkupNode; use crate::editor::mvc::app_update::InputOutcome; @@ -31,15 +33,11 @@ pub fn start_new_list(ed_model: &mut EdModel) -> EdResult { ed_model.module.env.pool.set(ast_node_id, expr2_node); - let left_bracket_node_id = - ed_model.add_mark_node( - new_left_square_mn(ast_node_id, Some(curr_mark_node_id)) - ); + let left_bracket_node_id = + ed_model.add_mark_node(new_left_square_mn(ast_node_id, Some(curr_mark_node_id))); let right_bracket_node_id = - ed_model.add_mark_node( - new_right_square_mn(ast_node_id, Some(curr_mark_node_id)) - ); + ed_model.add_mark_node(new_right_square_mn(ast_node_id, Some(curr_mark_node_id))); let nested_node = MarkupNode::Nested { ast_node_id, @@ -48,7 +46,9 @@ pub fn start_new_list(ed_model: &mut EdModel) -> EdResult { }; if is_blank_node { - ed_model.markup_node_pool.replace_node(curr_mark_node_id, nested_node); + ed_model + .markup_node_pool + .replace_node(curr_mark_node_id, nested_node); // remove data corresponding to Blank node ed_model.del_at_line(old_caret_pos.line, old_caret_pos.column)?; @@ -178,23 +178,13 @@ pub fn update_mark_children( parent_id_opt: Option, ed_model: &mut EdModel, ) -> EdResult> { - - let blank_mark_node_id = - ed_model - .add_mark_node( - new_blank_mn(blank_elt_id, parent_id_opt) - ); - + let blank_mark_node_id = ed_model.add_mark_node(new_blank_mn(blank_elt_id, parent_id_opt)); let mut children: Vec = vec![]; if new_child_index > 1 { - let comma_mark_node_id = - ed_model - .add_mark_node( - new_comma_mn(list_ast_node_id, parent_id_opt) - ); + ed_model.add_mark_node(new_comma_mn(list_ast_node_id, parent_id_opt)); ed_model.simple_move_carets_right(nodes::COMMA.len()); diff --git a/editor/src/editor/mvc/mod.rs b/editor/src/editor/mvc/mod.rs index 7edbc8cabd..7f77d10fee 100644 --- a/editor/src/editor/mvc/mod.rs +++ b/editor/src/editor/mvc/mod.rs @@ -4,8 +4,8 @@ pub mod ed_model; pub mod ed_update; pub mod ed_view; mod int_update; -mod list_update; mod let_update; +mod list_update; mod lookup_update; mod record_update; mod string_update; diff --git a/editor/src/editor/mvc/record_update.rs b/editor/src/editor/mvc/record_update.rs index 97d9e1d43b..73f41a2d6a 100644 --- a/editor/src/editor/mvc/record_update.rs +++ b/editor/src/editor/mvc/record_update.rs @@ -36,15 +36,11 @@ pub fn start_new_record(ed_model: &mut EdModel) -> EdResult { ast_pool.set(ast_node_id, expr2_node); - let left_bracket_node_id = - ed_model.add_mark_node( - new_left_accolade_mn(ast_node_id, Some(curr_mark_node_id)) - ); + let left_bracket_node_id = + ed_model.add_mark_node(new_left_accolade_mn(ast_node_id, Some(curr_mark_node_id))); - let right_bracket_node_id = - ed_model.add_mark_node( - new_right_accolade_mn(ast_node_id, Some(curr_mark_node_id)) - ); + let right_bracket_node_id = + ed_model.add_mark_node(new_right_accolade_mn(ast_node_id, Some(curr_mark_node_id))); let nested_node = MarkupNode::Nested { ast_node_id, @@ -53,7 +49,9 @@ pub fn start_new_record(ed_model: &mut EdModel) -> EdResult { }; if is_blank_node { - ed_model.markup_node_pool.replace_node(curr_mark_node_id, nested_node); + ed_model + .markup_node_pool + .replace_node(curr_mark_node_id, nested_node); // remove data corresponding to Blank node ed_model.del_at_line(old_caret_pos.line, old_caret_pos.column)?; @@ -64,7 +62,7 @@ pub fn start_new_record(ed_model: &mut EdModel) -> EdResult { ed_model.insert_all_between_line( old_caret_pos.line, old_caret_pos.column, - &vec![left_bracket_node_id, right_bracket_node_id] + &vec![left_bracket_node_id, right_bracket_node_id], )?; Ok(InputOutcome::Accepted) @@ -232,12 +230,9 @@ pub fn update_record_colon( .get_mut(parent_id) .add_child_at_index(new_child_index, record_colon_node_id)?; - let record_blank_node_id = - ed_model - .add_mark_node( - new_blank_mn(new_field_val_id, Some(parent_id)) - ); - + let record_blank_node_id = ed_model + .add_mark_node(new_blank_mn(new_field_val_id, Some(parent_id))); + ed_model .markup_node_pool .get_mut(parent_id) diff --git a/editor/src/editor/mvc/string_update.rs b/editor/src/editor/mvc/string_update.rs index ff94419838..90e1238ba2 100644 --- a/editor/src/editor/mvc/string_update.rs +++ b/editor/src/editor/mvc/string_update.rs @@ -7,9 +7,9 @@ use crate::editor::mvc::ed_model::EdModel; use crate::editor::mvc::ed_update::get_node_context; use crate::editor::mvc::ed_update::NodeContext; use crate::editor::syntax_highlight::HighlightStyle; +use crate::lang::ast::update_str_expr; use crate::lang::ast::ArrString; use crate::lang::ast::Expr2; -use crate::lang::ast::update_str_expr; use crate::lang::pool::PoolStr; pub fn update_small_string( @@ -74,10 +74,7 @@ pub fn update_small_string( } } -pub fn update_string( - new_char: char, - ed_model: &mut EdModel, -) -> EdResult { +pub fn update_string(new_char: char, ed_model: &mut EdModel) -> EdResult { let NodeContext { old_caret_pos, curr_mark_node_id, @@ -105,7 +102,12 @@ pub fn update_string( )?; // update ast - update_str_expr(ast_node_id, new_char, node_caret_offset, &mut ed_model.module.env.pool)?; + update_str_expr( + ast_node_id, + new_char, + node_caret_offset, + &mut ed_model.module.env.pool, + )?; // update caret ed_model.simple_move_carets_right(1); diff --git a/editor/src/editor/render_ast.rs b/editor/src/editor/render_ast.rs index 93f5227b1e..56f77282ab 100644 --- a/editor/src/editor/render_ast.rs +++ b/editor/src/editor/render_ast.rs @@ -24,7 +24,7 @@ pub fn build_code_graphics<'a>( let mut all_glyph_text_vec = vec![]; let mut all_rects = vec![]; - let mut txt_row_col = (0,0); + let mut txt_row_col = (0, 0); for markup_id in markup_ids.iter() { let mark_node = markup_node_pool.get(*markup_id); @@ -72,7 +72,7 @@ struct CodeStyle<'a> { fn markup_to_wgpu<'a>( markup_node: &'a MarkupNode, code_style: &CodeStyle, - txt_row_col: &mut (usize, usize), + txt_row_col: &mut (usize, usize), markup_node_pool: &'a SlowPool, ) -> EdResult<(Vec, Vec)> { let mut wgpu_texts: Vec = Vec::new(); diff --git a/editor/src/editor/render_debug.rs b/editor/src/editor/render_debug.rs index d97ad211b1..e6ef056df4 100644 --- a/editor/src/editor/render_debug.rs +++ b/editor/src/editor/render_debug.rs @@ -32,41 +32,28 @@ pub fn build_debug_graphics( let mut mark_node_trees_string = "\nmark node trees:".to_owned(); for mark_id in ed_model.markup_ids.iter() { - - mark_node_trees_string.push_str( - &tree_as_string( - *mark_id, - &ed_model.markup_node_pool, - ) - ); + mark_node_trees_string.push_str(&tree_as_string(*mark_id, &ed_model.markup_node_pool)); mark_node_trees_string.push_str("\n"); } - let mark_node_tree_text = glyph_brush::OwnedText::new( - mark_node_trees_string - ) - .with_color(colors::to_slice(from_hsb(266, 31, 96))) - .with_scale(config.code_font_size); + let mark_node_tree_text = glyph_brush::OwnedText::new(mark_node_trees_string) + .with_color(colors::to_slice(from_hsb(266, 31, 96))) + .with_scale(config.code_font_size); let mark_node_pool_text = glyph_brush::OwnedText::new(format!("{}", ed_model.markup_node_pool)) .with_color(colors::to_slice(from_hsb(110, 45, 82))) .with_scale(config.code_font_size); - let mut ast_node_text_str = "AST:\n".to_owned(); for expr_id in ed_model.module.ast.expression_ids.iter() { - ast_node_text_str.push_str( - &expr2_to_string(*expr_id, ed_model.module.env.pool) - ) + ast_node_text_str.push_str(&expr2_to_string(*expr_id, ed_model.module.env.pool)) } - let ast_node_text = glyph_brush::OwnedText::new( - ast_node_text_str - ) - .with_color(colors::to_slice(from_hsb(211, 80, 100))) - .with_scale(config.code_font_size); + let ast_node_text = glyph_brush::OwnedText::new(ast_node_text_str) + .with_color(colors::to_slice(from_hsb(211, 80, 100))) + .with_scale(config.code_font_size); let section = gr_text::owned_section_from_glyph_texts( vec![ diff --git a/editor/src/lang/ast.rs b/editor/src/lang/ast.rs index e1d7ca796f..9819e26ea8 100644 --- a/editor/src/lang/ast.rs +++ b/editor/src/lang/ast.rs @@ -3,11 +3,11 @@ use std::collections::{HashMap, HashSet}; use std::hash::BuildHasherDefault; +use crate::editor::ed_error::{EdResult, UnexpectedASTNode}; use crate::lang::pattern::{Pattern2, PatternId}; use crate::lang::pool::Pool; use crate::lang::pool::{NodeId, PoolStr, PoolVec, ShallowClone}; use crate::lang::types::{Type2, TypeId}; -use crate::editor::ed_error::{EdResult, UnexpectedASTNode}; use arraystring::{typenum::U30, ArrayString}; use roc_can::expr::Recursive; use roc_collections::all::WyHash; @@ -269,15 +269,15 @@ impl ShallowClone for ValueDef { impl ValueDef { pub fn get_expr_id(&self) -> ExprId { match self { - ValueDef::WithAnnotation { expr_id, ..} => *expr_id, - ValueDef::NoAnnotation {expr_id, ..} => *expr_id, + ValueDef::WithAnnotation { expr_id, .. } => *expr_id, + ValueDef::NoAnnotation { expr_id, .. } => *expr_id, } } pub fn get_pattern_id(&self) -> NodeId { match self { - ValueDef::WithAnnotation { pattern_id, ..} => *pattern_id, - ValueDef::NoAnnotation {pattern_id, ..} => *pattern_id, + ValueDef::WithAnnotation { pattern_id, .. } => *pattern_id, + ValueDef::NoAnnotation { pattern_id, .. } => *pattern_id, } } } @@ -564,8 +564,13 @@ fn expr2_to_string_helper( Expr2::SmallInt { text, .. } => { out_string.push_str(&format!("SmallInt({})", text.as_str(pool))); } - Expr2::LetValue {def_id, body_id, .. } => { - out_string.push_str(&format!("LetValue(def_id: {}, body_id: {})", def_id.index, body_id.index)); + Expr2::LetValue { + def_id, body_id, .. + } => { + out_string.push_str(&format!( + "LetValue(def_id: {}, body_id: {})", + def_id.index, body_id.index + )); } other => todo!("Implement for {:?}", other), } @@ -580,26 +585,22 @@ fn var_to_string(some_var: &Variable, indent_level: usize) -> String { // get string from SmallStr or Str pub fn get_string_from_expr2(node_id: ExprId, pool: &Pool) -> EdResult { match pool.get(node_id) { - Expr2::SmallStr(arr_string) => { - Ok( - arr_string.as_str().to_string() - ) - }, - Expr2::Str(pool_str) => { - Ok( - pool_str.as_str(pool).to_owned() - ) - } - other => { - UnexpectedASTNode{ - required_node_type: "SmallStr or Str", - encountered_node_type: format!("{:?}", other) - }.fail()? + Expr2::SmallStr(arr_string) => Ok(arr_string.as_str().to_string()), + Expr2::Str(pool_str) => Ok(pool_str.as_str(pool).to_owned()), + other => UnexpectedASTNode { + required_node_type: "SmallStr or Str", + encountered_node_type: format!("{:?}", other), } + .fail()?, } } -pub fn update_str_expr(node_id: ExprId, new_char: char, insert_index: usize, pool: &mut Pool) -> EdResult<()> { +pub fn update_str_expr( + node_id: ExprId, + new_char: char, + insert_index: usize, + pool: &mut Pool, +) -> EdResult<()> { let str_expr = pool.get_mut(node_id); enum Either { @@ -610,8 +611,7 @@ pub fn update_str_expr(node_id: ExprId, new_char: char, insert_index: usize, poo let insert_either = match str_expr { Expr2::SmallStr(arr_string) => { - let insert_res = - arr_string.try_insert(insert_index as u8, new_char); + let insert_res = arr_string.try_insert(insert_index as u8, new_char); match insert_res { Ok(_) => Either::Done, @@ -622,16 +622,13 @@ pub fn update_str_expr(node_id: ExprId, new_char: char, insert_index: usize, poo Either::MyString(new_string) } } - }, - Expr2::Str(old_pool_str) => { - Either::MyPoolStr(*old_pool_str) - }, - other => { - UnexpectedASTNode{ - required_node_type: "SmallStr or Str", - encountered_node_type: format!("{:?}", other) - }.fail()? } + Expr2::Str(old_pool_str) => Either::MyPoolStr(*old_pool_str), + other => UnexpectedASTNode { + required_node_type: "SmallStr or Str", + encountered_node_type: format!("{:?}", other), + } + .fail()?, }; match insert_either { @@ -639,7 +636,7 @@ pub fn update_str_expr(node_id: ExprId, new_char: char, insert_index: usize, poo let new_pool_str = PoolStr::new(&new_string, pool); pool.set(node_id, Expr2::Str(new_pool_str)) - }, + } Either::MyPoolStr(old_pool_str) => { let mut new_string = old_pool_str.as_str(pool).to_owned(); new_string.insert(insert_index, new_char); @@ -647,7 +644,7 @@ pub fn update_str_expr(node_id: ExprId, new_char: char, insert_index: usize, poo let new_pool_str = PoolStr::new(&new_string, pool); pool.set(node_id, Expr2::Str(new_pool_str)) - }, + } Either::Done => (), } diff --git a/editor/src/lang/expr.rs b/editor/src/lang/expr.rs index d888751217..d529163026 100644 --- a/editor/src/lang/expr.rs +++ b/editor/src/lang/expr.rs @@ -6,7 +6,10 @@ use inlinable_string::InlinableString; use std::collections::HashMap; use std::iter::FromIterator; -use crate::lang::ast::{ClosureExtra, Expr2, ExprId, FloatVal, IntStyle, IntVal, RecordField, ValueDef, WhenBranch, expr2_to_string}; +use crate::lang::ast::{ + expr2_to_string, ClosureExtra, Expr2, ExprId, FloatVal, IntStyle, IntVal, RecordField, + ValueDef, WhenBranch, +}; use crate::lang::def::{ canonicalize_defs, sort_can_defs, CanDefs, Declaration, Def, PendingDef, References, }; @@ -296,16 +299,13 @@ pub fn str_to_expr2_w_defs<'a>( region: Region, ) -> Result, SyntaxError<'a>> { match roc_parse::test_helpers::parse_defs_with(arena, input.trim()) { - Ok(vec_loc_def) => { - - Ok(to_expr2_from_defs( - arena, - env, - scope, - arena.alloc(vec_loc_def), - region, - )) - } + Ok(vec_loc_def) => Ok(to_expr2_from_defs( + arena, + env, + scope, + arena.alloc(vec_loc_def), + region, + )), Err(fail) => Err(fail), } } @@ -318,9 +318,7 @@ pub fn str_to_expr2<'a>( region: Region, ) -> Result<(Expr2, self::Output), SyntaxError<'a>> { match roc_parse::test_helpers::parse_loc_with(arena, input.trim()) { - Ok(loc_expr) => { - Ok(loc_expr_to_expr2(arena, loc_expr, env, scope, region)) - } + Ok(loc_expr) => Ok(loc_expr_to_expr2(arena, loc_expr, env, scope, region)), Err(fail) => Err(fail), } } @@ -334,12 +332,7 @@ fn loc_expr_to_expr2<'a>( ) -> (Expr2, self::Output) { let desugared_loc_expr = desugar_expr(arena, arena.alloc(loc_expr)); - to_expr2( - env, - scope, - arena.alloc(desugared_loc_expr.value), - region, - ) + to_expr2(env, scope, arena.alloc(desugared_loc_expr.value), region) } pub fn to_expr2<'a>( @@ -1009,10 +1002,10 @@ pub fn to_expr2_from_defs<'a>( ) -> Vec { use roc_parse::ast::Expr::*; - parsed_defs.iter().map(|loc| { - to_expr2_from_def(arena, env, scope, &loc.value, region) - }).collect() - + parsed_defs + .iter() + .map(|loc| to_expr2_from_def(arena, env, scope, &loc.value, region)) + .collect() } pub fn to_expr2_from_def<'a>( @@ -1025,12 +1018,8 @@ pub fn to_expr2_from_def<'a>( use roc_parse::ast::Def::*; match parsed_def { - SpaceBefore(inner_def, _) => { - to_expr2_from_def(arena, env, scope, inner_def, region) - }, - SpaceAfter(inner_def, _) => { - to_expr2_from_def(arena, env, scope, inner_def, region) - } + SpaceBefore(inner_def, _) => to_expr2_from_def(arena, env, scope, inner_def, region), + SpaceAfter(inner_def, _) => to_expr2_from_def(arena, env, scope, inner_def, region), Body(&loc_pattern, &loc_expr) => { // TODO loc_pattern use identifier let body_expr2 = loc_expr_to_expr2(arena, loc_expr, env, scope, region).0; @@ -1041,7 +1030,13 @@ pub fn to_expr2_from_def<'a>( match loc_pattern.value { Identifier(str_ref) => { - let (_, pattern2) = to_pattern2(env, scope, PatternType::TopLevelDef, &loc_pattern.value, region); + let (_, pattern2) = to_pattern2( + env, + scope, + PatternType::TopLevelDef, + &loc_pattern.value, + region, + ); let pattern_id = env.pool.add(pattern2); // TODO support with annotation @@ -1053,25 +1048,32 @@ pub fn to_expr2_from_def<'a>( let value_def_id = env.pool.add(value_def); - let ident_string = inlinable_string::InlinableString::from_iter(str_ref.chars()); + let ident_string = + inlinable_string::InlinableString::from_iter(str_ref.chars()); let ident_id = env.ident_ids.add(ident_string); let var_symbol = Symbol::new(env.home, ident_id); let body = Expr2::Var(var_symbol); - let body_id = env.pool.add(body); + let body_id = env.pool.add(body); Expr2::LetValue { def_id: value_def_id, body_var: env.var_store.fresh(), body_id, } - }, + } other => { - unimplemented!("I don't yet know how to convert the pattern {:?} into an expr2", other) + unimplemented!( + "I don't yet know how to convert the pattern {:?} into an expr2", + other + ) } } } other => { - unimplemented!("I don't know how to make an expr2 from this def yet: {:?}", other) + unimplemented!( + "I don't know how to make an expr2 from this def yet: {:?}", + other + ) } } } @@ -1520,15 +1522,18 @@ fn decl_to_let(pool: &mut Pool, var_store: &mut VarStore, decl: Declaration, ret Declaration::Declare(def) => match def { Def::AnnotationOnly { .. } => todo!(), Def::Value(value_def) => { - // TODO remove me match &value_def { - ValueDef::NoAnnotation{ pattern_id, expr_id, expr_var} => { + ValueDef::NoAnnotation { + pattern_id, + expr_id, + expr_var, + } => { dbg!(pool.get(*pattern_id)); dbg!(pool.get(*expr_id)); dbg!(expr_var); } - _ => panic!("REMOVE THIS BLOCK") + _ => panic!("REMOVE THIS BLOCK"), } let def_id = pool.add(value_def); diff --git a/editor/src/lang/mod.rs b/editor/src/lang/mod.rs index 45f3dee65a..fa747386e1 100644 --- a/editor/src/lang/mod.rs +++ b/editor/src/lang/mod.rs @@ -1,9 +1,9 @@ pub mod ast; -pub mod parse; pub mod constrain; mod def; pub mod expr; mod module; +pub mod parse; pub mod pattern; pub mod pool; pub mod roc_file; diff --git a/editor/src/lang/parse.rs b/editor/src/lang/parse.rs index 1791bb6f7c..2948c7b0b8 100644 --- a/editor/src/lang/parse.rs +++ b/editor/src/lang/parse.rs @@ -1,10 +1,12 @@ +use crate::lang::scope::Scope; use bumpalo::Bump; use roc_parse::parser::SyntaxError; -use crate::lang::scope::Scope; use roc_region::all::Region; -use super::{ast::{Expr2, ExprId}, expr::{Env, str_to_expr2_w_defs}}; - +use super::{ + ast::{Expr2, ExprId}, + expr::{str_to_expr2_w_defs, Env}, +}; // WORK IN PROGRESS FILE @@ -24,10 +26,15 @@ pub struct AppHeader { } impl AST { - pub fn parse_from_string<'a>(code_str: &'a str, env: &mut Env<'a>, ast_arena: &'a Bump) -> Result> { + pub fn parse_from_string<'a>( + code_str: &'a str, + env: &mut Env<'a>, + ast_arena: &'a Bump, + ) -> Result> { + let blank_line_indx = code_str + .find("\n\n") + .expect("I was expecting a double newline to split header and rest of code."); - let blank_line_indx = code_str.find("\n\n").expect("I was expecting a double newline to split header and rest of code."); - let header_str = &code_str[0..blank_line_indx]; let tail_str = &code_str[blank_line_indx..]; @@ -36,7 +43,6 @@ impl AST { let mut expression_ids = Vec::::new(); - let expr2_vec = str_to_expr2_w_defs(&ast_arena, tail_str, env, &mut scope, region)?; for expr2 in expr2_vec { @@ -44,30 +50,25 @@ impl AST { expression_ids.push(expr_id); } - + let ast_node_id = env.pool.add(Expr2::Blank); - Ok( - AST { - header: AppHeader::parse_from_string(header_str, ast_node_id), - expression_ids, - } - ) - + Ok(AST { + header: AppHeader::parse_from_string(header_str, ast_node_id), + expression_ids, + }) } } impl AppHeader { - // TODO don't use mock struct and actually parse string pub fn parse_from_string(_header_str: &str, ast_node_id: ExprId) -> Self { - AppHeader { app_name: "\"untitled_app\"".to_owned(), packages_base: "\"platform\"".to_owned(), imports: vec![], - provides: vec![ "main".to_owned() ], - ast_node_id + provides: vec!["main".to_owned()], + ast_node_id, } } -} \ No newline at end of file +} diff --git a/editor/src/lang/pattern.rs b/editor/src/lang/pattern.rs index 43ddf504f6..b15af3618d 100644 --- a/editor/src/lang/pattern.rs +++ b/editor/src/lang/pattern.rs @@ -485,15 +485,12 @@ pub fn symbols_from_pattern(pool: &Pool, initial: &Pattern2) -> Vec { pub fn get_identifier_string(pattern: &Pattern2, interns: &Interns) -> EdResult { match pattern { - Pattern2::Identifier(symbol) => { - Ok(symbol.ident_string(interns).to_string()) - } - other => { - UnexpectedPattern2Variant { - required_pattern2: "Identifier".to_string(), - encountered_pattern2: format!("{:?}", other) - }.fail()? + Pattern2::Identifier(symbol) => Ok(symbol.ident_string(interns).to_string()), + other => UnexpectedPattern2Variant { + required_pattern2: "Identifier".to_string(), + encountered_pattern2: format!("{:?}", other), } + .fail()?, } }