Skip to content

Commit 85cdabf

Browse files
committed
---
yaml --- r: 10721 b: refs/heads/snap-stage3 c: 4df2654 h: refs/heads/master i: 10719: ccdc3d5 v: v3
1 parent 5cb8aa6 commit 85cdabf

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 4f104954a67ad736244ce212467290c836394fad
4+
refs/heads/snap-stage3: 4df2654f828b1346dab75166ddca7222666b5939
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/snap-stage3/src/libsyntax/ext/base.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@ import std::map::str_hash;
66

77
type syntax_expander_ =
88
fn@(ext_ctxt, span, ast::mac_arg, ast::mac_body) -> @ast::expr;
9-
type syntax_expander = {
10-
expander: syntax_expander_,
11-
span: option<span>};
9+
type syntax_expander = {expander: syntax_expander_, span: option<span>};
10+
1211
type macro_def = {ident: ast::ident, ext: syntax_extension};
1312
type macro_definer =
1413
fn@(ext_ctxt, span, ast::mac_arg, ast::mac_body) -> macro_def;
1514
type item_decorator =
1615
fn@(ext_ctxt, span, ast::meta_item, [@ast::item]) -> [@ast::item];
1716

17+
type syntax_expander_tt = {expander: syntax_expander_tt_, span: option<span>};
18+
type syntax_expander_tt_ = fn@(ext_ctxt, span, ast::token_tree) -> @ast::expr;
19+
1820
enum syntax_extension {
1921
normal(syntax_expander),
2022
macro_defining(macro_definer),
2123
item_decorator(item_decorator),
24+
25+
normal_tt(syntax_expander_tt)
2226
}
2327

2428
// A temporary hard-coded map of methods for expanding syntax extension

branches/snap-stage3/src/libsyntax/ext/expand.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,39 @@ fn expand_expr(exts: hashmap<str, syntax_extension>, cx: ext_ctxt,
4747
exts.insert(*named_extension.ident, named_extension.ext);
4848
(ast::expr_rec([], none), s)
4949
}
50+
some(normal_tt(_)) {
51+
cx.span_fatal(pth.span,
52+
#fmt["this tt-style macro should be \
53+
invoked '%s!{...}'", *extname])
54+
}
55+
}
56+
}
57+
mac_invoc_tt(pth, tt) {
58+
assert (vec::len(pth.idents) > 0u);
59+
let extname = pth.idents[0];
60+
alt exts.find(*extname) {
61+
none {
62+
cx.span_fatal(pth.span,
63+
#fmt["macro undefined: '%s'", *extname])
64+
}
65+
some(normal_tt({expander: exp, span: exp_sp})) {
66+
let expanded = exp(cx, pth.span, tt);
67+
68+
cx.bt_push(expanded_from({call_site: s,
69+
callie: {name: *extname, span: exp_sp}}));
70+
//keep going, outside-in
71+
let fully_expanded = fld.fold_expr(expanded).node;
72+
cx.bt_pop();
73+
74+
(fully_expanded, s)
75+
76+
}
77+
_ {
78+
cx.span_fatal(pth.span,
79+
#fmt["'%s' is not a tt-style macro",
80+
*extname])
81+
}
82+
5083
}
5184
}
5285
_ { cx.span_bug(mac.span, "naked syntactic bit") }
@@ -75,7 +108,8 @@ fn expand_mod_items(exts: hashmap<str, syntax_extension>, cx: ext_ctxt,
75108
ast::meta_list(n, _) { n }
76109
};
77110
alt exts.find(*mname) {
78-
none | some(normal(_)) | some(macro_defining(_)) {
111+
none | some(normal(_)) | some(macro_defining(_))
112+
| some(normal_tt(_)) {
79113
items
80114
}
81115

branches/snap-stage3/src/libsyntax/parse/parser.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -883,8 +883,17 @@ class parser {
883883
is_ident(self.token) && !self.is_keyword("true") &&
884884
!self.is_keyword("false") {
885885
let pth = self.parse_path_with_tps(true);
886-
hi = pth.span.hi;
887-
ex = expr_path(pth);
886+
887+
/* `!`, as an operator, is prefix, so we know this isn't that */
888+
if self.token == token::NOT {
889+
self.bump();
890+
let m_body = self.parse_token_tree();
891+
let hi = self.span.hi;
892+
ret pexpr(self.mk_mac_expr(lo, hi, mac_invoc_tt(pth,m_body)));
893+
} else {
894+
hi = pth.span.hi;
895+
ex = expr_path(pth);
896+
}
888897
} else {
889898
let lit = self.parse_lit();
890899
hi = lit.span.hi;

0 commit comments

Comments
 (0)