From 485e489ba2cb025bb84606396b1cea3023c8c99c Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 26 Jan 2012 17:03:20 -0700 Subject: [PATCH] Implement basic quasi-quoter. No anti-quotes yet. --- src/comp/rustc.rc | 1 + src/comp/syntax/ext/expand.rs | 8 +------- src/comp/syntax/ext/qquote.rs | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/comp/syntax/ext/qquote.rs diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index 40e66037f3a4..bfb26382a84d 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -74,6 +74,7 @@ mod syntax { mod ext { mod base; mod expand; + mod qquote; mod build; mod fmt; diff --git a/src/comp/syntax/ext/expand.rs b/src/comp/syntax/ext/expand.rs index 9deceaeccf79..5c81da6f492f 100644 --- a/src/comp/syntax/ext/expand.rs +++ b/src/comp/syntax/ext/expand.rs @@ -8,6 +8,7 @@ import vec; import syntax::ast::{crate, expr_, expr_mac, mac_invoc, mac_qq}; import syntax::fold::*; import syntax::ext::base::*; +import syntax::ext::qquote::expand_qquote; import syntax::parse::parser::parse_expr_from_source_str; import codemap::span; @@ -53,13 +54,6 @@ fn expand_expr(exts: hashmap, cx: ext_ctxt, }; } -fn expand_qquote(cx: ext_ctxt, sp: span, e: @ast::expr) -> ast::expr_ { - import syntax::ext::build::*; - let str = codemap::span_to_snippet(sp, cx.session().parse_sess.cm); - let expr = mk_str(cx, e.span, str); - ret expr.node; -} - // FIXME: this is a terrible kludge to inject some macros into the default // compilation environment. When the macro-definition system is substantially // more mature, these should move from here, into a compiled part of libcore diff --git a/src/comp/syntax/ext/qquote.rs b/src/comp/syntax/ext/qquote.rs new file mode 100644 index 000000000000..e1912ce0087d --- /dev/null +++ b/src/comp/syntax/ext/qquote.rs @@ -0,0 +1,38 @@ +import driver::session; + +import option::{none, some}; + +import syntax::ast::{crate, expr_, expr_mac, mac_invoc, mac_qq}; +import syntax::fold::*; +import syntax::ext::base::*; +import syntax::ext::build::*; +import syntax::parse::parser::parse_expr_from_source_str; + +import codemap::span; + +fn expand_qquote(cx: ext_ctxt, sp: span, _e: @ast::expr) -> ast::expr_ { + let str = codemap::span_to_snippet(sp, cx.session().parse_sess.cm); + let session_call = bind mk_call_(cx,sp, + mk_access(cx,sp,["ext_cx"], "session"), + []); + let call = mk_call(cx,sp, + ["syntax", "parse", "parser", + "parse_expr_from_source_str"], + [mk_str(cx,sp, ""), + mk_unary(cx,sp, ast::box(ast::imm), + mk_str(cx,sp, str)), + mk_access_(cx,sp, + mk_access_(cx,sp, session_call(), "opts"), + "cfg"), + mk_access_(cx,sp, session_call(), "parse_sess")] + ); + ret call.node; +} + +// Local Variables: +// mode: rust +// fill-column: 78; +// indent-tabs-mode: nil +// c-basic-offset: 4 +// buffer-file-coding-system: utf-8-unix +// End: