Add #concat_idents[] and #ident_to_str[]
This commit is contained in:
parent
4a636b06f6
commit
513276e595
6 changed files with 65 additions and 9 deletions
|
@ -57,10 +57,13 @@ mod syntax {
|
|||
}
|
||||
mod ext {
|
||||
mod base;
|
||||
mod expand;
|
||||
|
||||
mod fmt;
|
||||
mod env;
|
||||
mod simplext;
|
||||
mod expand;
|
||||
mod concat_idents;
|
||||
mod ident_to_str;
|
||||
}
|
||||
mod print {
|
||||
mod pprust;
|
||||
|
|
|
@ -25,6 +25,10 @@ fn syntax_expander_table() -> hashmap[str, syntax_extension] {
|
|||
syntax_expanders.insert("env", normal(ext::env::expand_syntax_ext));
|
||||
syntax_expanders.insert("macro",
|
||||
macro_defining(ext::simplext::add_new_extension));
|
||||
syntax_expanders.insert("concat_idents",
|
||||
normal(ext::concat_idents::expand_syntax_ext));
|
||||
syntax_expanders.insert("ident_to_str",
|
||||
normal(ext::ident_to_str::expand_syntax_ext));
|
||||
ret syntax_expanders;
|
||||
}
|
||||
|
||||
|
@ -107,6 +111,12 @@ fn expr_to_ident(cx: &ext_ctxt, expr: @ast::expr, error: str) -> ast::ident {
|
|||
}
|
||||
}
|
||||
|
||||
fn make_new_lit(cx: &ext_ctxt, sp: codemap::span, lit: ast::lit_) ->
|
||||
@ast::expr {
|
||||
let sp_lit = @{node: lit, span: sp};
|
||||
ret @{id: cx.next_id(), node: ast::expr_lit(sp_lit), span: sp};
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
|
|
22
src/comp/syntax/ext/concat_idents.rs
Normal file
22
src/comp/syntax/ext/concat_idents.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
import std::ivec;
|
||||
import std::option;
|
||||
import base::*;
|
||||
import syntax::ast;
|
||||
|
||||
fn expand_syntax_ext(cx: &ext_ctxt, sp: codemap::span, arg: @ast::expr,
|
||||
body: option::t[str]) -> @ast::expr {
|
||||
let args: (@ast::expr)[] = alt arg.node {
|
||||
ast::expr_vec(elts, _, _) { elts }
|
||||
_ { cx.span_fatal(sp, "#concat_idents requires a vector argument .") }
|
||||
};
|
||||
let res: ast::ident = "";
|
||||
for e: @ast::expr in args {
|
||||
res += expr_to_ident(cx, e, "expected an ident");
|
||||
}
|
||||
|
||||
ret @{id: cx.next_id(),
|
||||
node: ast::expr_path( {
|
||||
node: {global: false, idents: ~[res], types: ~[]},
|
||||
span: sp}),
|
||||
span: sp};
|
||||
}
|
|
@ -1,12 +1,10 @@
|
|||
|
||||
|
||||
/*
|
||||
* The compiler code necessary to support the #env extension. Eventually this
|
||||
* should all get sucked into either the compiler syntax extension plugin
|
||||
* interface.
|
||||
*/
|
||||
import std::ivec;
|
||||
import std::str;
|
||||
import std::option;
|
||||
import std::generic_os;
|
||||
import base::*;
|
||||
|
@ -31,12 +29,6 @@ fn expand_syntax_ext(cx: &ext_ctxt, sp: codemap::span, arg: @ast::expr,
|
|||
}
|
||||
}
|
||||
|
||||
fn make_new_lit(cx: &ext_ctxt, sp: codemap::span, lit: ast::lit_) ->
|
||||
@ast::expr {
|
||||
let sp_lit = @{node: lit, span: sp};
|
||||
ret @{id: cx.next_id(), node: ast::expr_lit(sp_lit), span: sp};
|
||||
}
|
||||
|
||||
fn make_new_str(cx: &ext_ctxt, sp: codemap::span, s: str) -> @ast::expr {
|
||||
ret make_new_lit(cx, sp, ast::lit_str(s, ast::sk_rc));
|
||||
}
|
||||
|
|
21
src/comp/syntax/ext/ident_to_str.rs
Normal file
21
src/comp/syntax/ext/ident_to_str.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
import std::ivec;
|
||||
import std::option;
|
||||
import base::*;
|
||||
import syntax::ast;
|
||||
|
||||
fn expand_syntax_ext(cx: &ext_ctxt, sp: codemap::span, arg: @ast::expr,
|
||||
body: option::t[str]) -> @ast::expr {
|
||||
let args: (@ast::expr)[] = alt arg.node {
|
||||
ast::expr_vec(elts, _, _) { elts }
|
||||
_ { cx.span_fatal(sp, "#ident_to_str requires a vector argument .") }
|
||||
};
|
||||
if ivec::len[@ast::expr](args) != 1u {
|
||||
cx.span_fatal(sp, "malformed #ident_to_str call");
|
||||
}
|
||||
|
||||
ret make_new_lit(cx, sp,
|
||||
ast::lit_str(expr_to_ident(cx, args.(0u),
|
||||
"expected an ident"),
|
||||
ast::sk_rc));
|
||||
|
||||
}
|
8
src/test/run-pass/syntax-extension-minor.rs
Normal file
8
src/test/run-pass/syntax-extension-minor.rs
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
fn main() {
|
||||
let asdf_fdsa = "<.<";
|
||||
assert(#concat_idents[asd,f_f,dsa] == "<.<");
|
||||
|
||||
assert(#ident_to_str[use_mention_distinction]
|
||||
== "use_mention_distinction");
|
||||
}
|
Loading…
Add table
Reference in a new issue