diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index ee8373279d97..cc42bd9b08b8 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -1835,29 +1835,31 @@ fn decode_item_ast(par_doc: rbml::Doc) -> ast::Item { } #[cfg(test)] -trait fake_ext_ctxt { +trait FakeExtCtxt { + fn call_site(&self) -> codemap::Span; fn cfg(&self) -> ast::CrateConfig; - fn parse_sess<'a>(&'a self) -> &'a parse::ParseSess; - fn call_site(&self) -> Span; fn ident_of(&self, st: &str) -> ast::Ident; + fn name_of(&self, st: &str) -> ast::Name; + fn parse_sess(&self) -> &parse::ParseSess; } #[cfg(test)] -impl fake_ext_ctxt for parse::ParseSess { - fn cfg(&self) -> ast::CrateConfig { - Vec::new() - } - fn parse_sess<'a>(&'a self) -> &'a parse::ParseSess { self } - fn call_site(&self) -> Span { +impl FakeExtCtxt for parse::ParseSess { + fn call_site(&self) -> codemap::Span { codemap::Span { lo: codemap::BytePos(0), hi: codemap::BytePos(0), - expn_id: codemap::NO_EXPANSION + expn_id: codemap::NO_EXPANSION, } } + fn cfg(&self) -> ast::CrateConfig { Vec::new() } fn ident_of(&self, st: &str) -> ast::Ident { - token::str_to_ident(st) + parse::token::str_to_ident(st) + } + fn name_of(&self, st: &str) -> ast::Name { + parse::token::intern(st) } + fn parse_sess(&self) -> &parse::ParseSess { self } } #[cfg(test)] @@ -1883,7 +1885,7 @@ fn test_basic() { fn foo() {} )); } -/* NOTE: When there's a snapshot, update this (yay quasiquoter!) + #[test] fn test_smalltalk() { let cx = mk_ctxt(); @@ -1891,7 +1893,6 @@ fn test_smalltalk() { fn foo() -> isize { 3 + 4 } // first smalltalk program ever executed. )); } -*/ #[test] fn test_more() { diff --git a/src/test/compile-fail-fulldeps/qquote.rs b/src/test/compile-fail-fulldeps/qquote.rs new file mode 100644 index 000000000000..cf81f5943436 --- /dev/null +++ b/src/test/compile-fail-fulldeps/qquote.rs @@ -0,0 +1,55 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// ignore-cross-compile + +#![feature(quote, rustc_private)] + +extern crate syntax; + +use syntax::ast; +use syntax::codemap; +use syntax::parse; +use syntax::print::pprust; + +trait FakeExtCtxt { + fn call_site(&self) -> codemap::Span; + fn cfg(&self) -> ast::CrateConfig; + fn ident_of(&self, st: &str) -> ast::Ident; + fn name_of(&self, st: &str) -> ast::Name; + fn parse_sess(&self) -> &parse::ParseSess; +} + +impl FakeExtCtxt for parse::ParseSess { + fn call_site(&self) -> codemap::Span { + codemap::Span { + lo: codemap::BytePos(0), + hi: codemap::BytePos(0), + expn_id: codemap::NO_EXPANSION, + } + } + fn cfg(&self) -> ast::CrateConfig { Vec::new() } + fn ident_of(&self, st: &str) -> ast::Ident { + parse::token::str_to_ident(st) + } + fn name_of(&self, st: &str) -> ast::Name { + parse::token::intern(st) + } + fn parse_sess(&self) -> &parse::ParseSess { self } +} + +fn main() { + let cx = parse::new_parse_sess(); + + assert_eq!(pprust::expr_to_string(&*quote_expr!(&cx, 23)), "23"); + + let expr = quote_expr!(&cx, 2 - $abcd + 7); //~ ERROR unresolved name: `abcd` + assert_eq!(pprust::expr_to_string(&*expr), "2 - $abcd + 7"); +} diff --git a/src/test/parse-fail/qquote-1.rs b/src/test/parse-fail/qquote-1.rs deleted file mode 100644 index e30308b295a3..000000000000 --- a/src/test/parse-fail/qquote-1.rs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags: -Z parse-only - -// ignore-test Can't use syntax crate here - -#![feature(quote)] - -extern crate syntax; - -use io::*; - -use syntax::diagnostic; -use syntax::ast; -use syntax::codemap; -use syntax::parse; -use syntax::print::*; - - -trait fake_ext_ctxt { - fn cfg() -> ast::CrateConfig; - fn parse_sess() -> parse::parse_sess; - fn call_site() -> span; - fn ident_of(st: &str) -> ast::ident; -} - -type fake_session = parse::parse_sess; - -impl fake_ext_ctxt for fake_session { - fn cfg() -> ast::CrateConfig { Vec::new() } - fn parse_sess() -> parse::parse_sess { self } - fn call_site() -> span { - codemap::span { - lo: codemap::BytePos(0), - hi: codemap::BytePos(0), - expn_id: NO_EXPANSION - } - } - fn ident_of(st: &str) -> ast::ident { - self.interner.intern(st) - } -} - -fn mk_ctxt() -> fake_ext_ctxt { - parse::new_parse_sess(None) as fake_ext_ctxt -} - - - -fn main() { - let cx = mk_ctxt(); - - let abc = quote_expr!(cx, 23); - check_pp(abc, pprust::print_expr, "23"); - - let expr3 = quote_expr!(cx, 2 - $abcd + 7); //~ ERROR unresolved name: abcd - check_pp(expr3, pprust::print_expr, "2 - 23 + 7"); -} - -fn check_pp(expr: T, f: |pprust::ps, T|, expect: str) { - panic!(); -} diff --git a/src/test/parse-fail/qquote-2.rs b/src/test/parse-fail/qquote-2.rs deleted file mode 100644 index ac501d31beeb..000000000000 --- a/src/test/parse-fail/qquote-2.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags: -Z parse-only - -// ignore-test Can't use syntax crate here - -#![feature(quote)] - -extern crate syntax; - -use syntax::diagnostic; -use syntax::ast; -use syntax::codemap; -use syntax::parse::parser; -use syntax::print::*; - -trait fake_ext_ctxt { - fn cfg() -> ast::CrateConfig; - fn parse_sess() -> parse::parse_sess; - fn call_site() -> span; - fn ident_of(st: &str) -> ast::ident; -} - -type fake_session = parse::parse_sess; - -impl fake_ext_ctxt for fake_session { - fn cfg() -> ast::CrateConfig { Vec::new() } - fn parse_sess() -> parse::parse_sess { self } - fn call_site() -> span { - codemap::span { - lo: codemap::BytePos(0), - hi: codemap::BytePos(0), - expn_id: codemap::NO_EXPANSION - } - } - fn ident_of(st: &str) -> ast::ident { - self.interner.intern(st) - } -} - -fn mk_ctxt() -> fake_ext_ctxt { - parse::new_parse_sess(None) as fake_ext_ctxt -} - - -fn main() { - let cx = mk_ctxt(); - - let stmt = quote_stmt!(cx, let x isize = 20;); //~ ERROR expected end-of-string - check_pp(*stmt, pprust::print_stmt, ""); -} - -fn check_pp(expr: T, f: |pprust::ps, T|, expect: str) { - panic!(); -} diff --git a/src/test/run-fail/qquote.rs b/src/test/run-fail/qquote.rs new file mode 100644 index 000000000000..fe582bc9bf78 --- /dev/null +++ b/src/test/run-fail/qquote.rs @@ -0,0 +1,57 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// ignore-cross-compile + +// error-pattern:expected identifier, found keyword `let` + +#![feature(quote, rustc_private)] + +extern crate syntax; + +use syntax::ast; +use syntax::codemap; +use syntax::parse; +use syntax::print::pprust; + +trait FakeExtCtxt { + fn call_site(&self) -> codemap::Span; + fn cfg(&self) -> ast::CrateConfig; + fn ident_of(&self, st: &str) -> ast::Ident; + fn name_of(&self, st: &str) -> ast::Name; + fn parse_sess(&self) -> &parse::ParseSess; +} + +impl FakeExtCtxt for parse::ParseSess { + fn call_site(&self) -> codemap::Span { + codemap::Span { + lo: codemap::BytePos(0), + hi: codemap::BytePos(0), + expn_id: codemap::NO_EXPANSION, + } + } + fn cfg(&self) -> ast::CrateConfig { Vec::new() } + fn ident_of(&self, st: &str) -> ast::Ident { + parse::token::str_to_ident(st) + } + fn name_of(&self, st: &str) -> ast::Name { + parse::token::intern(st) + } + fn parse_sess(&self) -> &parse::ParseSess { self } +} + +fn main() { + let cx = parse::new_parse_sess(); + + assert_eq!(pprust::expr_to_string(&*quote_expr!(&cx, 23)), "23"); + + let expr = quote_expr!(&cx, let x isize = 20;); + assert_eq!(pprust::expr_to_string(&*expr), "let x isize = 20;"); +} diff --git a/src/test/run-pass-fulldeps/qquote.rs b/src/test/run-pass-fulldeps/qquote.rs index 710b3b07549f..995dd80df65a 100644 --- a/src/test/run-pass-fulldeps/qquote.rs +++ b/src/test/run-pass-fulldeps/qquote.rs @@ -10,86 +10,58 @@ // ignore-cross-compile // ignore-pretty -// ignore-test -#![feature(quote)] +#![feature(quote, rustc_private)] extern crate syntax; -use std::io::*; - -use syntax::diagnostic; use syntax::ast; use syntax::codemap; -use syntax::codemap::span; use syntax::parse; -use syntax::print::*; - - -trait fake_ext_ctxt { - fn cfg() -> ast::CrateConfig; - fn parse_sess() -> parse::parse_sess; - fn call_site() -> span; - fn ident_of(st: &str) -> ast::ident; +use syntax::print::pprust; + +trait FakeExtCtxt { + fn call_site(&self) -> codemap::Span; + fn cfg(&self) -> ast::CrateConfig; + fn ident_of(&self, st: &str) -> ast::Ident; + fn name_of(&self, st: &str) -> ast::Name; + fn parse_sess(&self) -> &parse::ParseSess; } -type fake_session = parse::parse_sess; - -impl fake_ext_ctxt for fake_session { - fn cfg() -> ast::CrateConfig { Vec::new() } - fn parse_sess() -> parse::parse_sess { self } - fn call_site() -> span { - codemap::span { +impl FakeExtCtxt for parse::ParseSess { + fn call_site(&self) -> codemap::Span { + codemap::Span { lo: codemap::BytePos(0), hi: codemap::BytePos(0), - expn_id: codemap::NO_EXPANSION + expn_id: codemap::NO_EXPANSION, } } - fn ident_of(st: &str) -> ast::ident { - self.interner.intern(st) + fn cfg(&self) -> ast::CrateConfig { Vec::new() } + fn ident_of(&self, st: &str) -> ast::Ident { + parse::token::str_to_ident(st) } -} - -fn mk_ctxt() -> fake_ext_ctxt { - parse::new_parse_sess(None) as fake_ext_ctxt + fn name_of(&self, st: &str) -> ast::Name { + parse::token::intern(st) + } + fn parse_sess(&self) -> &parse::ParseSess { self } } fn main() { - let cx = mk_ctxt(); + let cx = parse::new_parse_sess(); - let abc = quote_expr!(cx, 23); - check_pp(ext_cx, abc, pprust::print_expr, "23".to_string()); + assert_eq!(pprust::expr_to_string(&*quote_expr!(&cx, 23)), "23"); + assert_eq!(pprust::pat_to_string(&*quote_pat!(&cx, Some(_))), "Some(_)"); + assert_eq!(pprust::ty_to_string(&*quote_ty!(&cx, isize)), "isize"); + let arm = quote_arm!(&cx, (ref x, ref y) => (x, y),); + assert_eq!(pprust::arm_to_string(&arm), " (ref x, ref y) => (x, y),"); - let ty = quote_ty!(cx, isize); - check_pp(ext_cx, ty, pprust::print_type, "isize".to_string()); + let attr = quote_attr!(&cx, #![cfg(foo = "bar")]); + assert_eq!(pprust::attr_to_string(&attr), "#![cfg(foo = \"bar\")]"); - let item = quote_item!(cx, static x : isize = 10;).get(); - check_pp(ext_cx, item, pprust::print_item, "static x: isize = 10;".to_string()); + let item = quote_item!(&cx, static x : isize = 10;).unwrap(); + assert_eq!(pprust::item_to_string(&*item), "static x: isize = 10;"); - let stmt = quote_stmt!(cx, let x = 20;); - check_pp(ext_cx, *stmt, pprust::print_stmt, "let x = 20;".to_string()); - - let pat = quote_pat!(cx, Some(_)); - check_pp(ext_cx, pat, pprust::print_pat, "Some(_)".to_string()); - - let arm = quote_arm!(cx, (ref x, ref y) => (x, y)); - check_pp(ext_cx, arm, pprust::print_stmt, "(ref x, ref y) = (x, y)".to_string()); - - let attr = quote_attr!(cx, #![cfg(foo = "bar")]); - check_pp(ext_cx, attr, pprust::print_attribute, "#![cfg(foo = "bar")]".to_string()); -} - -fn check_pp(cx: fake_ext_ctxt, - expr: T, f: |pprust::ps, T|, expect: String) { - let s = io::with_str_writer(|wr| { - let pp = pprust::rust_printer(wr, cx.parse_sess().interner); - f(pp, expr); - pp::eof(pp.s); - }); - stdout().write_line(s); - if expect != "".to_string() { - println!("expect: '%s', got: '%s'", expect, s); - assert_eq!(s, expect); - } + let stmt = quote_stmt!(&cx, let x = 20;).unwrap(); + assert_eq!(pprust::stmt_to_string(&*stmt), "let x = 20;"); }