From d7e881841438cfe0797b71ff35ea96c8f2477a76 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Tue, 12 Apr 2011 12:16:21 -0700 Subject: Further work on typestate. Handles expr_rec and expr_assign now. Also changed the ts_ann field on statements to be an ann instead, which explains most of the changes. As well, got rid of the "warning: no type for expression" error by filling in annotations for local decls in typeck (not sure whether this was my fault or not). Finally, in bitv, added a clone() function to copy a bit vector, and fixed is_true, is_false, and to_str to not be nonsense. --- src/comp/util/common.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/comp/util/common.rs') diff --git a/src/comp/util/common.rs b/src/comp/util/common.rs index 68d518da..58109126 100644 --- a/src/comp/util/common.rs +++ b/src/comp/util/common.rs @@ -1,8 +1,17 @@ import std._uint; import std._int; import std._vec; +import std.option.none; import front.ast; +import util.typestate_ann.ts_ann; +import std.io.stdout; +import std.io.str_writer; +import std.io.string_writer; +import pretty.pprust.print_block; +import pretty.pprust.print_expr; +import pretty.pprust.print_decl; +import pretty.pp.mkstate; type filename = str; type span = rec(uint lo, uint hi); @@ -94,6 +103,40 @@ fn elt_exprs(vec[ast.elt] elts) -> vec[@ast.expr] { be _vec.map[ast.elt, @ast.expr](f, elts); } +fn field_expr(&ast.field f) -> @ast.expr { ret f.expr; } + +fn field_exprs(vec[ast.field] fields) -> vec [@ast.expr] { + auto f = field_expr; + ret _vec.map[ast.field, @ast.expr](f, fields); +} + +fn plain_ann() -> ast.ann { + ret ast.ann_type(middle.ty.plain_ty(middle.ty.ty_nil), + none[vec[@middle.ty.t]], none[@ts_ann]); +} + +fn log_expr(@ast.expr e) -> () { + let str_writer s = string_writer(); + auto out_ = mkstate(s.get_writer(), 80u); + auto out = @rec(s=out_, + comments=none[vec[front.lexer.cmnt]], + mutable cur_cmnt=0u); + + print_expr(out, e); + log(s.get_str()); +} + +fn log_block(&ast.block b) -> () { + let str_writer s = string_writer(); + auto out_ = mkstate(s.get_writer(), 80u); + auto out = @rec(s=out_, + comments=none[vec[front.lexer.cmnt]], + mutable cur_cmnt=0u); + + print_block(out, b); + log(s.get_str()); +} + // // Local Variables: // mode: rust -- cgit v1.2.3