+function M:Label(node, name)
+ match name with
+ | `Id{n} -> self:Label(node, n)
+ | _ ->
+ if is_ident(name) then
+ self:acc "::"
+ self:acc(name)
+ self:acc "::"
+ else -- Unprintable identifier
+ local sanitized_name = sanitize_name(name)
+ if is_ident(sanitized_name) then
+ self:acc "::"
+ self:acc(sanitized_name)
+ self:acc "::"
+ return nil
+ end
+ self:acc "-{`Id "
+ self:String(node, name)
+ self:acc "}"
+ end
+ end
+end
+
+function M:Goto(node, name)
+ match name with
+ | `Id{n} -> self:Goto(node, n)
+ | _ ->
+ if is_ident(name) then
+ self:acc "goto "
+ self:acc(name)
+ else -- Unprintable identifier
+ local sanitized_name = sanitize_name(name)
+ if is_ident(sanitized_name) then
+ self:acc "goto "
+ self:acc(sanitized_name)
+ return nil
+ end
+ self:acc "-{`Goto "
+ self:String(node, name)
+ self:acc "}"
+ end
+ end
+end
+
+function M:Stat(node, body, ret)
+ self:acc "(function()"
+ self:nlindent()
+ self:list (body, self.nl)
+ self:nl ()
+ self:acc "return "
+ self:node (ret)
+ self:nldedent()
+ self:acc "end)()"
+end
+