semantize: handle the with statement
authorJean Privat <jean@pryen.org>
Mon, 30 Mar 2015 01:33:48 +0000 (08:33 +0700)
committerJean Privat <jean@pryen.org>
Mon, 30 Mar 2015 01:33:48 +0000 (08:33 +0700)
Signed-off-by: Jean Privat <jean@pryen.org>

src/semantize/flow.nit
src/semantize/scope.nit
src/semantize/typing.nit

index b4ba420..8dad3b7 100644 (file)
@@ -438,6 +438,14 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       redef fun accept_flow_visitor(v)
+       do
+               super
+               v.merge_breaks(self.break_mark)
+       end
+end
+
 redef class AAssertExpr
        redef fun accept_flow_visitor(v)
        do
index 6b4e973..749bb9e 100644 (file)
@@ -411,6 +411,24 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       # The break escape mark associated with the 'with'
+       var break_mark: nullable EscapeMark
+
+       redef fun accept_scope_visitor(v)
+       do
+               v.scopes.unshift(new Scope)
+
+               var escapemark = v.make_escape_mark(n_label, true)
+               self.break_mark = escapemark
+
+               v.enter_visit(n_expr)
+               v.enter_visit_block(n_block, escapemark)
+
+               v.shift_scope
+       end
+end
+
 redef class AVarFormExpr
        # The associated variable
        var variable: nullable Variable
index 6a6d943..15d38a2 100644 (file)
@@ -707,6 +707,7 @@ redef class AVardeclExpr
 
                #debug("var {variable}: {mtype}")
 
+               self.mtype = mtype
                self.is_typed = true
        end
 end
@@ -1065,6 +1066,24 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       var method_start: nullable CallSite
+       var method_finish: nullable CallSite
+
+       redef fun accept_typing(v: TypeVisitor)
+       do
+               var mtype = v.visit_expr(n_expr)
+               if mtype == null then return
+
+               method_start = v.get_method(self, mtype, "start", n_expr isa ASelfExpr)
+               method_finish = v.get_method(self, mtype, "finish", n_expr isa ASelfExpr)
+
+               v.visit_stmt(n_block)
+               self.mtype = n_block.mtype
+               self.is_typed = true
+       end
+end
+
 redef class AAssertExpr
        redef fun accept_typing(v)
        do