bug fixes, updated tests

This commit is contained in:
Anton-4 2021-08-31 19:54:48 +02:00
parent 3c858cff96
commit 6d6ae5d5c0
19 changed files with 1074 additions and 974 deletions

View file

@ -589,9 +589,10 @@ impl IdentIds {
) )
} }
} }
None => { None => Err(format!(
Err(format!("Tried to update key in IdentIds ({:?}) but I could not find the key ({}).", self.by_ident, old_ident_name)) "Tried to update key in IdentIds ({:?}) but I could not find the key ({}).",
} self.by_ident, old_ident_name
)),
} }
} }

View file

@ -12,7 +12,6 @@ use snafu::{Backtrace, ErrorCompat, NoneError, ResultExt, Snafu};
#[derive(Debug, Snafu)] #[derive(Debug, Snafu)]
#[snafu(visibility(pub))] #[snafu(visibility(pub))]
pub enum EdError { pub enum EdError {
#[snafu(display( #[snafu(display(
"ASTNodeIdWithoutDefId: The expr_id_opt in ASTNode({:?}) was `None` but I was expexting `Some(DefId)` .", "ASTNodeIdWithoutDefId: The expr_id_opt in ASTNode({:?}) was `None` but I was expexting `Some(DefId)` .",
ast_node_id ast_node_id

View file

@ -166,10 +166,7 @@ impl GridNodeMap {
let (first_node_index, last_node_index) = first_last_index_of(*node_id, line)?; let (first_node_index, last_node_index) = first_last_index_of(*node_id, line)?;
let curr_node_id = slice_get(first_node_index, line)?; let curr_node_id = slice_get(first_node_index, line)?;
let curr_ast_node_id = ed_model let curr_ast_node_id = ed_model.mark_node_pool.get(*curr_node_id).get_ast_node_id();
.mark_node_pool
.get(*curr_node_id)
.get_ast_node_id();
let mut expr_start_index = first_node_index; let mut expr_start_index = first_node_index;
let mut expr_end_index = last_node_index; let mut expr_end_index = last_node_index;

View file

@ -1,4 +1,7 @@
use crate::{editor::{slow_pool::MarkNodeId, syntax_highlight::HighlightStyle}, lang::{ast::ExprId, parse::ASTNodeId}}; use crate::{
editor::{slow_pool::MarkNodeId, syntax_highlight::HighlightStyle},
lang::{ast::ExprId, parse::ASTNodeId},
};
use super::{attribute::Attributes, nodes, nodes::MarkupNode}; use super::{attribute::Attributes, nodes, nodes::MarkupNode};

View file

@ -11,6 +11,7 @@ use crate::editor::markup::common_nodes::new_left_accolade_mn;
use crate::editor::markup::common_nodes::new_left_square_mn; use crate::editor::markup::common_nodes::new_left_square_mn;
use crate::editor::markup::common_nodes::new_right_accolade_mn; use crate::editor::markup::common_nodes::new_right_accolade_mn;
use crate::editor::markup::common_nodes::new_right_square_mn; use crate::editor::markup::common_nodes::new_right_square_mn;
use crate::editor::mvc::tld_value_update::tld_mark_node;
use crate::editor::slow_pool::MarkNodeId; use crate::editor::slow_pool::MarkNodeId;
use crate::editor::slow_pool::SlowPool; use crate::editor::slow_pool::SlowPool;
use crate::editor::syntax_highlight::HighlightStyle; use crate::editor::syntax_highlight::HighlightStyle;
@ -20,7 +21,6 @@ use crate::lang::ast::DefId;
use crate::lang::ast::ExprId; use crate::lang::ast::ExprId;
use crate::lang::ast::RecordField; use crate::lang::ast::RecordField;
use crate::lang::ast::ValueDef; use crate::lang::ast::ValueDef;
use crate::editor::mvc::tld_value_update::tld_mark_node;
use crate::lang::parse::ASTNodeId; use crate::lang::parse::ASTNodeId;
use crate::lang::parse::{AppHeader, AST}; use crate::lang::parse::{AppHeader, AST};
use crate::lang::pattern::get_identifier_string; use crate::lang::pattern::get_identifier_string;
@ -285,12 +285,13 @@ pub fn def2_to_markup<'a, 'b>(
mark_node_pool: &mut SlowPool, mark_node_pool: &mut SlowPool,
interns: &Interns, interns: &Interns,
) -> EdResult<MarkNodeId> { ) -> EdResult<MarkNodeId> {
let ast_node_id = ASTNodeId::ADefId(def2_node_id); let ast_node_id = ASTNodeId::ADefId(def2_node_id);
let mark_node_id = match def2 { let mark_node_id = match def2 {
Def2::ValueDef { identifier_id, expr_id } => { Def2::ValueDef {
identifier_id,
expr_id,
} => {
let expr_mn_id = expr2_to_markup( let expr_mn_id = expr2_to_markup(
arena, arena,
env, env,
@ -303,18 +304,18 @@ pub fn def2_to_markup<'a, 'b>(
let expr_mn = mark_node_pool.get_mut(expr_mn_id); let expr_mn = mark_node_pool.get_mut(expr_mn_id);
expr_mn.add_newline_at_end(); expr_mn.add_newline_at_end();
let tld_mn = tld_mark_node(
*identifier_id,
expr_mn_id,
ast_node_id,
mark_node_pool,
env,
interns,
)?;
let tld_mn = tld_mark_node(*identifier_id, expr_mn_id, ast_node_id, mark_node_pool, env, interns)?; mark_node_pool.add(tld_mn)
}
mark_node_pool.add( Def2::Blank => mark_node_pool.add(new_blank_mn_w_nl(ast_node_id, None)),
tld_mn
)
},
Def2::Blank => {
mark_node_pool.add(
new_blank_mn_w_nl(ast_node_id, None)
)
},
}; };
Ok(mark_node_id) Ok(mark_node_id)
@ -329,7 +330,6 @@ pub fn expr2_to_markup<'a, 'b>(
mark_node_pool: &mut SlowPool, mark_node_pool: &mut SlowPool,
interns: &Interns, interns: &Interns,
) -> EdResult<MarkNodeId> { ) -> EdResult<MarkNodeId> {
let ast_node_id = ASTNodeId::AExprId(expr2_node_id); let ast_node_id = ASTNodeId::AExprId(expr2_node_id);
let mark_node_id = match expr2 { let mark_node_id = match expr2 {
@ -339,12 +339,7 @@ pub fn expr2_to_markup<'a, 'b>(
| Expr2::Float { text, .. } => { | Expr2::Float { text, .. } => {
let num_str = get_string(env, text); let num_str = get_string(env, text);
new_markup_node( new_markup_node(num_str, ast_node_id, HighlightStyle::Number, mark_node_pool)
num_str,
ast_node_id,
HighlightStyle::Number,
mark_node_pool,
)
} }
Expr2::Str(text) => new_markup_node( Expr2::Str(text) => new_markup_node(
"\"".to_owned() + text.as_str(env.pool) + "\"", "\"".to_owned() + text.as_str(env.pool) + "\"",
@ -365,12 +360,7 @@ pub fn expr2_to_markup<'a, 'b>(
Expr2::Var(symbol) => { Expr2::Var(symbol) => {
//TODO make bump_format with arena //TODO make bump_format with arena
let text = format!("{:?}", symbol); let text = format!("{:?}", symbol);
new_markup_node( new_markup_node(text, ast_node_id, HighlightStyle::Variable, mark_node_pool)
text,
ast_node_id,
HighlightStyle::Variable,
mark_node_pool,
)
} }
Expr2::List { elems, .. } => { Expr2::List { elems, .. } => {
let mut children_ids = let mut children_ids =
@ -398,7 +388,7 @@ pub fn expr2_to_markup<'a, 'b>(
children_ids.push(mark_node_pool.add(new_right_square_mn(expr2_node_id, None))); children_ids.push(mark_node_pool.add(new_right_square_mn(expr2_node_id, None)));
let list_node = MarkupNode::Nested { let list_node = MarkupNode::Nested {
ast_node_id: ast_node_id, ast_node_id,
children_ids, children_ids,
parent_id_opt: None, parent_id_opt: None,
newline_at_end: false, newline_at_end: false,
@ -463,7 +453,7 @@ pub fn expr2_to_markup<'a, 'b>(
children_ids.push(mark_node_pool.add(new_right_accolade_mn(expr2_node_id, None))); children_ids.push(mark_node_pool.add(new_right_accolade_mn(expr2_node_id, None)));
let record_node = MarkupNode::Nested { let record_node = MarkupNode::Nested {
ast_node_id: ast_node_id, ast_node_id,
children_ids, children_ids,
parent_id_opt: None, parent_id_opt: None,
newline_at_end: false, newline_at_end: false,
@ -474,10 +464,9 @@ pub fn expr2_to_markup<'a, 'b>(
Expr2::Blank => mark_node_pool.add(new_blank_mn(ast_node_id, None)), Expr2::Blank => mark_node_pool.add(new_blank_mn(ast_node_id, None)),
Expr2::LetValue { Expr2::LetValue {
def_id, def_id,
body_id:_, body_id: _,
body_var:_, 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);
@ -726,7 +715,11 @@ pub fn header_to_markup(app_header: &AppHeader, mark_node_pool: &mut SlowPool) -
let provides_val_node_id = header_val_mn( let provides_val_node_id = header_val_mn(
// TODO iter over provides like with imports // TODO iter over provides like with imports
app_header.provides.first().unwrap_or(&String::new()).to_owned(), app_header
.provides
.first()
.unwrap_or(&String::new())
.to_owned(),
expr_id, expr_id,
HighlightStyle::Provides, HighlightStyle::Provides,
mark_node_pool, mark_node_pool,

View file

@ -8,7 +8,7 @@ use crate::editor::{
}; };
use crate::graphics::primitives::rect::Rect; use crate::graphics::primitives::rect::Rect;
use crate::lang::expr::Env; use crate::lang::expr::Env;
use crate::lang::parse::{AST, ASTNodeId}; use crate::lang::parse::{ASTNodeId, AST};
use crate::lang::pool::PoolStr; use crate::lang::pool::PoolStr;
use crate::ui::text::caret_w_select::{CaretPos, CaretWSelect}; use crate::ui::text::caret_w_select::{CaretPos, CaretWSelect};
use crate::ui::text::lines::SelectableLines; use crate::ui::text::lines::SelectableLines;
@ -256,18 +256,14 @@ pub mod test_ed_model {
pub fn ed_model_from_dsl<'a>( pub fn ed_model_from_dsl<'a>(
clean_code_str: &'a mut String, clean_code_str: &'a mut String,
code_lines: &[&str], code_lines: Vec<String>,
ed_model_refs: &'a mut EdModelRefs, ed_model_refs: &'a mut EdModelRefs,
module_ids: &'a ModuleIds, module_ids: &'a ModuleIds,
code_arena: &'a Bump, code_arena: &'a Bump,
) -> Result<EdModel<'a>, String> { ) -> Result<EdModel<'a>, String> {
let code_lines_vec: Vec<String> = (*code_lines).iter().map(|s| s.to_string()).collect();
let full_code = vec![HELLO_WORLD, clean_code_str.as_str()]; let full_code = vec![HELLO_WORLD, clean_code_str.as_str()];
*clean_code_str = full_code.join("\n"); *clean_code_str = full_code.join("\n");
dbg!(&clean_code_str);
let temp_dir = tempdir().expect("Failed to create temporary directory for test."); let temp_dir = tempdir().expect("Failed to create temporary directory for test.");
let temp_file_path_buf = let temp_file_path_buf =
PathBuf::from([Uuid::new_v4().to_string(), ".roc".to_string()].join("")); PathBuf::from([Uuid::new_v4().to_string(), ".roc".to_string()].join(""));
@ -294,7 +290,7 @@ pub mod test_ed_model {
// adjust for header and main function // adjust for header and main function
let nr_hello_world_lines = HELLO_WORLD.matches('\n').count() - 1; let nr_hello_world_lines = HELLO_WORLD.matches('\n').count() - 1;
let caret_w_select = convert_dsl_to_selection(&code_lines_vec)?; let caret_w_select = convert_dsl_to_selection(&code_lines)?;
let adjusted_caret_pos = TextPos { let adjusted_caret_pos = TextPos {
line: caret_w_select.caret_pos.line + nr_hello_world_lines, line: caret_w_select.caret_pos.line + nr_hello_world_lines,
column: caret_w_select.caret_pos.column, column: caret_w_select.caret_pos.column,

File diff suppressed because it is too large Load diff

View file

@ -38,7 +38,11 @@ pub fn start_new_int(ed_model: &mut EdModel, digit_char: &char) -> EdResult<Inpu
text: PoolStr::new(&digit_string, &mut ed_model.module.env.pool), text: PoolStr::new(&digit_string, &mut ed_model.module.env.pool),
}; };
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, expr2_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, expr2_node);
let int_node = MarkupNode::Text { let int_node = MarkupNode::Text {
content: digit_string, content: digit_string,
@ -112,7 +116,11 @@ pub fn update_int(
// update ast // update ast
let new_pool_str = PoolStr::new(&content_str, ed_model.module.env.pool); let new_pool_str = PoolStr::new(&content_str, ed_model.module.env.pool);
let int_ast_node = ed_model.module.env.pool.get_mut(int_ast_node_id.to_expr_id()?); let int_ast_node = ed_model
.module
.env
.pool
.get_mut(int_ast_node_id.to_expr_id()?);
match int_ast_node { match int_ast_node {
SmallInt { number, text, .. } => { SmallInt { number, text, .. } => {
update_small_int_num(number, &content_str)?; update_small_int_num(number, &content_str)?;

View file

@ -59,7 +59,11 @@ pub fn start_new_let_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
body_var: ed_model.module.env.var_store.fresh(), body_var: ed_model.module.env.var_store.fresh(),
}; };
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, expr2_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, expr2_node);
let val_name_mark_node = MarkupNode::Text { let val_name_mark_node = MarkupNode::Text {
content: val_name_string, content: val_name_string,
@ -74,8 +78,10 @@ pub fn start_new_let_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
let equals_mn_id = ed_model.add_mark_node(new_equals_mn(ast_node_id, Some(curr_mark_node_id))); let equals_mn_id = ed_model.add_mark_node(new_equals_mn(ast_node_id, Some(curr_mark_node_id)));
let body_mn_id = let body_mn_id = ed_model.add_mark_node(new_blank_mn_w_nl(
ed_model.add_mark_node(new_blank_mn_w_nl(ASTNodeId::AExprId(val_expr_id), Some(curr_mark_node_id))); ASTNodeId::AExprId(val_expr_id),
Some(curr_mark_node_id),
));
let val_mark_node = MarkupNode::Nested { let val_mark_node = MarkupNode::Nested {
ast_node_id, ast_node_id,

View file

@ -10,8 +10,8 @@ use crate::editor::mvc::ed_model::EdModel;
use crate::editor::mvc::ed_update::get_node_context; use crate::editor::mvc::ed_update::get_node_context;
use crate::editor::mvc::ed_update::NodeContext; use crate::editor::mvc::ed_update::NodeContext;
use crate::editor::slow_pool::MarkNodeId; use crate::editor::slow_pool::MarkNodeId;
use crate::lang::ast::{Expr2, ast_node_to_string}; use crate::lang::ast::ExprId;
use crate::lang::ast::{ExprId}; use crate::lang::ast::{ast_node_to_string, Expr2};
use crate::lang::parse::ASTNodeId; use crate::lang::parse::ASTNodeId;
use crate::lang::pool::PoolVec; use crate::lang::pool::PoolVec;
use crate::ui::text::text_pos::TextPos; use crate::ui::text::text_pos::TextPos;
@ -33,13 +33,21 @@ pub fn start_new_list(ed_model: &mut EdModel) -> EdResult<InputOutcome> {
elems: PoolVec::empty(ed_model.module.env.pool), elems: PoolVec::empty(ed_model.module.env.pool),
}; };
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, expr2_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, expr2_node);
let left_bracket_node_id = let left_bracket_node_id = ed_model.add_mark_node(new_left_square_mn(
ed_model.add_mark_node(new_left_square_mn(ast_node_id.to_expr_id()?, Some(curr_mark_node_id))); ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let right_bracket_node_id = let right_bracket_node_id = ed_model.add_mark_node(new_right_square_mn(
ed_model.add_mark_node(new_right_square_mn(ast_node_id.to_expr_id()?, Some(curr_mark_node_id))); ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let nested_node = MarkupNode::Nested { let nested_node = MarkupNode::Nested {
ast_node_id, ast_node_id,
@ -181,7 +189,10 @@ pub fn update_mark_children(
parent_id_opt: Option<MarkNodeId>, parent_id_opt: Option<MarkNodeId>,
ed_model: &mut EdModel, ed_model: &mut EdModel,
) -> EdResult<Vec<MarkNodeId>> { ) -> EdResult<Vec<MarkNodeId>> {
let blank_mark_node_id = ed_model.add_mark_node(new_blank_mn(ASTNodeId::AExprId(blank_elt_id), parent_id_opt)); let blank_mark_node_id = ed_model.add_mark_node(new_blank_mn(
ASTNodeId::AExprId(blank_elt_id),
parent_id_opt,
));
let mut children: Vec<MarkNodeId> = vec![]; let mut children: Vec<MarkNodeId> = vec![];

View file

@ -5,8 +5,8 @@ pub mod ed_update;
pub mod ed_view; pub mod ed_view;
mod int_update; mod int_update;
mod let_update; mod let_update;
pub mod tld_value_update;
mod list_update; mod list_update;
mod lookup_update; mod lookup_update;
mod record_update; mod record_update;
mod string_update; mod string_update;
pub mod tld_value_update;

View file

@ -37,21 +37,15 @@ pub fn start_new_record(ed_model: &mut EdModel) -> EdResult<InputOutcome> {
ast_pool.set(ast_node_id.to_expr_id()?, expr2_node); ast_pool.set(ast_node_id.to_expr_id()?, expr2_node);
let left_bracket_node_id = let left_bracket_node_id = ed_model.add_mark_node(new_left_accolade_mn(
ed_model.add_mark_node(
new_left_accolade_mn(
ast_node_id.to_expr_id()?, ast_node_id.to_expr_id()?,
Some(curr_mark_node_id) Some(curr_mark_node_id),
) ));
);
let right_bracket_node_id = let right_bracket_node_id = ed_model.add_mark_node(new_right_accolade_mn(
ed_model.add_mark_node(
new_right_accolade_mn(
ast_node_id.to_expr_id()?, ast_node_id.to_expr_id()?,
Some(curr_mark_node_id) Some(curr_mark_node_id),
) ));
);
let nested_node = MarkupNode::Nested { let nested_node = MarkupNode::Nested {
ast_node_id, ast_node_id,
@ -118,7 +112,11 @@ pub fn update_empty_record(
let new_ast_node = Expr2::Record { record_var, fields }; let new_ast_node = Expr2::Record { record_var, fields };
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, new_ast_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, new_ast_node);
// update Markup // update Markup
@ -244,13 +242,10 @@ pub fn update_record_colon(
.get_mut(parent_id) .get_mut(parent_id)
.add_child_at_index(new_child_index, record_colon_node_id)?; .add_child_at_index(new_child_index, record_colon_node_id)?;
let record_blank_node_id = ed_model let record_blank_node_id = ed_model.add_mark_node(new_blank_mn(
.add_mark_node(
new_blank_mn(
ASTNodeId::AExprId(new_field_val_id), ASTNodeId::AExprId(new_field_val_id),
Some(parent_id) Some(parent_id),
) ));
);
ed_model ed_model
.mark_node_pool .mark_node_pool

View file

@ -52,7 +52,11 @@ pub fn update_small_string(
let new_ast_node = Expr2::Str(PoolStr::new(&new_str, ed_model.module.env.pool)); let new_ast_node = Expr2::Str(PoolStr::new(&new_str, ed_model.module.env.pool));
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, new_ast_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, new_ast_node);
} }
content_str_mut.insert_str(node_caret_offset, new_input); content_str_mut.insert_str(node_caret_offset, new_input);
@ -105,7 +109,7 @@ pub fn update_string(new_char: char, ed_model: &mut EdModel) -> EdResult<InputOu
update_str_expr( update_str_expr(
ast_node_id.to_expr_id()?, ast_node_id.to_expr_id()?,
new_char, new_char,
node_caret_offset, node_caret_offset - 1, // -1 because offset was calculated with quotes
&mut ed_model.module.env.pool, &mut ed_model.module.env.pool,
)?; )?;
@ -131,7 +135,11 @@ pub fn start_new_string(ed_model: &mut EdModel) -> EdResult<InputOutcome> {
let new_expr2_node = Expr2::SmallStr(arraystring::ArrayString::new()); let new_expr2_node = Expr2::SmallStr(arraystring::ArrayString::new());
let curr_mark_node_has_nl = curr_mark_node.has_newline_at_end(); let curr_mark_node_has_nl = curr_mark_node.has_newline_at_end();
ed_model.module.env.pool.set(ast_node_id.to_expr_id()?, new_expr2_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_expr_id()?, new_expr2_node);
let new_string_node = MarkupNode::Text { let new_string_node = MarkupNode::Text {
content: nodes::STRING_QUOTES.to_owned(), content: nodes::STRING_QUOTES.to_owned(),

View file

@ -1,10 +1,31 @@
use roc_module::symbol::{Interns, Symbol}; use roc_module::symbol::{Interns, Symbol};
use crate::{editor::{ed_error::{EdResult, KeyNotFound}, markup::{attribute::Attributes, common_nodes::{new_blank_mn_w_nl, new_equals_mn}, nodes::MarkupNode}, slow_pool::{MarkNodeId, SlowPool}, syntax_highlight::HighlightStyle}, lang::{ast::{Def2, Expr2}, expr::Env, parse::ASTNodeId, pattern::{Pattern2, get_identifier_string}, pool::NodeId}, ui::text::text_pos::TextPos}; use crate::{
editor::{
use super::{app_update::InputOutcome, ed_model::EdModel, ed_update::{NodeContext, get_node_context}}; ed_error::{EdResult, KeyNotFound},
markup::{
attribute::Attributes,
common_nodes::{new_blank_mn_w_nl, new_equals_mn},
nodes::MarkupNode,
},
slow_pool::{MarkNodeId, SlowPool},
syntax_highlight::HighlightStyle,
},
lang::{
ast::{Def2, Expr2},
expr::Env,
parse::ASTNodeId,
pattern::{get_identifier_string, Pattern2},
pool::NodeId,
},
ui::text::text_pos::TextPos,
};
use super::{
app_update::InputOutcome,
ed_model::EdModel,
ed_update::{get_node_context, NodeContext},
};
// Top Level Defined Value. example: `main = "Hello, World!"` // Top Level Defined Value. example: `main = "Hello, World!"`
@ -42,17 +63,15 @@ pub fn tld_mark_node<'a>(
newline_at_end: true, newline_at_end: true,
}; };
Ok( Ok(full_let_node)
full_let_node
)
} }
pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<InputOutcome> { pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<InputOutcome> {
let NodeContext { let NodeContext {
old_caret_pos, old_caret_pos,
curr_mark_node_id, curr_mark_node_id,
curr_mark_node:_, curr_mark_node: _,
parent_id_opt:_, parent_id_opt: _,
ast_node_id, ast_node_id,
} = get_node_context(ed_model)?; } = get_node_context(ed_model)?;
@ -70,15 +89,20 @@ pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
.ident_ids .ident_ids
.add(val_name_string.clone().into()); .add(val_name_string.clone().into());
let module_ident_ids_opt = ed_model.loaded_module.interns.all_ident_ids.get_mut(&ed_model.module.env.home); let module_ident_ids_opt = ed_model
.loaded_module
.interns
.all_ident_ids
.get_mut(&ed_model.module.env.home);
if let Some(module_ident_ids_ref) = module_ident_ids_opt { if let Some(module_ident_ids_ref) = module_ident_ids_opt {
// this might create different IdentId for interns and env.ident_ids which may be a problem // this might create different IdentId for interns and env.ident_ids which may be a problem
module_ident_ids_ref.add(val_name_string.clone().into()); module_ident_ids_ref.add(val_name_string.into());
} else { } else {
KeyNotFound { KeyNotFound {
key_str: format!("{:?}", ed_model.module.env.home) key_str: format!("{:?}", ed_model.module.env.home),
}.fail()? }
.fail()?
} }
let val_symbol = Symbol::new(ed_model.module.env.home, ident_id); let val_symbol = Symbol::new(ed_model.module.env.home, ident_id);
@ -92,16 +116,19 @@ pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
ast_node_id, ast_node_id,
&mut ed_model.mark_node_pool, &mut ed_model.mark_node_pool,
&ed_model.module.env, &ed_model.module.env,
&ed_model.loaded_module.interns &ed_model.loaded_module.interns,
)?; )?;
let new_ast_node = let new_ast_node = Def2::ValueDef {
Def2::ValueDef {
identifier_id: patt2_id, identifier_id: patt2_id,
expr_id: val_expr_id, expr_id: val_expr_id,
}; };
ed_model.module.env.pool.set(ast_node_id.to_def_id()?, new_ast_node); ed_model
.module
.env
.pool
.set(ast_node_id.to_def_id()?, new_ast_node);
ed_model ed_model
.mark_node_pool .mark_node_pool
@ -116,13 +143,21 @@ pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
ed_model.insert_all_between_line( ed_model.insert_all_between_line(
old_caret_pos.line, old_caret_pos.line,
old_caret_pos.column, old_caret_pos.column,
&ed_model.mark_node_pool.get(curr_mark_node_id).get_children_ids(), &ed_model
.mark_node_pool
.get(curr_mark_node_id)
.get_children_ids(),
)?; )?;
Ok(InputOutcome::Accepted) Ok(InputOutcome::Accepted)
} }
pub fn update_tld_val_name(val_name_mn_id: MarkNodeId, old_caret_pos: TextPos, ed_model: &mut EdModel, new_char: &char) -> EdResult<InputOutcome> { pub fn update_tld_val_name(
val_name_mn_id: MarkNodeId,
old_caret_pos: TextPos,
ed_model: &mut EdModel,
new_char: &char,
) -> EdResult<InputOutcome> {
if new_char.is_ascii_alphanumeric() { if new_char.is_ascii_alphanumeric() {
// update markup // update markup
let val_name_mn_mut = ed_model.mark_node_pool.get_mut(val_name_mn_id); let val_name_mn_mut = ed_model.mark_node_pool.get_mut(val_name_mn_id);
@ -155,7 +190,6 @@ pub fn update_tld_val_name(val_name_mn_id: MarkNodeId, old_caret_pos: TextPos, e
ed_model.simple_move_caret_right(old_caret_pos, 1); ed_model.simple_move_caret_right(old_caret_pos, 1);
Ok(InputOutcome::Accepted) Ok(InputOutcome::Accepted)
} else { } else {
Ok(InputOutcome::Ignored) Ok(InputOutcome::Ignored)
} }

View file

@ -4,7 +4,7 @@ use crate::editor::mvc::ed_model::EdModel;
use crate::graphics::colors; use crate::graphics::colors;
use crate::graphics::colors::from_hsb; use crate::graphics::colors::from_hsb;
use crate::graphics::primitives::text as gr_text; use crate::graphics::primitives::text as gr_text;
use crate::lang::ast::{def2_to_string}; use crate::lang::ast::def2_to_string;
use cgmath::Vector2; use cgmath::Vector2;
use winit::dpi::PhysicalSize; use winit::dpi::PhysicalSize;

View file

@ -17,7 +17,4 @@ app "test-app"
main = "Hello Main" main = "Hello Main"
mars = "Yo Mars!"
"#; "#;

View file

@ -231,7 +231,7 @@ pub enum Def2 {
identifier_id: NodeId<Pattern2>, identifier_id: NodeId<Pattern2>,
expr_id: NodeId<Expr2>, expr_id: NodeId<Expr2>,
}, },
Blank Blank,
} }
#[derive(Debug)] #[derive(Debug)]
@ -297,12 +297,27 @@ impl ValueDef {
pub fn value_def_to_string(val_def: &ValueDef, pool: &Pool) -> String { pub fn value_def_to_string(val_def: &ValueDef, pool: &Pool) -> String {
match val_def { match val_def {
ValueDef::WithAnnotation { pattern_id, expr_id, type_id, rigids, expr_var } => { ValueDef::WithAnnotation {
pattern_id,
expr_id,
type_id,
rigids,
expr_var,
} => {
format!("WithAnnotation {{ pattern_id: {:?}, expr_id: {:?}, type_id: {:?}, rigids: {:?}, expr_var: {:?}}}", pool.get(*pattern_id), expr2_to_string(*expr_id, pool), pool.get(*type_id), rigids, expr_var) format!("WithAnnotation {{ pattern_id: {:?}, expr_id: {:?}, type_id: {:?}, rigids: {:?}, expr_var: {:?}}}", pool.get(*pattern_id), expr2_to_string(*expr_id, pool), pool.get(*type_id), rigids, expr_var)
}, }
ValueDef::NoAnnotation { pattern_id, expr_id, expr_var } => { ValueDef::NoAnnotation {
format!("NoAnnotation {{ pattern_id: {:?}, expr_id: {:?}, expr_var: {:?}}}", pool.get(*pattern_id), expr2_to_string(*expr_id, pool), expr_var) pattern_id,
}, expr_id,
expr_var,
} => {
format!(
"NoAnnotation {{ pattern_id: {:?}, expr_id: {:?}, expr_var: {:?}}}",
pool.get(*pattern_id),
expr2_to_string(*expr_id, pool),
expr_var
)
}
} }
} }
@ -482,16 +497,11 @@ impl RecordField {
pub fn ast_node_to_string(node_id: ASTNodeId, pool: &Pool) -> String { pub fn ast_node_to_string(node_id: ASTNodeId, pool: &Pool) -> String {
match node_id { match node_id {
ASTNodeId::ADefId(def_id) => { ASTNodeId::ADefId(def_id) => def2_to_string(def_id, pool),
def2_to_string(def_id, pool) ASTNodeId::AExprId(expr_id) => expr2_to_string(expr_id, pool),
},
ASTNodeId::AExprId(expr_id) => {
expr2_to_string(expr_id, pool)
}
} }
} }
pub fn expr2_to_string(node_id: ExprId, pool: &Pool) -> String { pub fn expr2_to_string(node_id: ExprId, pool: &Pool) -> String {
let mut full_string = String::new(); let mut full_string = String::new();
let expr2 = pool.get(node_id); let expr2 = pool.get(node_id);
@ -610,7 +620,8 @@ fn expr2_to_string_helper(
} => { } => {
out_string.push_str(&format!( out_string.push_str(&format!(
"LetValue(def_id: >>{:?}), body_id: >>{:?})", "LetValue(def_id: >>{:?}), body_id: >>{:?})",
value_def_to_string(pool.get(*def_id), pool) , pool.get(*body_id) value_def_to_string(pool.get(*def_id), pool),
pool.get(*body_id)
)); ));
} }
other => todo!("Implement for {:?}", other), other => todo!("Implement for {:?}", other),
@ -624,14 +635,18 @@ pub fn def2_to_string(node_id: DefId, pool: &Pool) -> String {
let def2 = pool.get(node_id); let def2 = pool.get(node_id);
match def2 { match def2 {
Def2::ValueDef { identifier_id, expr_id } => { Def2::ValueDef {
identifier_id,
expr_id,
} => {
full_string.push_str(&format!( full_string.push_str(&format!(
"Def2::ValueDef(identifier_id: >>{:?}), expr_id: >>{:?})", "Def2::ValueDef(identifier_id: >>{:?}), expr_id: >>{:?})",
pool.get(*identifier_id), expr2_to_string(*expr_id, pool) pool.get(*identifier_id),
expr2_to_string(*expr_id, pool)
)); ));
}, }
Def2::Blank => { Def2::Blank => {
full_string.push_str(&format!("Def2::Blank")); full_string.push_str("Def2::Blank");
} }
} }
@ -699,6 +714,7 @@ pub fn update_str_expr(
} }
Either::MyPoolStr(old_pool_str) => { Either::MyPoolStr(old_pool_str) => {
let mut new_string = old_pool_str.as_str(pool).to_owned(); let mut new_string = old_pool_str.as_str(pool).to_owned();
new_string.insert(insert_index, new_char); new_string.insert(insert_index, new_char);
let new_pool_str = PoolStr::new(&new_string, pool); let new_pool_str = PoolStr::new(&new_string, pool);

View file

@ -5,7 +5,10 @@ use bumpalo::{collections::Vec as BumpVec, Bump};
use std::collections::HashMap; use std::collections::HashMap;
use std::iter::FromIterator; use std::iter::FromIterator;
use crate::lang::ast::{ClosureExtra, Def2, Expr2, ExprId, FloatVal, IntStyle, IntVal, RecordField, ValueDef, WhenBranch, expr2_to_string, value_def_to_string}; use crate::lang::ast::{
expr2_to_string, value_def_to_string, ClosureExtra, Def2, Expr2, ExprId, FloatVal, IntStyle,
IntVal, RecordField, ValueDef, WhenBranch,
};
use crate::lang::def::{ use crate::lang::def::{
canonicalize_defs, sort_can_defs, CanDefs, Declaration, Def, PendingDef, References, canonicalize_defs, sort_can_defs, CanDefs, Declaration, Def, PendingDef, References,
}; };

View file

@ -1,11 +1,16 @@
use std::fmt::Debug; use std::fmt::Debug;
use crate::{editor::ed_error::EdResult, editor::ed_error::ASTNodeIdWithoutExprId,lang::scope::Scope}; use crate::{
editor::ed_error::ASTNodeIdWithoutExprId, editor::ed_error::EdResult, lang::scope::Scope,
};
use bumpalo::Bump; use bumpalo::Bump;
use roc_parse::parser::SyntaxError; use roc_parse::parser::SyntaxError;
use roc_region::all::Region; use roc_region::all::Region;
use super::{ast::{DefId, Expr2, ExprId}, expr::{str_to_def2, Env}}; use super::{
ast::{DefId, Expr2, ExprId},
expr::{str_to_def2, Env},
};
#[derive(Debug)] #[derive(Debug)]
pub struct AST { pub struct AST {
@ -20,29 +25,17 @@ pub enum ASTNodeId {
} }
impl ASTNodeId { impl ASTNodeId {
pub fn to_expr_id(&self) -> EdResult<ExprId>{ pub fn to_expr_id(&self) -> EdResult<ExprId> {
match self { match self {
ASTNodeId::AExprId(expr_id) => { ASTNodeId::AExprId(expr_id) => Ok(*expr_id),
Ok(*expr_id) _ => ASTNodeIdWithoutExprId { ast_node_id: *self }.fail()?,
},
_ => {
ASTNodeIdWithoutExprId {
ast_node_id: *self
}.fail()?
}
} }
} }
pub fn to_def_id(&self) -> EdResult<DefId>{ pub fn to_def_id(&self) -> EdResult<DefId> {
match self { match self {
ASTNodeId::ADefId(def_id) => { ASTNodeId::ADefId(def_id) => Ok(*def_id),
Ok(*def_id) _ => ASTNodeIdWithoutExprId { ast_node_id: *self }.fail()?,
},
_ => {
ASTNodeIdWithoutExprId {
ast_node_id: *self
}.fail()?
}
} }
} }
} }