diff options
author | John Hodge <tpg@mutabah.net> | 2016-08-06 13:06:44 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-08-06 13:06:44 +0800 |
commit | 9b9ea22af5025589238ca9357759609f59514d51 (patch) | |
tree | f9e52060de57786420bc67dcdee3a81f745a60de /src/expand/mod.cpp | |
parent | 697406729a0b1d3a49b12be66fda1c9d858af67a (diff) | |
download | mrust-9b9ea22af5025589238ca9357759609f59514d51.tar.gz |
Expand - Fix ? desugar
Diffstat (limited to 'src/expand/mod.cpp')
-rw-r--r-- | src/expand/mod.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 54987d01..2f9956bc 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -489,17 +489,28 @@ struct CExpandExpr: } void visit(::AST::ExprNode_UniOp& node) override { this->visit_nodelete(node, node.m_value); + // - Desugar question mark operator before resolve? if( node.m_type == ::AST::ExprNode_UniOp::QMARK ) { auto path_Ok = ::AST::Path("", {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Ok")}); auto path_Err = ::AST::Path("", {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Err")}); auto path_From = ::AST::Path("", {::AST::PathNode("convert"), ::AST::PathNode("From")}); + // Desugars into + // ``` + // match `m_value` { + // Ok(v) => v, + // Err(e) => return Err(From::from(e)), + // } + // ``` + ::std::vector< ::AST::ExprNode_Match_Arm> arms; + // `Ok(v) => v,` arms.push_back(::AST::ExprNode_Match_Arm( ::make_vec1( ::AST::Pattern(::AST::Pattern::TagEnumVariant(), path_Ok, ::make_vec1( ::AST::Pattern(::AST::Pattern::TagBind(), "v") )) ), nullptr, ::AST::ExprNodeP( new ::AST::ExprNode_NamedValue( ::AST::Path(::AST::Path::TagLocal(), "v") ) ) )); + // `Err(e) => return Err(From::from(e)),` arms.push_back(::AST::ExprNode_Match_Arm( ::make_vec1( ::AST::Pattern(::AST::Pattern::TagEnumVariant(), path_Err, ::make_vec1( ::AST::Pattern(::AST::Pattern::TagBind(), "e") )) ), nullptr, @@ -507,8 +518,13 @@ struct CExpandExpr: ::AST::ExprNode_Flow::RETURN, "", ::AST::ExprNodeP(new ::AST::ExprNode_CallPath( - ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), mv$(path_From), { ::AST::PathNode("from") }), - ::make_vec1( ::AST::ExprNodeP( new ::AST::ExprNode_NamedValue( ::AST::Path(::AST::Path::TagLocal(), "e") ) ) ) + ::AST::Path(path_Err), + ::make_vec1( + ::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), mv$(path_From), { ::AST::PathNode("from") }), + ::make_vec1( ::AST::ExprNodeP( new ::AST::ExprNode_NamedValue( ::AST::Path(::AST::Path::TagLocal(), "e") ) ) ) + )) + ) )) )) )); |