Skip to content

Commit d8d6d6c

Browse files
committed
---
yaml --- r: 11028 b: refs/heads/master c: a2dde9a h: refs/heads/master v: v3
1 parent 0b0b7a8 commit d8d6d6c

File tree

5 files changed

+78
-21
lines changed

5 files changed

+78
-21
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: f7fab77102057b55202992c7e73d62d7123f6356
2+
refs/heads/master: a2dde9a69218ab350b442caec00d2b991ba2262c
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/comp/syntax/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ enum mac_ {
285285
// the span is used by the quoter/anti-quoter ...
286286
mac_qq(span /* span of expr */, @expr), // quasi-quote
287287
mac_aq(span /* span of quote */, @expr), // anti-quote
288-
mac_var(uint),
288+
mac_var(uint)
289289
}
290290

291291
type lit = spanned<lit_>;

trunk/src/comp/syntax/ext/qquote.rs

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import driver::session;
22

33
import option::{none, some};
44

5-
import syntax::ast::{crate, expr_, expr_mac, mac_invoc,
5+
import syntax::ast::{crate, expr_, mac_invoc,
66
mac_qq, mac_aq, mac_var};
77
import syntax::fold::*;
88
import syntax::visit::*;
@@ -17,68 +17,98 @@ import std::io::*;
1717
import codemap::span;
1818

1919
type aq_ctxt = @{lo: uint,
20-
mutable gather: [{lo: uint, hi: uint, e: @ast::expr}]};
20+
mutable gather: [{lo: uint, hi: uint,
21+
e: @ast::expr, constr: str}]};
22+
enum fragment {
23+
from_expr(@ast::expr),
24+
from_ty(@ast::ty)
25+
}
2126

2227
iface qq_helper {
2328
fn span() -> span;
2429
fn visit(aq_ctxt, vt<aq_ctxt>);
30+
fn extract_mac() -> option<ast::mac_>;
2531
fn mk_parse_fn(ext_ctxt,span) -> @ast::expr;
2632
}
2733
impl of qq_helper for @ast::expr {
2834
fn span() -> span {self.span}
2935
fn visit(cx: aq_ctxt, v: vt<aq_ctxt>) {visit_expr(self, cx, v);}
36+
fn extract_mac() -> option<ast::mac_> {
37+
alt (self.node) {
38+
ast::expr_mac({node: mac, _}) {some(mac)}
39+
_ {none}
40+
}
41+
}
3042
fn mk_parse_fn(cx: ext_ctxt, sp: span) -> @ast::expr {
3143
mk_path(cx, sp, ["syntax", "parse", "parser", "parse_expr"])
3244
}
3345
}
3446
impl of qq_helper for @ast::ty {
3547
fn span() -> span {self.span}
3648
fn visit(cx: aq_ctxt, v: vt<aq_ctxt>) {visit_ty(self, cx, v);}
49+
fn extract_mac() -> option<ast::mac_> {
50+
alt (self.node) {
51+
ast::ty_mac({node: mac, _}) {some(mac)}
52+
_ {none}
53+
}
54+
}
3755
fn mk_parse_fn(cx: ext_ctxt, sp: span) -> @ast::expr {
3856
mk_path(cx, sp, ["syntax", "ext", "qquote", "parse_ty"])
3957
}
4058
}
4159
impl of qq_helper for @ast::item {
4260
fn span() -> span {self.span}
4361
fn visit(cx: aq_ctxt, v: vt<aq_ctxt>) {visit_item(self, cx, v);}
62+
fn extract_mac() -> option<ast::mac_> {fail}
4463
fn mk_parse_fn(cx: ext_ctxt, sp: span) -> @ast::expr {
4564
mk_path(cx, sp, ["syntax", "ext", "qquote", "parse_item"])
4665
}
4766
}
4867
impl of qq_helper for @ast::stmt {
4968
fn span() -> span {self.span}
5069
fn visit(cx: aq_ctxt, v: vt<aq_ctxt>) {visit_stmt(self, cx, v);}
70+
fn extract_mac() -> option<ast::mac_> {fail}
5171
fn mk_parse_fn(cx: ext_ctxt, sp: span) -> @ast::expr {
5272
mk_path(cx, sp, ["syntax", "ext", "qquote", "parse_stmt"])
5373
}
5474
}
5575
impl of qq_helper for @ast::pat {
5676
fn span() -> span {self.span}
5777
fn visit(cx: aq_ctxt, v: vt<aq_ctxt>) {visit_pat(self, cx, v);}
78+
fn extract_mac() -> option<ast::mac_> {fail}
5879
fn mk_parse_fn(cx: ext_ctxt, sp: span) -> @ast::expr {
5980
mk_path(cx, sp, ["syntax", "parse", "parser", "parse_pat"])
6081
}
6182
}
6283

