typing: include a hook to enable more precise error information on 'expected expressi...
[nit.git] / src / semantize / scope.nit
index fa10118..5f9c748 100644 (file)
@@ -18,6 +18,7 @@
 module scope
 
 import phase
+import modelbuilder
 
 redef class ToolContext
        # Run `APropdef::do_scope` on each propdef.
@@ -191,6 +192,7 @@ private class ScopeVisitor
                                var res = search_label("")
                                if res == null then
                                        self.error(nlabel, "Syntax Error: invalid anonymous label.")
+                                       node.is_broken = true
                                        return null
                                end
                                return res
@@ -199,6 +201,7 @@ private class ScopeVisitor
                        var res = search_label(name)
                        if res == null then
                                self.error(nlabel, "Syntax Error: invalid label `{name}`.")
+                               node.is_broken = true
                                return null
                        end
                        return res
@@ -218,6 +221,7 @@ private class ScopeVisitor
        fun error(node: ANode, message: String)
        do
                self.toolcontext.error(node.hot_location, message)
+               node.is_broken = true
        end
 end
 
@@ -377,9 +381,6 @@ redef class ALoopExpr
 end
 
 redef class AForExpr
-       # The automatic variables in order
-       var variables: nullable Array[Variable]
-
        # The break escape mark associated with the 'for'
        var break_mark: nullable EscapeMark
 
@@ -388,18 +389,22 @@ redef class AForExpr
 
        redef fun accept_scope_visitor(v)
        do
-               v.enter_visit(n_expr)
+               for g in n_groups do
+                       v.enter_visit(g.n_expr)
+               end
 
                # Protect automatic variables
                v.scopes.unshift(new Scope)
 
-               # Create the automatic variables
-               var variables = new Array[Variable]
-               self.variables = variables
-               for nid in n_ids do
-                       var va = new Variable(nid.text)
-                       v.register_variable(nid, va)
-                       variables.add(va)
+               for g in n_groups do
+                       # Create the automatic variables
+                       var variables = new Array[Variable]
+                       g.variables = variables
+                       for nid in g.n_ids do
+                               var va = new Variable(nid.text)
+                               v.register_variable(nid, va)
+                               variables.add(va)
+                       end
                end
 
                var escapemark = v.make_escape_mark(n_label, true)
@@ -411,6 +416,11 @@ redef class AForExpr
        end
 end
 
+redef class AForGroup
+       # The automatic variables in order
+       var variables: nullable Array[Variable]
+end
+
 redef class AWithExpr
        # The break escape mark associated with the 'with'
        var break_mark: nullable EscapeMark