Try associated type
This commit is contained in:
parent
4b8f1c35b6
commit
a7cad3b88e
@ -40,15 +40,16 @@ pub trait ASTVisitor: Sized {
|
||||
fn pattern(&mut self, _pat: &Pattern) {}
|
||||
}
|
||||
|
||||
pub trait ExpressionVisitor<T> {//TODO maybe this should be an associated type?
|
||||
fn type_anno(&mut self, _anno: &TypeIdentifier) -> T;
|
||||
fn nat_literal(&mut self, _value: &u64) -> T;
|
||||
fn string_literal(&mut self, _value: &Rc<String>) -> T;
|
||||
fn binexp(&mut self, _op: &BinOp, _lhs_resul: T, _rhs_result: T) -> T;
|
||||
fn done(&mut self, kind: T, anno: Option<T>) -> T;
|
||||
pub trait ExpressionVisitor {//TODO maybe this should be an associated type?
|
||||
type Output;
|
||||
fn type_anno(&mut self, _anno: &TypeIdentifier) -> Self::Output;
|
||||
fn nat_literal(&mut self, _value: &u64) -> Self::Output;
|
||||
fn string_literal(&mut self, _value: &Rc<String>) -> Self::Output;
|
||||
fn binexp(&mut self, _op: &BinOp, _lhs_resul: Self::Output, _rhs_result: Self::Output) -> Self::Output;
|
||||
fn done(&mut self, kind: Self::Output, anno: Option<Self::Output>) -> Self::Output;
|
||||
}
|
||||
|
||||
pub fn dispatch_expression_visitor<T>(input: &Expression, visitor: &mut dyn ExpressionVisitor<T>) -> Result<T, String> {
|
||||
pub fn dispatch_expression_visitor<T>(input: &Expression, visitor: &mut dyn ExpressionVisitor<Output=T>) -> Result<T, String> {
|
||||
|
||||
let output = match input.kind {
|
||||
ExpressionKind::NatLiteral(ref n) => visitor.nat_literal(n),
|
||||
|
@ -45,7 +45,8 @@ fn heh() {
|
||||
struct ExprPrinter {
|
||||
}
|
||||
|
||||
impl ExpressionVisitor<String> for ExprPrinter {
|
||||
impl ExpressionVisitor for ExprPrinter {
|
||||
type Output = String;
|
||||
fn type_anno(&mut self, _anno: &TypeIdentifier) -> String {
|
||||
"Any".to_string()
|
||||
}
|
||||
@ -81,9 +82,9 @@ fn make_expr(input: &str) -> Expression {
|
||||
|
||||
#[test]
|
||||
fn new_visitor() {
|
||||
let expr: Expression = make_expr("7+20");
|
||||
let expr: Expression = make_expr("7+\"nueces\"");
|
||||
|
||||
let mut printer = ExprPrinter { };
|
||||
let s = dispatch_expression_visitor(&expr, &mut printer).unwrap();
|
||||
assert_eq!(s, "7 + 20");
|
||||
assert_eq!(s, r#"7 + "nueces""#);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user