6384
fn gather_anti_quotes<N: qq_helper>(lo: uint, node: N) -> aq_ctxt
6485
{
65-
let v = @{visit_expr: visit_expr_aq
86+
let v = @{visit_expr: visit_aq_expr,
87+
visit_ty: visit_aq_ty
6688
with *default_visitor()};
6789
let cx = @{lo:lo, mutable gather: []};
6890
node.visit(cx, mk_vt(v));
6991
ret cx;
7092
}
7193

72-
fn visit_expr_aq(expr: @ast::expr, &&cx: aq_ctxt, v: vt<aq_ctxt>)
94+
fn visit_aq<T:qq_helper>(node: T, constr: str, &&cx: aq_ctxt, v: vt<aq_ctxt>)
7395
{
74-
alt (expr.node) {
75-
expr_mac({node: mac_aq(sp, e), _}) {
96+
alt (node.extract_mac()) {
97+
some(mac_aq(sp, e)) {
7698
cx.gather += [{lo: sp.lo - cx.lo, hi: sp.hi - cx.lo,
77-
e: e}];
99+
e: e, constr: constr}];
78100
}
79-
_ {visit_expr(expr, cx, v);}
101+
_ {node.visit(cx, v);}
80102
}
81103
}
104+
// FIXME: these are only here because I (kevina) couldn't figure out how to
105+
// get bind to work in gather_anti_quotes
106+
fn visit_aq_expr(node: @ast::expr, &&cx: aq_ctxt, v: vt<aq_ctxt>) {
107+
visit_aq(node,"from_expr",cx,v);
108+
}
109+
fn visit_aq_ty(node: @ast::ty, &&cx: aq_ctxt, v: vt<aq_ctxt>) {
110+
visit_aq(node,"from_ty",cx,v);
111+
}
82112

83113
fn is_space(c: char) -> bool {
84114
syntax::parse::lexer::is_whitespace(c)
@@ -211,28 +241,51 @@ fn expand_qquote<N: qq_helper>
211241
rcall = mk_call(cx,sp,
212242
["syntax", "ext", "qquote", "replace"],
213243
[pcall,
214-
mk_vec_e(cx,sp, vec::map(qcx.gather, {|g| g.e}))]);
244+
mk_vec_e(cx,sp, vec::map(qcx.gather) {|g|
245+
mk_call(cx,sp,
246+
["syntax", "ext", "qquote", g.constr],
247+
[g.e])
248+
})]);
215249
}
216250

217251
ret rcall;
218252
}
219253

220-
fn replace(e: @ast::expr, repls: [@ast::expr]) -> @ast::expr {
254+
fn replace(e: @ast::expr, repls: [fragment]) -> @ast::expr {
221255
let aft = default_ast_fold();
222256
let f_pre = {fold_expr: bind replace_expr(repls, _, _, _,
223-
aft.fold_expr)
257+
aft.fold_expr),
258+
fold_ty: bind replace_ty(repls, _, _, _,
259+
aft.fold_ty)
224260
with *aft};
225261
let f = make_fold(f_pre);
226262
ret f.fold_expr(e);
227263
}
228264

229-
fn replace_expr(repls: [@ast::expr],
265+
fn replace_expr(repls: [fragment],
230266
e: ast::expr_, s: span, fld: ast_fold,
231267
orig: fn@(ast::expr_, span, ast_fold)->(ast::expr_, span))
232268
-> (ast::expr_, span)
233269
{
234270
alt e {
235-
expr_mac({node: mac_var(i), _}) {let r = repls[i]; (r.node, r.span)}
271+
ast::expr_mac({node: mac_var(i), _}) {
272+
alt (repls[i]) {
273+
from_expr(r) {(r.node, r.span)}
274+
_ {fail /* fixme error message */}}}
275+
_ {orig(e,s,fld)}
276+
}
277+
}
278+
279+
fn replace_ty(repls: [fragment],
280+
e: ast::ty_, s: span, fld: ast_fold,
281+
orig: fn@(ast::ty_, span, ast_fold)->(ast::ty_, span))
282+
-> (ast::ty_, span)
283+
{
284+
alt e {
285+
ast::ty_mac({node: mac_var(i), _}) {
286+
alt (repls[i]) {
287+
from_ty(r) {(r.node, r.span)}
288+
_ {fail /* fixme error message */}}}
236289
_ {orig(e,s,fld)}
237290
}
238291
}

trunk/src/comp/syntax/parse/parser.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,13 @@ fn parse_ret_ty(p: parser) -> (ast::ret_style, @ast::ty) {
420420

421421
fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
422422
let lo = p.span.lo;
423+
424+
alt have_dollar(p) {
425+
some(e) {ret @spanned(lo, p.span.hi,
426+
ast::ty_mac(spanned(lo, p.span.hi, e)))}
427+
none {}
428+
}
429+
423430
let t: ast::ty_;
424431
// FIXME: do something with this
425432

trunk/src/test/run-pass/qquote.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,6 @@ fn main() {
5050
let abc = #ast{23};
5151
check_pp(abc, pprust::print_expr, "23");
5252

53-
let expr = #ast{1 - $0 + 8};
54-
check_pp(expr, pprust::print_expr, "1 - $0 + 8");
55-
56-
let expr2 = rustc::syntax::ext::qquote::replace(expr, [abc]);
57-
check_pp(expr2, pprust::print_expr, "1 - 23 + 8");
58-
5953
let expr3 = #ast{2 - $(abc) + 7};
6054
check_pp(expr3, pprust::print_expr, "2 - 23 + 7");
6155

@@ -68,6 +62,9 @@ fn main() {
6862
let item = #ast(item){const x : int = 10;};
6963
check_pp(item, pprust::print_item, "const x: int = 10;");
7064

65+
//let item2: @ast::item = #ast(item){const x : int = $(abc);};
66+
//check_pp(item2, pprust::print_item, "const x: int = 23;");
67+
7168
let stmt = #ast(stmt){let x = 20;};
7269
check_pp(*stmt, pprust::print_stmt, "let x = 20;");
7370

0 commit comments

Comments
 (0)