mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
bug fixes, updated tests
This commit is contained in:
parent
3c858cff96
commit
6d6ae5d5c0
19 changed files with 1074 additions and 974 deletions
|
@ -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
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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};
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
@ -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)?;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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![];
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -17,7 +17,4 @@ app "test-app"
|
|||
|
||||
main = "Hello Main"
|
||||
|
||||
mars = "Yo Mars!"
|
||||
|
||||
|
||||
"#;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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()?,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue