summaryrefslogtreecommitdiff
path: root/src/hir/from_ast_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/from_ast_expr.cpp')
-rw-r--r--src/hir/from_ast_expr.cpp68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index 690d31cb..e52e9194 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -94,11 +94,38 @@ struct LowerHIR_ExprNode_Visitor:
::HIR::ExprNode_BinOp::Op op;
switch(v.m_type)
{
- case ::AST::ExprNode_BinOp::RANGE:
- TODO(v.get_pos(), "Desugar range");
- break;
+ case ::AST::ExprNode_BinOp::RANGE: {
+ // TODO: Lang items
+ auto path_Range = ::HIR::GenericPath( ::HIR::SimplePath("", {"ops", "Range"}) );
+ auto path_RangeFrom = ::HIR::GenericPath( ::HIR::SimplePath("", {"ops", "RangeFrom"}) );
+ auto path_RangeTo = ::HIR::GenericPath( ::HIR::SimplePath("", {"ops", "RangeTo"}) );
+ auto path_RangeFull = ::HIR::GenericPath( ::HIR::SimplePath("", {"ops", "RangeFull"}) );
+
+ ::HIR::ExprNode_StructLiteral::t_values values;
+ if( v.m_left )
+ values.push_back( ::std::make_pair( ::std::string("start"), LowerHIR_ExprNode_Inner( *v.m_left ) ) );
+ if( v.m_right )
+ values.push_back( ::std::make_pair( ::std::string("end") , LowerHIR_ExprNode_Inner( *v.m_right ) ) );
+
+ if( v.m_left ) {
+ if( v.m_right ) {
+ m_rv.reset( new ::HIR::ExprNode_StructLiteral(mv$(path_Range), nullptr, mv$(values)) );
+ }
+ else {
+ m_rv.reset( new ::HIR::ExprNode_StructLiteral(mv$(path_RangeFrom), nullptr, mv$(values)) );
+ }
+ }
+ else {
+ if( v.m_right ) {
+ m_rv.reset( new ::HIR::ExprNode_StructLiteral(mv$(path_RangeTo), nullptr, mv$(values)) );
+ }
+ else {
+ m_rv.reset( new ::HIR::ExprNode_PathValue(mv$(path_RangeFull)) );
+ }
+ }
+ break; }
case ::AST::ExprNode_BinOp::RANGE_INC:
- TODO(v.get_pos(), "Desugar range");
+ TODO(v.get_pos(), "Desugar range (inclusive)");
break;
case ::AST::ExprNode_BinOp::PLACE_IN:
TODO(v.get_pos(), "Desugar placement syntax");
@@ -141,6 +168,7 @@ struct LowerHIR_ExprNode_Visitor:
break;
case ::AST::ExprNode_UniOp::QMARK:
TODO(v.get_pos(), "Desugar question mark operator");
+ // NOTE: This operator doesn't use language items, ergo it's a basic desugar and is done in expand
break;
case ::AST::ExprNode_UniOp::REF: op = ::HIR::ExprNode_UniOp::Op::Ref ; if(0)
@@ -165,10 +193,20 @@ struct LowerHIR_ExprNode_Visitor:
::std::vector< ::HIR::ExprNodeP> args;
for(const auto& arg : v.m_args)
args.push_back( LowerHIR_ExprNode_Inner(*arg) );
- m_rv.reset( new ::HIR::ExprNode_CallPath(
- LowerHIR_Path(v.m_path),
- mv$( args )
- ) );
+
+ TU_IFLET(::AST::Path::Class, v.m_path.m_class, Local, e,
+ m_rv.reset( new ::HIR::ExprNode_CallValue(
+ ::HIR::ExprNodeP(new ::HIR::ExprNode_Variable( e.name, v.m_path.binding().as_Variable().slot )),
+ mv$(args)
+ ) );
+ )
+ else
+ {
+ m_rv.reset( new ::HIR::ExprNode_CallPath(
+ LowerHIR_Path(v.m_path),
+ mv$( args )
+ ) );
+ }
}
virtual void visit(::AST::ExprNode_CallMethod& v) override {
::std::vector< ::HIR::ExprNodeP> args;
@@ -239,7 +277,7 @@ struct LowerHIR_ExprNode_Visitor:
break; }
case ::AST::ExprNode_Loop::FOR:
// NOTE: This should already be desugared (as a pass before resolve)
- TODO(v.get_pos(), "Desugar for loop");
+ BUG(v.get_pos(), "Encountered still-sugared for loop");
break;
}
}
@@ -344,6 +382,18 @@ struct LowerHIR_ExprNode_Visitor:
m_rv.reset( new ::HIR::ExprNode_Literal( ::HIR::ExprNode_Literal::Data::make_String( v.m_value ) ) );
}
virtual void visit(::AST::ExprNode_Closure& v) override {
+ ::HIR::ExprNode_Closure::args_t args;
+ for(const auto& arg : v.m_args) {
+ args.push_back( ::std::make_pair(
+ LowerHIR_Pattern( arg.first ),
+ LowerHIR_Type( arg.second )
+ ) );
+ }
+ m_rv.reset( new ::HIR::ExprNode_Closure(
+ mv$(args),
+ LowerHIR_Type(v.m_return),
+ LowerHIR_ExprNode_Inner(*v.m_code)
+ ) );
}
virtual void visit(::AST::ExprNode_StructLiteral& v) override {
::HIR::ExprNode_StructLiteral::t_values values;