started on docs to markup to html

This commit is contained in:
Anton-4 2021-09-29 20:05:03 +02:00
parent 168c511988
commit 28cf11a1d9
11 changed files with 75 additions and 70 deletions

2
Cargo.lock generated
View file

@ -3582,8 +3582,10 @@ dependencies = [
"maplit", "maplit",
"pretty_assertions 0.5.1", "pretty_assertions 0.5.1",
"pulldown-cmark", "pulldown-cmark",
"roc_ast",
"roc_builtins", "roc_builtins",
"roc_can", "roc_can",
"roc_code_markup",
"roc_collections", "roc_collections",
"roc_fmt", "roc_fmt",
"roc_load", "roc_load",

View file

@ -9,7 +9,7 @@ use crate::{
def::def::References, def::def::References,
expr::{ expr::{
expr2::{Expr2, ExprId, WhenBranch}, expr2::{Expr2, ExprId, WhenBranch},
expr_to_expr2::to_expr2, expr_to_expr2::expr_to_expr2,
output::Output, output::Output,
record_field::RecordField, record_field::RecordField,
}, },
@ -147,7 +147,7 @@ fn canonicalize_field<'a>(
// Both a label and a value, e.g. `{ name: "blah" }` // Both a label and a value, e.g. `{ name: "blah" }`
RequiredValue(label, _, loc_expr) => { RequiredValue(label, _, loc_expr) => {
let field_var = env.var_store.fresh(); let field_var = env.var_store.fresh();
let (loc_can_expr, output) = to_expr2(env, scope, &loc_expr.value, loc_expr.region); let (loc_can_expr, output) = expr_to_expr2(env, scope, &loc_expr.value, loc_expr.region);
Ok(CanonicalField::LabelAndValue { Ok(CanonicalField::LabelAndValue {
label: label.value, label: label.value,
@ -211,7 +211,7 @@ pub(crate) fn canonicalize_when_branch<'a>(
} }
let (value, mut branch_output) = let (value, mut branch_output) =
to_expr2(env, &mut scope, &branch.value.value, branch.value.region); expr_to_expr2(env, &mut scope, &branch.value.value, branch.value.region);
let value_id = env.pool.add(value); let value_id = env.pool.add(value);
env.set_region(value_id, branch.value.region); env.set_region(value_id, branch.value.region);
@ -219,7 +219,7 @@ pub(crate) fn canonicalize_when_branch<'a>(
None => None, None => None,
Some(loc_expr) => { Some(loc_expr) => {
let (can_guard, guard_branch_output) = let (can_guard, guard_branch_output) =
to_expr2(env, &mut scope, &loc_expr.value, loc_expr.region); expr_to_expr2(env, &mut scope, &loc_expr.value, loc_expr.region);
let expr_id = env.pool.add(can_guard); let expr_id = env.pool.add(can_guard);
env.set_region(expr_id, loc_expr.region); env.set_region(expr_id, loc_expr.region);

View file

@ -27,7 +27,7 @@ use ven_graph::{strongly_connected_components, topological_sort_into_groups};
use crate::{ use crate::{
lang::{ lang::{
core::{ core::{
expr::{expr2::Expr2, expr_to_expr2::to_expr2, output::Output}, expr::{expr2::Expr2, expr_to_expr2::expr_to_expr2, output::Output},
fun_def::FunctionDef, fun_def::FunctionDef,
pattern::{self, symbols_from_pattern, to_pattern_id, Pattern2, PatternId}, pattern::{self, symbols_from_pattern, to_pattern_id, Pattern2, PatternId},
types::{to_annotation2, Alias, Annotation2, Signature, Type2, TypeId}, types::{to_annotation2, Alias, Annotation2, Signature, Type2, TypeId},
@ -472,7 +472,7 @@ fn canonicalize_pending_def<'a>(
}; };
let (loc_can_expr, can_output) = let (loc_can_expr, can_output) =
to_expr2(env, scope, &loc_expr.value, loc_expr.region); expr_to_expr2(env, scope, &loc_expr.value, loc_expr.region);
output.references.union_mut(can_output.references.clone()); output.references.union_mut(can_output.references.clone());
@ -639,7 +639,7 @@ fn canonicalize_pending_def<'a>(
env.closure_name_symbol = Some(*defined_symbol); env.closure_name_symbol = Some(*defined_symbol);
}; };
let (loc_can_expr, can_output) = to_expr2(env, scope, &loc_expr.value, loc_expr.region); let (loc_can_expr, can_output) = expr_to_expr2(env, scope, &loc_expr.value, loc_expr.region);
output.references.union_mut(can_output.references.clone()); output.references.union_mut(can_output.references.clone());

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;

View file

@ -36,12 +36,12 @@ pub fn loc_expr_to_expr2<'a>(
) -> (Expr2, Output) { ) -> (Expr2, Output) {
let desugared_loc_expr = desugar_expr(arena, arena.alloc(loc_expr)); let desugared_loc_expr = desugar_expr(arena, arena.alloc(loc_expr));
to_expr2(env, scope, arena.alloc(desugared_loc_expr.value), region) expr_to_expr2(env, scope, arena.alloc(desugared_loc_expr.value), region)
} }
const ZERO: Region = Region::zero(); const ZERO: Region = Region::zero();
pub fn to_expr2<'a>( pub fn expr_to_expr2<'a>(
env: &mut Env<'a>, env: &mut Env<'a>,
scope: &mut Scope, scope: &mut Scope,
parse_expr: &'a roc_parse::ast::Expr<'a>, parse_expr: &'a roc_parse::ast::Expr<'a>,
@ -139,7 +139,7 @@ pub fn to_expr2<'a>(
let elems: PoolVec<ExprId> = PoolVec::with_capacity(items.len() as u32, env.pool); let elems: PoolVec<ExprId> = PoolVec::with_capacity(items.len() as u32, env.pool);
for (node_id, item) in elems.iter_node_ids().zip(items.iter()) { for (node_id, item) in elems.iter_node_ids().zip(items.iter()) {
let (expr, sub_output) = to_expr2(env, scope, &item.value, item.region); let (expr, sub_output) = expr_to_expr2(env, scope, &item.value, item.region);
output_ref.union(sub_output); output_ref.union(sub_output);
@ -188,7 +188,7 @@ pub fn to_expr2<'a>(
final_comments: _, final_comments: _,
} => { } => {
let (can_update, update_out) = let (can_update, update_out) =
to_expr2(env, scope, &loc_update.value, loc_update.region); expr_to_expr2(env, scope, &loc_update.value, loc_update.region);
if let Expr2::Var(symbol) = &can_update { if let Expr2::Var(symbol) = &can_update {
match canonicalize_fields(env, scope, fields) { match canonicalize_fields(env, scope, fields) {
@ -309,10 +309,10 @@ pub fn to_expr2<'a>(
let mut output = Output::default(); let mut output = Output::default();
for (condition, then_branch) in branches.iter() { for (condition, then_branch) in branches.iter() {
let (cond, cond_output) = to_expr2(env, scope, &condition.value, condition.region); let (cond, cond_output) = expr_to_expr2(env, scope, &condition.value, condition.region);
let (then_expr, then_output) = let (then_expr, then_output) =
to_expr2(env, scope, &then_branch.value, then_branch.region); expr_to_expr2(env, scope, &then_branch.value, then_branch.region);
output.references.union_mut(cond_output.references); output.references.union_mut(cond_output.references);
output.references.union_mut(then_output.references); output.references.union_mut(then_output.references);
@ -321,7 +321,7 @@ pub fn to_expr2<'a>(
} }
let (else_expr, else_output) = let (else_expr, else_output) =
to_expr2(env, scope, &final_else.value, final_else.region); expr_to_expr2(env, scope, &final_else.value, final_else.region);
output.references.union_mut(else_output.references); output.references.union_mut(else_output.references);
@ -338,7 +338,7 @@ pub fn to_expr2<'a>(
When(loc_cond, branches) => { When(loc_cond, branches) => {
// Infer the condition expression's type. // Infer the condition expression's type.
let cond_var = env.var_store.fresh(); let cond_var = env.var_store.fresh();
let (can_cond, mut output) = to_expr2(env, scope, &loc_cond.value, loc_cond.region); let (can_cond, mut output) = expr_to_expr2(env, scope, &loc_cond.value, loc_cond.region);
// the condition can never be a tail-call // the condition can never be a tail-call
output.tail_call = None; output.tail_call = None;
@ -411,7 +411,7 @@ pub fn to_expr2<'a>(
} }
let (body_expr, new_output) = let (body_expr, new_output) =
to_expr2(env, &mut scope, &loc_body_expr.value, loc_body_expr.region); expr_to_expr2(env, &mut scope, &loc_body_expr.value, loc_body_expr.region);
let mut captured_symbols: MutSet<Symbol> = let mut captured_symbols: MutSet<Symbol> =
new_output.references.lookups.iter().copied().collect(); new_output.references.lookups.iter().copied().collect();
@ -501,7 +501,7 @@ pub fn to_expr2<'a>(
let fn_region = loc_fn.region; let fn_region = loc_fn.region;
// Canonicalize the function expression and its arguments // Canonicalize the function expression and its arguments
let (fn_expr, mut output) = to_expr2(env, scope, &loc_fn.value, fn_region); let (fn_expr, mut output) = expr_to_expr2(env, scope, &loc_fn.value, fn_region);
// The function's return type // The function's return type
let args = PoolVec::with_capacity(loc_args.len() as u32, env.pool); let args = PoolVec::with_capacity(loc_args.len() as u32, env.pool);
@ -592,7 +592,7 @@ pub fn to_expr2<'a>(
// The def as a whole is a tail call iff its return expression is a tail call. // The def as a whole is a tail call iff its return expression is a tail call.
// Use its output as a starting point because its tail_call already has the right answer! // Use its output as a starting point because its tail_call already has the right answer!
let (ret_expr, mut output) = to_expr2(env, &mut scope, &loc_ret.value, loc_ret.region); let (ret_expr, mut output) = expr_to_expr2(env, &mut scope, &loc_ret.value, loc_ret.region);
output output
.introduced_variables .introduced_variables
@ -704,7 +704,7 @@ pub fn to_expr_id<'a>(
parse_expr: &'a roc_parse::ast::Expr<'a>, parse_expr: &'a roc_parse::ast::Expr<'a>,
region: Region, region: Region,
) -> (ExprId, Output) { ) -> (ExprId, Output) {
let (expr, output) = to_expr2(env, scope, parse_expr, region); let (expr, output) = expr_to_expr2(env, scope, parse_expr, region);
(env.add(expr, region), output) (env.add(expr, region), output)
} }

View file

@ -1,6 +1,6 @@
pub mod expr2; pub mod expr2;
pub mod expr2_to_string; pub mod expr2_to_string;
pub(crate) mod expr_to_expr2; pub mod expr_to_expr2;
mod introduced_vars; mod introduced_vars;
pub(crate) mod output; pub(crate) mod output;
pub mod record_field; pub mod record_field;

View file

@ -3,7 +3,7 @@ use roc_parse::ast::StrLiteral;
use crate::{ use crate::{
ast_error::{ASTResult, UnexpectedASTNode}, ast_error::{ASTResult, UnexpectedASTNode},
lang::{core::expr::expr_to_expr2::to_expr2, env::Env, scope::Scope}, lang::{core::expr::expr_to_expr2::expr_to_expr2, env::Env, scope::Scope},
mem_pool::{pool::Pool, pool_str::PoolStr, pool_vec::PoolVec}, mem_pool::{pool::Pool, pool_str::PoolStr, pool_vec::PoolVec},
}; };
@ -94,7 +94,7 @@ fn flatten_str_lines<'a>(
} }
let (loc_expr, new_output) = let (loc_expr, new_output) =
to_expr2(env, scope, loc_expr.value, loc_expr.region); expr_to_expr2(env, scope, loc_expr.value, loc_expr.region);
output.union(new_output); output.union(new_output);

View file

@ -809,11 +809,11 @@ pub fn ast_to_mark_nodes<'a, 'b>(
for &def_id in ast.def_ids.iter() { for &def_id in ast.def_ids.iter() {
let def2 = env.pool.get(def_id); let def2 = env.pool.get(def_id);
let expr2_markup_id = def2_to_markup(arena, env, def2, def_id, mark_node_pool, interns)?; let def2_markup_id = def2_to_markup(arena, env, def2, def_id, mark_node_pool, interns)?;
set_parent_for_all(expr2_markup_id, mark_node_pool); set_parent_for_all(def2_markup_id, mark_node_pool);
all_mark_node_ids.push(expr2_markup_id); all_mark_node_ids.push(def2_markup_id);
} }
Ok(all_mark_node_ids) Ok(all_mark_node_ids)

View file

@ -9,9 +9,11 @@ edition = "2018"
[dependencies] [dependencies]
pulldown-cmark = { version = "0.8", default-features = false } pulldown-cmark = { version = "0.8", default-features = false }
roc_ast = { path = "../ast" }
roc_load = { path = "../compiler/load" } roc_load = { path = "../compiler/load" }
roc_builtins = { path = "../compiler/builtins" } roc_builtins = { path = "../compiler/builtins" }
roc_can = { path = "../compiler/can" } roc_can = { path = "../compiler/can" }
roc_code_markup = { path = "../code_markup"}
roc_fmt = { path = "../compiler/fmt" } roc_fmt = { path = "../compiler/fmt" }
roc_module = { path = "../compiler/module" } roc_module = { path = "../compiler/module" }
roc_region = { path = "../compiler/region" } roc_region = { path = "../compiler/region" }

View file

@ -1,47 +1,12 @@
use crate::html::ToHtml; use crate::html::ToHtml;
use roc_parse::ast::Def; use roc_code_markup::{markup::nodes::{MarkupNode}};
impl<'a> ToHtml<'a> for Def<'a> { impl<'a> ToHtml<'a> for MarkupNode {
fn css_class(&self) -> Option<&'a str> { fn css_class(&self) -> Option<&'a str> {
match self { Some("operator")
// Def::Annotation(_, _) => {}
// Def::Alias { .. } => {}
Def::Body(_, _) => None,
// Def::AnnotatedBody { .. } => {}
// Def::Expect(_) => {}
Def::SpaceBefore(_, _) => None,
Def::SpaceAfter(_, _) => None,
// Def::NotYetImplemented(_) => {}
_ => None,
}
} }
fn html_body(&self, buf: &mut bumpalo::collections::String<'a>) { fn html_body(&self, buf: &mut bumpalo::collections::String<'a>) {
match self { buf.push_str("MarkupNode")
// Def::Annotation(_, _) => {}
// Def::Alias { .. } => {}
Def::Body(pattern, expr) => {
pattern.html(buf);
EqualSign.html(buf);
expr.html(buf);
}
// Def::AnnotatedBody { .. } => {}
// Def::Expect(_) => {}
Def::SpaceBefore(sub_def, spaces) => {
for space in spaces.iter() {
space.html(buf);
}
sub_def.html(buf);
}
Def::SpaceAfter(sub_def, spaces) => {
sub_def.html(buf);
for space in spaces.iter() {
space.html(buf);
}
}
// Def::NotYetImplemented(_) => {}
_ => {}
}
} }
} }

View file

@ -1,6 +1,10 @@
use crate::html::ToHtml; use crate::html::ToHtml;
use roc_parse::ast::{CommentOrNewline, Expr, StrLiteral, StrSegment}; use bumpalo::Bump;
use roc_region::all::Located; use roc_ast::{ast_error::ASTResult, lang::{core::expr::expr_to_expr2::expr_to_expr2, env::Env, scope::Scope}, mem_pool::pool::Pool};
use roc_code_markup::{markup::nodes::expr2_to_markup, slow_pool::SlowPool};
use roc_module::symbol::Interns;
use roc_parse::ast::{Expr, StrLiteral};
use roc_region::all::{Located, Region};
impl<'a> ToHtml<'a> for Expr<'a> { impl<'a> ToHtml<'a> for Expr<'a> {
fn css_class(&self) -> Option<&'a str> { fn css_class(&self) -> Option<&'a str> {
@ -155,3 +159,35 @@ impl<'a> ToHtml<'a> for ParamComma {
buf.push_str(", ") buf.push_str(", ")
} }
} }
fn write_expr_to_bump_str_html<'a>(
arena: &mut Bump,
env: &mut Env<'a>,
scope: &mut Scope,
region: Region,
expr: &'a Expr,
interns: &Interns,
bump_str: &mut bumpalo::collections::String<'a>
) -> ASTResult<()> {
let (expr2, _) = expr_to_expr2(env, scope, expr, region);
let mut expr2_pool = Pool::with_capacity(1024);
let expr2_id = expr2_pool.add(expr2);
let mut mark_node_pool = SlowPool::default();
let expr2_markup_id = expr2_to_markup(
arena,
env,
&expr2,
expr2_id,
&mut mark_node_pool,
interns,
)?;
let expr2_markup_node = mark_node_pool.get(expr2_markup_id);
expr2_markup_node.html(bump_str);
Ok(())
}