1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
13 #![crate_type="dylib"]
14 #![feature(plugin_registrar, rustc_private)]
15 #![feature(slice_patterns)]
19 extern crate rustc_plugin
;
21 use syntax
::codemap
::Span
;
22 use syntax
::ast
::TokenTree
;
23 use syntax
::parse
::token
;
24 use syntax
::ext
::base
::{ExtCtxt, MacResult, DummyResult, MacEager}
;
25 use syntax
::ext
::build
::AstBuilder
; // trait for expr_usize
26 use rustc_plugin
::Registry
;
28 // WARNING WARNING WARNING WARNING WARNING
29 // =======================================
31 // This code also appears in src/doc/guide-plugin.md. Please keep
32 // the two copies in sync! FIXME: have rustdoc read this file
34 fn expand_rn(cx
: &mut ExtCtxt
, sp
: Span
, args
: &[TokenTree
])
35 -> Box
<MacResult
+ '
static> {
37 static NUMERALS
: &'
static [(&'
static str, usize)] = &[
38 ("M", 1000), ("CM", 900), ("D", 500), ("CD", 400),
39 ("C", 100), ("XC", 90), ("L", 50), ("XL", 40),
40 ("X", 10), ("IX", 9), ("V", 5), ("IV", 4),
46 &format
!("argument should be a single identifier, but got {} arguments", args
.len()));
47 return DummyResult
::any(sp
);
50 let text
= match args
[0] {
51 TokenTree
::Token(_
, token
::Ident(s
, _
)) => s
.to_string(),
53 cx
.span_err(sp
, "argument should be a single identifier");
54 return DummyResult
::any(sp
);
58 let mut text
= &*text
;
60 while !text
.is_empty() {
61 match NUMERALS
.iter().find(|&&(rn
, _
)| text
.starts_with(rn
)) {
64 text
= &text
[rn
.len()..];
67 cx
.span_err(sp
, "invalid Roman numeral");
68 return DummyResult
::any(sp
);
73 MacEager
::expr(cx
.expr_usize(sp
, total
))
77 pub fn plugin_registrar(reg
: &mut Registry
) {
78 reg
.register_macro("rn", expand_rn
);