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 => {
Err(format!("Tried to update key in IdentIds ({:?}) but I could not find the key ({}).", self.by_ident, old_ident_name))
}
None => Err(format!(
"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)]
#[snafu(visibility(pub))]
pub enum EdError {
#[snafu(display(
"ASTNodeIdWithoutDefId: The expr_id_opt in ASTNode({:?}) was `None` but I was expexting `Some(DefId)` .",
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 curr_node_id = slice_get(first_node_index, line)?;
let curr_ast_node_id = ed_model
.mark_node_pool
.get(*curr_node_id)
.get_ast_node_id();
let curr_ast_node_id = ed_model.mark_node_pool.get(*curr_node_id).get_ast_node_id();
let mut expr_start_index = first_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};

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_right_accolade_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::SlowPool;
use crate::editor::syntax_highlight::HighlightStyle;
@ -20,7 +21,6 @@ use crate::lang::ast::DefId;
use crate::lang::ast::ExprId;
use crate::lang::ast::RecordField;
use crate::lang::ast::ValueDef;
use crate::editor::mvc::tld_value_update::tld_mark_node;
use crate::lang::parse::ASTNodeId;
use crate::lang::parse::{AppHeader, AST};
use crate::lang::pattern::get_identifier_string;
@ -285,12 +285,13 @@ pub fn def2_to_markup<'a, 'b>(
mark_node_pool: &mut SlowPool,
interns: &Interns,
) -> EdResult<MarkNodeId> {
let ast_node_id = ASTNodeId::ADefId(def2_node_id);
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(
arena,
env,
@ -303,18 +304,18 @@ pub fn def2_to_markup<'a, 'b>(
let expr_mn = mark_node_pool.get_mut(expr_mn_id);
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
)
},
Def2::Blank => {
mark_node_pool.add(
new_blank_mn_w_nl(ast_node_id, None)
)
},
mark_node_pool.add(tld_mn)
}
Def2::Blank => mark_node_pool.add(new_blank_mn_w_nl(ast_node_id, None)),
};
Ok(mark_node_id)
@ -329,7 +330,6 @@ pub fn expr2_to_markup<'a, 'b>(
mark_node_pool: &mut SlowPool,
interns: &Interns,
) -> EdResult<MarkNodeId> {
let ast_node_id = ASTNodeId::AExprId(expr2_node_id);
let mark_node_id = match expr2 {
@ -339,12 +339,7 @@ pub fn expr2_to_markup<'a, 'b>(
| Expr2::Float { text, .. } => {
let num_str = get_string(env, text);
new_markup_node(
num_str,
ast_node_id,
HighlightStyle::Number,
mark_node_pool,
)
new_markup_node(num_str, ast_node_id, HighlightStyle::Number, mark_node_pool)
}
Expr2::Str(text) => new_markup_node(
"\"".to_owned() + text.as_str(env.pool) + "\"",
@ -365,12 +360,7 @@ pub fn expr2_to_markup<'a, 'b>(
Expr2::Var(symbol) => {
//TODO make bump_format with arena
let text = format!("{:?}", symbol);
new_markup_node(
text,
ast_node_id,
HighlightStyle::Variable,
mark_node_pool,
)
new_markup_node(text, ast_node_id, HighlightStyle::Variable, mark_node_pool)
}
Expr2::List { elems, .. } => {
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)));
let list_node = MarkupNode::Nested {
ast_node_id: ast_node_id,
ast_node_id,
children_ids,
parent_id_opt: None,
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)));
let record_node = MarkupNode::Nested {
ast_node_id: ast_node_id,
ast_node_id,
children_ids,
parent_id_opt: None,
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::LetValue {
def_id,
body_id:_,
body_var:_,
body_id: _,
body_var: _,
} => {
let pattern_id = env.pool.get(*def_id).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(
// 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,
HighlightStyle::Provides,
mark_node_pool,

View file

@ -8,7 +8,7 @@ use crate::editor::{
};
use crate::graphics::primitives::rect::Rect;
use crate::lang::expr::Env;
use crate::lang::parse::{AST, ASTNodeId};
use crate::lang::parse::{ASTNodeId, AST};
use crate::lang::pool::PoolStr;
use crate::ui::text::caret_w_select::{CaretPos, CaretWSelect};
use crate::ui::text::lines::SelectableLines;
@ -256,18 +256,14 @@ pub mod test_ed_model {
pub fn ed_model_from_dsl<'a>(
clean_code_str: &'a mut String,
code_lines: &[&str],
code_lines: Vec<String>,
ed_model_refs: &'a mut EdModelRefs,
module_ids: &'a ModuleIds,
code_arena: &'a Bump,
) -> 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()];
*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_file_path_buf =
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
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 {
line: caret_w_select.caret_pos.line + nr_hello_world_lines,
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),
};
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 {
content: digit_string,
@ -112,7 +116,11 @@ pub fn update_int(
// update ast
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 {
SmallInt { number, text, .. } => {
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(),
};
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 {
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 body_mn_id =
ed_model.add_mark_node(new_blank_mn_w_nl(ASTNodeId::AExprId(val_expr_id), Some(curr_mark_node_id)));
let body_mn_id = ed_model.add_mark_node(new_blank_mn_w_nl(
ASTNodeId::AExprId(val_expr_id),
Some(curr_mark_node_id),
));
let val_mark_node = MarkupNode::Nested {
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::NodeContext;
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::pool::PoolVec;
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),
};
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 =
ed_model.add_mark_node(new_left_square_mn(ast_node_id.to_expr_id()?, Some(curr_mark_node_id)));
let left_bracket_node_id = ed_model.add_mark_node(new_left_square_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let right_bracket_node_id =
ed_model.add_mark_node(new_right_square_mn(ast_node_id.to_expr_id()?, Some(curr_mark_node_id)));
let right_bracket_node_id = ed_model.add_mark_node(new_right_square_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let nested_node = MarkupNode::Nested {
ast_node_id,
@ -181,7 +189,10 @@ pub fn update_mark_children(
parent_id_opt: Option<MarkNodeId>,
ed_model: &mut EdModel,
) -> 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![];

View file

@ -5,8 +5,8 @@ pub mod ed_update;
pub mod ed_view;
mod int_update;
mod let_update;
pub mod tld_value_update;
mod list_update;
mod lookup_update;
mod record_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);
let left_bracket_node_id =
ed_model.add_mark_node(
new_left_accolade_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id)
)
);
let left_bracket_node_id = ed_model.add_mark_node(new_left_accolade_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let right_bracket_node_id =
ed_model.add_mark_node(
new_right_accolade_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id)
)
);
let right_bracket_node_id = ed_model.add_mark_node(new_right_accolade_mn(
ast_node_id.to_expr_id()?,
Some(curr_mark_node_id),
));
let nested_node = MarkupNode::Nested {
ast_node_id,
@ -118,7 +112,11 @@ pub fn update_empty_record(
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
@ -244,13 +242,10 @@ 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(
ASTNodeId::AExprId(new_field_val_id),
Some(parent_id)
)
);
let record_blank_node_id = ed_model.add_mark_node(new_blank_mn(
ASTNodeId::AExprId(new_field_val_id),
Some(parent_id),
));
ed_model
.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));
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);
@ -105,7 +109,7 @@ pub fn update_string(new_char: char, ed_model: &mut EdModel) -> EdResult<InputOu
update_str_expr(
ast_node_id.to_expr_id()?,
new_char,
node_caret_offset,
node_caret_offset - 1, // -1 because offset was calculated with quotes
&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 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 {
content: nodes::STRING_QUOTES.to_owned(),

View file

@ -1,10 +1,31 @@
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 super::{app_update::InputOutcome, ed_model::EdModel, ed_update::{NodeContext, get_node_context}};
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::{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!"`
@ -16,43 +37,41 @@ pub fn tld_mark_node<'a>(
env: &Env<'a>,
interns: &Interns,
) -> EdResult<MarkupNode> {
let pattern2 = env.pool.get(identifier_id);
let val_name = get_identifier_string(pattern2, interns)?;
let pattern2 = env.pool.get(identifier_id);
let val_name = get_identifier_string(pattern2, interns)?;
let val_name_mn = MarkupNode::Text {
content: val_name,
ast_node_id,
syn_high_style: HighlightStyle::Variable,
attributes: Attributes::new(),
parent_id_opt: None,
newline_at_end: false,
};
let val_name_mn = MarkupNode::Text {
content: val_name,
ast_node_id,
syn_high_style: HighlightStyle::Variable,
attributes: Attributes::new(),
parent_id_opt: None,
newline_at_end: false,
};
let val_name_mn_id = mark_node_pool.add(val_name_mn);
let val_name_mn_id = mark_node_pool.add(val_name_mn);
let equals_mn_id = mark_node_pool.add(new_equals_mn(ast_node_id, None));
let equals_mn_id = mark_node_pool.add(new_equals_mn(ast_node_id, None));
let expr_mn = mark_node_pool.get_mut(expr_mark_node_id);
expr_mn.add_newline_at_end();
let expr_mn = mark_node_pool.get_mut(expr_mark_node_id);
expr_mn.add_newline_at_end();
let full_let_node = MarkupNode::Nested {
ast_node_id,
children_ids: vec![val_name_mn_id, equals_mn_id, expr_mark_node_id],
parent_id_opt: None,
newline_at_end: true,
};
let full_let_node = MarkupNode::Nested {
ast_node_id,
children_ids: vec![val_name_mn_id, equals_mn_id, expr_mark_node_id],
parent_id_opt: None,
newline_at_end: true,
};
Ok(
full_let_node
)
Ok(full_let_node)
}
pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<InputOutcome> {
let NodeContext {
old_caret_pos,
curr_mark_node_id,
curr_mark_node:_,
parent_id_opt:_,
curr_mark_node: _,
parent_id_opt: _,
ast_node_id,
} = 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
.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 {
// 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 {
KeyNotFound {
key_str: format!("{:?}", ed_model.module.env.home)
}.fail()?
key_str: format!("{:?}", ed_model.module.env.home),
}
.fail()?
}
let val_symbol = Symbol::new(ed_model.module.env.home, ident_id);
@ -87,42 +111,53 @@ pub fn start_new_tld_value(ed_model: &mut EdModel, new_char: &char) -> EdResult<
let patt2_id = ed_model.module.env.pool.add(patt2);
let tld_mark_node = tld_mark_node(
patt2_id,
val_expr_mn_id,
ast_node_id,
&mut ed_model.mark_node_pool,
&ed_model.module.env,
&ed_model.loaded_module.interns
)?;
patt2_id,
val_expr_mn_id,
ast_node_id,
&mut ed_model.mark_node_pool,
&ed_model.module.env,
&ed_model.loaded_module.interns,
)?;
let new_ast_node =
Def2::ValueDef {
identifier_id: patt2_id,
expr_id: val_expr_id,
};
ed_model.module.env.pool.set(ast_node_id.to_def_id()?, new_ast_node);
let new_ast_node = Def2::ValueDef {
identifier_id: patt2_id,
expr_id: val_expr_id,
};
ed_model
.mark_node_pool
.replace_node(curr_mark_node_id, tld_mark_node);
.module
.env
.pool
.set(ast_node_id.to_def_id()?, new_ast_node);
ed_model
.mark_node_pool
.replace_node(curr_mark_node_id, tld_mark_node);
// remove data corresponding to old Blank node
ed_model.del_at_line(old_caret_pos.line, old_caret_pos.column)?;
let char_len = 1;
ed_model.simple_move_carets_right(char_len);
ed_model.simple_move_carets_right(char_len);
ed_model.insert_all_between_line(
old_caret_pos.line,
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)
}
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() {
// update markup
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);
Ok(InputOutcome::Accepted)
} else {
Ok(InputOutcome::Ignored)
}

View file

@ -4,7 +4,7 @@ use crate::editor::mvc::ed_model::EdModel;
use crate::graphics::colors;
use crate::graphics::colors::from_hsb;
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 winit::dpi::PhysicalSize;

View file

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

View file

@ -231,7 +231,7 @@ pub enum Def2 {
identifier_id: NodeId<Pattern2>,
expr_id: NodeId<Expr2>,
},
Blank
Blank,
}
#[derive(Debug)]
@ -297,12 +297,27 @@ impl ValueDef {
pub fn value_def_to_string(val_def: &ValueDef, pool: &Pool) -> String {
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)
},
ValueDef::NoAnnotation { 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)
},
}
ValueDef::NoAnnotation {
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 {
match node_id {
ASTNodeId::ADefId(def_id) => {
def2_to_string(def_id, pool)
},
ASTNodeId::AExprId(expr_id) => {
expr2_to_string(expr_id, pool)
}
ASTNodeId::ADefId(def_id) => def2_to_string(def_id, pool),
ASTNodeId::AExprId(expr_id) => expr2_to_string(expr_id, pool),
}
}
pub fn expr2_to_string(node_id: ExprId, pool: &Pool) -> String {
let mut full_string = String::new();
let expr2 = pool.get(node_id);
@ -610,7 +620,8 @@ fn expr2_to_string_helper(
} => {
out_string.push_str(&format!(
"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),
@ -624,14 +635,18 @@ pub fn def2_to_string(node_id: DefId, pool: &Pool) -> String {
let def2 = pool.get(node_id);
match def2 {
Def2::ValueDef { identifier_id, expr_id } => {
Def2::ValueDef {
identifier_id,
expr_id,
} => {
full_string.push_str(&format!(
"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 => {
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) => {
let mut new_string = old_pool_str.as_str(pool).to_owned();
new_string.insert(insert_index, new_char);
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::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::{
canonicalize_defs, sort_can_defs, CanDefs, Declaration, Def, PendingDef, References,
};

View file

@ -1,11 +1,16 @@
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 roc_parse::parser::SyntaxError;
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)]
pub struct AST {
@ -20,29 +25,17 @@ pub enum ASTNodeId {
}
impl ASTNodeId {
pub fn to_expr_id(&self) -> EdResult<ExprId>{
pub fn to_expr_id(&self) -> EdResult<ExprId> {
match self {
ASTNodeId::AExprId(expr_id) => {
Ok(*expr_id)
},
_ => {
ASTNodeIdWithoutExprId {
ast_node_id: *self
}.fail()?
}
ASTNodeId::AExprId(expr_id) => Ok(*expr_id),
_ => ASTNodeIdWithoutExprId { ast_node_id: *self }.fail()?,
}
}
pub fn to_def_id(&self) -> EdResult<DefId>{
pub fn to_def_id(&self) -> EdResult<DefId> {
match self {
ASTNodeId::ADefId(def_id) => {
Ok(*def_id)
},
_ => {
ASTNodeIdWithoutExprId {
ast_node_id: *self
}.fail()?
}
ASTNodeId::ADefId(def_id) => Ok(*def_id),
_ => ASTNodeIdWithoutExprId { ast_node_id: *self }.fail()?,
}
}
}