From d14652ea6793c69c4b6b8627ded7b0fd3e769152 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 30 Mar 2015 08:33:48 +0700 Subject: [PATCH] semantize: handle the with statement Signed-off-by: Jean Privat --- src/semantize/flow.nit | 8 ++++++++ src/semantize/scope.nit | 18 ++++++++++++++++++ src/semantize/typing.nit | 19 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/semantize/flow.nit b/src/semantize/flow.nit index b4ba420..8dad3b7 100644 --- a/src/semantize/flow.nit +++ b/src/semantize/flow.nit @@ -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 diff --git a/src/semantize/scope.nit b/src/semantize/scope.nit index 6b4e973..749bb9e 100644 --- a/src/semantize/scope.nit +++ b/src/semantize/scope.nit @@ -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 diff --git a/src/semantize/typing.nit b/src/semantize/typing.nit index 6a6d943..15d38a2 100644 --- a/src/semantize/typing.nit +++ b/src/semantize/typing.nit @@ -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 -- 1.7.9.5