summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-06 13:06:44 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-06 13:06:44 +0800
commit9b9ea22af5025589238ca9357759609f59514d51 (patch)
treef9e52060de57786420bc67dcdee3a81f745a60de /src
parent697406729a0b1d3a49b12be66fda1c9d858af67a (diff)
downloadmrust-9b9ea22af5025589238ca9357759609f59514d51.tar.gz
Expand - Fix ? desugar
Diffstat (limited to 'src')
-rw-r--r--src/expand/mod.cpp20
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") ) ) )
+ ))
+ )
))
))
));