debugging closure -> MarkupNode

This commit is contained in:
Anton-4 2021-10-08 20:19:52 +02:00
parent 11417c0624
commit 03d9d41a7a
8 changed files with 103 additions and 37 deletions

1
Cargo.lock generated
View file

@ -3369,6 +3369,7 @@ name = "roc_code_markup"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"itertools 0.10.1",
"palette", "palette",
"roc_ast", "roc_ast",
"roc_module", "roc_module",

View file

@ -20,11 +20,11 @@ pub fn defs_to_defs2<'a>(
) -> Vec<Def2> { ) -> Vec<Def2> {
parsed_defs parsed_defs
.iter() .iter()
.map(|loc| to_def2_from_def(arena, env, scope, &loc.value, region)) .map(|loc| def_to_def2(arena, env, scope, &loc.value, region))
.collect() .collect()
} }
pub fn to_def2_from_def<'a>( pub fn def_to_def2<'a>(
arena: &'a Bump, arena: &'a Bump,
env: &mut Env<'a>, env: &mut Env<'a>,
scope: &mut Scope, scope: &mut Scope,
@ -34,8 +34,8 @@ pub fn to_def2_from_def<'a>(
use roc_parse::ast::Def::*; use roc_parse::ast::Def::*;
match parsed_def { match parsed_def {
SpaceBefore(inner_def, _) => to_def2_from_def(arena, env, scope, inner_def, region), SpaceBefore(inner_def, _) => def_to_def2(arena, env, scope, inner_def, region),
SpaceAfter(inner_def, _) => to_def2_from_def(arena, env, scope, inner_def, region), SpaceAfter(inner_def, _) => def_to_def2(arena, env, scope, inner_def, region),
Body(&loc_pattern, &loc_expr) => { Body(&loc_pattern, &loc_expr) => {
// TODO loc_pattern use identifier // TODO loc_pattern use identifier
let expr2 = loc_expr_to_expr2(arena, loc_expr, env, scope, region).0; let expr2 = loc_expr_to_expr2(arena, loc_expr, env, scope, region).0;
@ -43,6 +43,8 @@ pub fn to_def2_from_def<'a>(
use roc_parse::ast::Pattern::*; use roc_parse::ast::Pattern::*;
dbg!(&loc_pattern.value);
match loc_pattern.value { match loc_pattern.value {
Identifier(_) => { Identifier(_) => {
let (_, pattern2) = to_pattern2( let (_, pattern2) = to_pattern2(

View file

@ -14,5 +14,6 @@ serde = { version = "1.0.123", features = ["derive"] }
palette = "0.5" palette = "0.5"
snafu = { version = "0.6", features = ["backtraces"] } snafu = { version = "0.6", features = ["backtraces"] }
bumpalo = { version = "3.2", features = ["collections"] } bumpalo = { version = "3.2", features = ["collections"] }
itertools = "0.10.1"
[dev-dependencies] [dev-dependencies]

View file

@ -51,8 +51,12 @@ pub fn new_blank_mn_w_nls(
} }
pub fn new_colon_mn(expr_id: ExprId, parent_id_opt: Option<MarkNodeId>) -> MarkupNode { pub fn new_colon_mn(expr_id: ExprId, parent_id_opt: Option<MarkNodeId>) -> MarkupNode {
new_operator_mn(nodes::COLON.to_owned(), expr_id, parent_id_opt)
}
pub fn new_operator_mn(content: String, expr_id: ExprId, parent_id_opt: Option<MarkNodeId>) -> MarkupNode {
MarkupNode::Text { MarkupNode::Text {
content: nodes::COLON.to_owned(), content: content,
ast_node_id: ASTNodeId::AExprId(expr_id), ast_node_id: ASTNodeId::AExprId(expr_id),
syn_high_style: HighlightStyle::Operator, syn_high_style: HighlightStyle::Operator,
attributes: Attributes::default(), attributes: Attributes::default(),
@ -104,3 +108,25 @@ pub fn new_right_square_mn(expr_id: ExprId, parent_id_opt: Option<MarkNodeId>) -
newlines_at_end: 0, newlines_at_end: 0,
} }
} }
pub fn new_func_name_mn(content: String, expr_id: ExprId) -> MarkupNode {
MarkupNode::Text {
content,
ast_node_id: ASTNodeId::AExprId(expr_id),
syn_high_style: HighlightStyle::FunctionName,
attributes: Attributes::default(),
parent_id_opt: None,
newlines_at_end: 0,
}
}
pub fn new_arg_name_mn(content: String, expr_id: ExprId) -> MarkupNode {
MarkupNode::Text {
content,
ast_node_id: ASTNodeId::AExprId(expr_id),
syn_high_style: HighlightStyle::FunctionArgName,
attributes: Attributes::default(),
parent_id_opt: None,
newlines_at_end: 0,
}
}

View file

@ -1,10 +1,8 @@
use crate::{markup::{attribute::Attributes, common_nodes::{ use crate::{markup::{attribute::Attributes, common_nodes::{new_arg_name_mn, new_blank_mn, new_colon_mn, new_comma_mn, new_equals_mn, new_func_name_mn, new_left_accolade_mn, new_left_square_mn, new_operator_mn, new_right_accolade_mn, new_right_square_mn}, nodes::{MarkupNode, get_string, new_markup_node}}, slow_pool::{MarkNodeId, SlowPool}, syntax_highlight::HighlightStyle};
new_blank_mn, new_colon_mn, new_comma_mn, new_equals_mn, new_left_accolade_mn,
new_left_square_mn, new_right_accolade_mn, new_right_square_mn,
}, nodes::{MarkupNode, get_string, new_markup_node}}, slow_pool::{MarkNodeId, SlowPool}, syntax_highlight::HighlightStyle};
use bumpalo::Bump; use bumpalo::Bump;
use itertools::Itertools;
use roc_ast::{ast_error::ASTResult, lang::{core::{ast::ASTNodeId, expr::{ use roc_ast::{ast_error::ASTResult, lang::{core::{ast::ASTNodeId, expr::{
expr2::{Expr2, ExprId}, expr2::{Expr2, ExprId},
record_field::RecordField, record_field::RecordField,
@ -20,6 +18,7 @@ pub fn expr2_to_markup<'a, 'b>(
mark_node_pool: &mut SlowPool, mark_node_pool: &mut SlowPool,
interns: &Interns, interns: &Interns,
) -> ASTResult<MarkNodeId> { ) -> ASTResult<MarkNodeId> {
dbg!(expr2);
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 {
@ -214,7 +213,7 @@ pub fn expr2_to_markup<'a, 'b>(
} }
} }
Expr2::Closure{ Expr2::Closure{
function_type, function_type:_,
name, name,
recursive:_, recursive:_,
args, args,
@ -223,38 +222,63 @@ pub fn expr2_to_markup<'a, 'b>(
} => { } => {
let func_name = name.ident_str(interns).as_str(); let func_name = name.ident_str(interns).as_str();
let arg_names: Vec<&str> = let func_name_mn =
args.iter(env.pool).map( new_func_name_mn(func_name.to_string(), expr2_node_id);
| (_, arg_node_id) | {
let arg_pattern2 = env.pool.get(*arg_node_id);
match arg_pattern2 { let func_name_mn_id = mark_node_pool.add(func_name_mn);
Pattern2::Identifier(id_symbol) => {
id_symbol.ident_str(interns).as_str() let backslash_mn = new_operator_mn("\\".to_string(), expr2_node_id, None);
}, let backslash_mn_id = mark_node_pool.add(backslash_mn);
other => {
todo!("TODO: support the following pattern2 as function arg: {:?}", other); let arg_names: Vec<&str> =
} args.iter(env.pool).map(
| (_, arg_node_id) | {
let arg_pattern2 = env.pool.get(*arg_node_id);
match arg_pattern2 {
Pattern2::Identifier(id_symbol) => {
id_symbol.ident_str(interns).as_str()
},
other => {
todo!("TODO: support the following pattern2 as function arg: {:?}", other);
} }
} }
)
.collect();
for (_, arg_node_id) in args.iter(env.pool) {
let arg_pattern2 = env.pool.get(*arg_node_id);
match arg_pattern2 {
Pattern2::Identifier(id_symbol) => {
dbg!(id_symbol.ident_str(interns).as_str());
},
other => {
todo!("TODO: support the following pattern2 as function arg: {:?}", other);
}
} }
} )
.collect();
let arg_mark_nodes = arg_names.iter().map(
|arg_name|
new_arg_name_mn(arg_name.to_string(), expr2_node_id)
);
let commas =
(0..(arg_mark_nodes.len() - 1)).map(
|_|
new_comma_mn(expr2_node_id, None)
);
let args_with_commas: Vec<MarkupNode> = arg_mark_nodes.interleave(commas).collect_vec();
let mut args_with_commas_ids: Vec<MarkNodeId> =
args_with_commas.into_iter().map(
|mark_node|
mark_node_pool.add(mark_node)
).collect();
let mut children_ids = vec![backslash_mn_id];
children_ids.append(&mut args_with_commas_ids);
let args_mn = MarkupNode::Nested {
ast_node_id: ASTNodeId::AExprId(expr2_node_id),
children_ids,
parent_id_opt: None,
newlines_at_end: 0,
};
let args_mn_id = mark_node_pool.add(args_mn);
let body_expr = env.pool.get(*body_id); let body_expr = env.pool.get(*body_id);
let body_mark_node = expr2_to_markup( let body_mn_id = expr2_to_markup(
arena, arena,
env, env,
body_expr, body_expr,
@ -263,7 +287,14 @@ pub fn expr2_to_markup<'a, 'b>(
interns, interns,
)?; )?;
panic!("TODO") let function_node = MarkupNode::Nested {
ast_node_id,
children_ids: vec![func_name_mn_id, args_mn_id, body_mn_id],
parent_id_opt: None,
newlines_at_end: 0,
};
mark_node_pool.add(function_node)
} }
Expr2::RuntimeError() => new_markup_node( Expr2::RuntimeError() => new_markup_node(
"RunTimeError".to_string(), "RunTimeError".to_string(),

View file

@ -25,6 +25,7 @@ pub fn tld_mark_node<'a>(
interns: &Interns, interns: &Interns,
) -> ASTResult<MarkupNode> { ) -> ASTResult<MarkupNode> {
let pattern2 = env.pool.get(identifier_id); let pattern2 = env.pool.get(identifier_id);
dbg!(pattern2);
let val_name = get_identifier_string(pattern2, interns)?; let val_name = get_identifier_string(pattern2, interns)?;
let val_name_mn = MarkupNode::Text { let val_name_mn = MarkupNode::Text {

View file

@ -8,6 +8,7 @@ pub enum HighlightStyle {
Operator, // =+-<>... Operator, // =+-<>...
String, String,
FunctionName, FunctionName,
FunctionArgName,
Type, Type,
Bracket, Bracket,
Number, Number,
@ -27,6 +28,7 @@ pub fn default_highlight_map() -> HashMap<HighlightStyle, RgbaTup> {
(Operator, colors::WHITE), (Operator, colors::WHITE),
(String, from_hsb(346, 65, 97)), (String, from_hsb(346, 65, 97)),
(FunctionName, colors::WHITE), (FunctionName, colors::WHITE),
(FunctionArgName, colors::WHITE),
(Type, colors::WHITE), (Type, colors::WHITE),
(Bracket, from_hsb(347, 80, 100)), (Bracket, from_hsb(347, 80, 100)),
(Number, from_hsb(185, 50, 75)), (Number, from_hsb(185, 50, 75)),

View file

@ -81,6 +81,8 @@ impl Symbol {
) )
}); });
dbg!(ident_ids);
ident_ids ident_ids
.get_name(self.ident_id()) .get_name(self.ident_id())
.unwrap_or_else(|| { .unwrap_or_else(|| {