2616 Commits

Author SHA1 Message Date
klutzy
b33d2fede8 syntax::ast: Remove/Recover tests
`xorpush_test` and `test_marksof` are at `syntax::ast_util`.

Fixes #7952
2014-01-17 13:27:47 +09:00
klutzy
f30a9b3d5b rustc::driver: Capitalize structs and enums
driver::session::crate_metadata is unused; removed.
2014-01-17 13:27:47 +09:00
bors
80a3f453db auto merge of #11151 : sfackler/rust/ext-crate, r=alexcrichton
This is a first pass on support for procedural macros that aren't hardcoded into libsyntax. It is **not yet ready to merge** but I've opened a PR to have a chance to discuss some open questions and implementation issues.

Example
=======
Here's a silly example showing off the basics:

my_synext.rs
```rust
#[feature(managed_boxes, globs, macro_registrar, macro_rules)];

extern mod syntax;

use syntax::ast::{Name, token_tree};
use syntax::codemap::Span;
use syntax::ext::base::*;
use syntax::parse::token;

#[macro_export]
macro_rules! exported_macro (() => (2))

#[macro_registrar]
pub fn macro_registrar(register: |Name, SyntaxExtension|) {
    register(token::intern(&"make_a_1"),
        NormalTT(@SyntaxExpanderTT {
            expander: SyntaxExpanderTTExpanderWithoutContext(expand_make_a_1),
            span: None,
        } as @SyntaxExpanderTTTrait,
        None));
}

pub fn expand_make_a_1(cx: &mut ExtCtxt, sp: Span, tts: &[token_tree]) -> MacResult {
    if !tts.is_empty() {
        cx.span_fatal(sp, "make_a_1 takes no arguments");
    }
    MRExpr(quote_expr!(cx, 1i))
}
```

main.rs:
```rust
#[feature(phase)];

#[phase(syntax)]
extern mod my_synext;

fn main() {
    assert_eq!(1, make_a_1!());
    assert_eq!(2, exported_macro!());
}
```

Overview
=======
Crates that contain syntax extensions need to define a function with the following signature and annotation:
```rust
#[macro_registrar]
pub fn registrar(register: |ast::Name, ext::base::SyntaxExtension|) { ... }
```
that should call the `register` closure with each extension it defines. `macro_rules!` style macros can be tagged with `#[macro_export]` to be exported from the crate as well.

Crates that wish to use externally loadable syntax extensions load them by adding the `#[phase(syntax)]` attribute to an `extern mod`. All extensions registered by the specified crate are loaded with the same scoping rules as `macro_rules!` macros. If you want to use a crate both for syntax extensions and normal linkage, you can use `#[phase(syntax, link)]`.

Open questions
===========
* ~~Does the `macro_crate` syntax make sense? It wraps an entire `extern mod` declaration which looks a bit weird but is nice in the sense that the crate lookup logic can be identical between normal external crates and external macro crates. If the `extern mod` syntax, changes, this will get it for free, etc.~~ Changed to a `phase` attribute.
* ~~Is the magic name `macro_crate_registration` the right way to handle extension registration? It could alternatively be handled by a function annotated with `#[macro_registration]` I guess.~~ Switched to an attribute.
* The crate loading logic lives inside of librustc, which means that the syntax extension infrastructure can't directly access it. I've worked around this by passing a `CrateLoader` trait object from the driver to libsyntax that can call back into the crate loading logic. It should be possible to pull things apart enough that this isn't necessary anymore, but it will be an enormous refactoring project. I think we'll need to create a couple of new libraries: libsynext libmetadata/ty and libmiddle.
* Item decorator extensions can be loaded but the `deriving` decorator itself can't be extended so you'd need to do e.g. `#[deriving_MyTrait] #[deriving(Clone)]` instead of `#[deriving(MyTrait, Clone)]`. Is this something worth bothering with for now?

Remaining work
===========
- [x] ~~There is not yet support for rustdoc downloading and compiling referenced macro crates as it does for other referenced crates. This shouldn't be too hard I think.~~
- [x] ~~This is not testable at stage1 and sketchily testable at stages above that. The stage *n* rustc links against the stage *n-1* libsyntax and librustc. Unfortunately, crates in the test/auxiliary directory link against the stage *n* libstd, libextra, libsyntax, etc. This causes macro crates to fail to properly dynamically link into rustc since names end up being mangled slightly differently. In addition, when rustc is actually installed onto a system, there are actually do copies of libsyntax, libstd, etc: the ones that user code links against and a separate set from the previous stage that rustc itself uses. By this point in the bootstrap process, the two library versions *should probably* be binary compatible, but it doesn't seem like a sure thing. Fixing this is apparently hard, but necessary to properly cross compile as well and is being tracked in #11145.~~ The offending tests are ignored during `check-stage1-rpass` and `check-stage1-cfail`. When we get a snapshot that has this commit, I'll look into how feasible it'll be to get them working on stage1.
- [x] ~~`macro_rules!` style macros aren't being exported. Now that the crate loading infrastructure is there, this should just require serializing the AST of the macros into the crate metadata and yanking them out again, but I'm not very familiar with that part of the compiler.~~
- [x] ~~The `macro_crate_registration` function isn't type-checked when it's loaded. I poked around in the `csearch` infrastructure a bit but didn't find any super obvious ways of checking the type of an item with a certain name. Fixing this may also eliminate the need to `#[no_mangle]` the registration function.~~ Now that the registration function is identified by an attribute, typechecking this will be like typechecking other annotated functions.
- [x] ~~The dynamic libraries that are loaded are never unloaded. It shouldn't require too much work to tie the lifetime of the `DynamicLibrary` object to the `MapChain` that its extensions are loaded into.~~
- [x] ~~The compiler segfaults sometimes when loading external crates. The `DynamicLibrary` reference and code objects from that library are both put into the same hash table. When the table drops, due to the random ordering the library sometimes drops before the objects do. Once #11228 lands it'll be easy to fix this.~~
2014-01-16 16:36:53 -08:00
Steven Fackler
328b47d837 Load macros from external modules 2014-01-16 15:01:48 -08:00
bors
9434e7c6cb auto merge of #11599 : sanxiyn/rust/accurate-span-3, r=luqmana 2014-01-16 09:01:49 -08:00
Seo Sanghyeon
1f5dc552d6 Correct span for ExprCall and ExprIndex 2014-01-16 22:45:01 +09:00
bors
793f740c0a auto merge of #11575 : pcwalton/rust/parse-substrs, r=alexcrichton
This was used by the quasiquoter.

r? @alexcrichton
2014-01-15 21:51:42 -08:00
Niko Matsakis
419ac4a1b8 Issue #3511 - Rationalize temporary lifetimes.
Major changes:

- Define temporary scopes in a syntax-based way that basically defaults
  to the innermost statement or conditional block, except for in
  a `let` initializer, where we default to the innermost block. Rules
  are documented in the code, but not in the manual (yet).
  See new test run-pass/cleanup-value-scopes.rs for examples.
- Refactors Datum to better define cleanup roles.
- Refactor cleanup scopes to not be tied to basic blocks, permitting
  us to have a very large number of scopes (one per AST node).
- Introduce nascent documentation in trans/doc.rs covering datums and
  cleanup in a more comprehensive way.
2014-01-15 18:34:38 -05:00
Patrick Walton
ff6c0af15b libsyntax: Remove the obsolete ability to parse from substrings.
This was used by the quasiquoter.
2014-01-15 10:59:48 -08:00
Daniel Micay
197fe67e11 register snapshots 2014-01-15 08:22:56 -05:00
bors
9075025c7b auto merge of #11485 : eddyb/rust/sweep-old-rust, r=nikomatsakis 2014-01-14 12:32:11 -08:00
Patrick Walton
119c6141f5 librustc: Remove @ pointer patterns from the language 2014-01-13 14:45:21 -08:00
Patrick Walton
ce358fca33 libsyntax: Make managed box @ patterns obsolete 2014-01-13 13:11:01 -08:00
Brian Anderson
46905c04f5 Bump version to 0.10-pre 2014-01-12 17:45:22 -08:00
Eduard Burtescu
509fc92a9b Removed remnants of @mut and ~mut from comments and the type system. 2014-01-12 02:26:04 +02:00
bors
54a85d4d67 auto merge of #11480 : SiegeLord/rust/float_base, r=cmr
This fixes the incorrect lexing of things like:

~~~rust
let b = 0o2f32;
let d = 0o4e6;
let f = 0o6e6f32;
~~~

and brings the float literal lexer in line with the description of the float literals in the manual.
2014-01-11 16:21:24 -08:00
bors
68ebe8141a auto merge of #11477 : adridu59/rust/bug-report, r=cmr
Mostly cleanups for doc and READMEs. Fixes the bug reporting link.
2014-01-11 15:01:32 -08:00
SiegeLord
5ea6d0201d Tighten up float literal lexing.
Specifically, dissallow setting the number base for every type of float
literal, not only those that contain the decimal point. This is in line with
the description in the manual.
2014-01-11 14:21:59 -05:00
Adrien Tétar
a30d61b05a Various READMEs and docs cleanup
Noticeably closes #11428.
2014-01-11 19:41:31 +01:00
bors
4bdda359c3 auto merge of #11252 : eddyb/rust/ty-cleanup, r=pcwalton 2014-01-11 07:31:40 -08:00
Eduard Burtescu
5ad2a7825b Removed obsolete 'e' prefix on ty_evec and ty_estr. 2014-01-11 16:40:23 +02:00
bors
99df8a3f15 auto merge of #11463 : brson/rust/envcaps, r=huonw
Death to caps.
2014-01-11 06:11:22 -08:00
bors
a34727f276 auto merge of #11416 : bjz/rust/remove-print-fns, r=alexcrichton
The `print!` and `println!` macros are now the preferred method of printing, and so there is no reason to export the `stdio` functions in the prelude. The functions have also been replaced by their macro counterparts in the tutorial and other documentation so that newcomers don't get confused about what they should be using.
2014-01-10 18:21:21 -08:00
Brian Anderson
cdc44940b7 syntax: Fix capitalization in macro_parser errors 2014-01-10 18:06:35 -08:00
Brian Anderson
60e096a43f rustc: Fix formatting of env! error message
Death to caps.
2014-01-10 17:57:02 -08:00
Brendan Zabarauskas
4fc0452ace Remove re-exports of std::io::stdio::{print, println} in the prelude.
The `print!` and `println!` macros are now the preferred method of printing, and so there is no reason to export the `stdio` functions in the prelude. The functions have also been replaced by their macro counterparts in the tutorial and other documentation so that newcomers don't get confused about what they should be using.
2014-01-11 10:46:00 +11:00
Nick Cameron
40d8a12b68 item_impl holds an Option<> to the trait ref, not a list of trait refs. Therefore, we should not iterate over it. 2014-01-10 17:54:12 +13:00
bors
ff3d5d4603 auto merge of #11055 : pcwalton/rust/placement-box, r=pcwalton
r? @nikomatsakis
2014-01-09 16:11:18 -08:00
Patrick Walton
e12711540a librustc: Implement placement box for GC and unique pointers. 2014-01-09 16:05:34 -08:00
Eduard Burtescu
6b221768cf libsyntax: Renamed types, traits and enum variants to CamelCase. 2014-01-09 22:25:28 +02:00
bors
dd11fe17c7 auto merge of #11414 : nick29581/rust/span, r=alexcrichton
...at the start of the path, rather than at the start of the view_path.

Fixes #11317
2014-01-09 07:41:33 -08:00
bors
ab9ec6d59a auto merge of #11402 : bjz/rust/remove-approx, r=alexcrichton
This trait seems to stray too far from the mandate of a standard library as implementations may vary between use cases. Third party libraries should implement their own if they need something like it.

This closes #5316.

r? @alexcrichton, @pcwalton
2014-01-09 05:06:33 -08:00
Alex Crichton
6df57ec2e2 Remove the io::Decorator trait
This is just an unnecessary trait that no one's ever going to parameterize over
and it's more useful to just define the methods directly on the types
themselves. The implementors of this type almost always don't want
inner_mut_ref() but they're forced to define it as well.
2014-01-08 23:42:28 -08:00
Nick Cameron
01f42eed80 Start the span for a path in a view_path at the correct place (at the start of the path, rather than at the start of the view_path). 2014-01-09 20:12:23 +13:00
Brendan Zabarauskas
ceea85a148 Remove ApproxEq and assert_approx_eq!
This trait seems to stray too far from the mandate of a standard library as implementations may vary between use cases.
2014-01-09 15:41:46 +11:00
bors
97005c0068 auto merge of #11401 : michaelwoerister/rust/issue11322, r=alexcrichton
`expand_include_str()` in libsyntax seems to have corrupted the CodeMap by always setting the BytePos of any included files to zero. It now uses `CodeMap::new_filemap()` which should set everything properly. This should fix issue #11322 but I don't want to close it before I have confirmation from the reporters that the problem is indeed fixed.
2014-01-08 11:26:30 -08:00
bors
430652c970 auto merge of #11370 : alexcrichton/rust/issue-10465, r=pwalton
Turned out to be a 2-line fix, but the compiler fallout was huge.
2014-01-08 10:06:45 -08:00
Michael Woerister
ad3a179954 Fix CodeMap issue in expand_include_str() 2014-01-08 16:38:58 +01:00
bors
464d1d044e auto merge of #11405 : huonw/rust/moredocs, r=huonw
Various documentation changes, change the 'borrowed pointer' terminology to 'reference', fix a problem with 'make dist' on windows.
2014-01-08 07:26:41 -08:00
Alex Crichton
0547fb9cad Fixup the rest of the tests in the compiler 2014-01-07 23:51:38 -08:00
Alex Crichton
c4d36b85a0 Fix remaining cases of leaking imports 2014-01-07 23:51:38 -08:00
Brian Anderson
2d8dd6afd4 doc: Add rustc and syntax to the index 2014-01-07 21:23:26 -08:00
Brian Anderson
d323632669 'borrowed pointer' -> 'reference' 2014-01-07 18:49:13 -08:00
Marvin Löbel
90b394514d Renamed Option::map_default and mutate_default to map_or and mutate_or_set 2014-01-08 00:53:40 +01:00
bors
bae091e517 auto merge of #11332 : sfackler/rust/de-at-se, r=huonw
This is necessary for #11151 to make sure dtors run before the libraries
are unloaded.
2014-01-06 07:26:48 -08:00
Eduard Burtescu
3119d18e55 Disowned the Visitor. 2014-01-06 14:00:46 +02:00
Steven Fackler
bb49916d21 Use ~-objects instead of @-objects for syntax exts
This is necessary for #11151 to make sure dtors run before the libraries
are unloaded.
2014-01-05 18:02:57 -08:00
bors
4641287628 auto merge of #11314 : adridu59/rust/patch-license, r=brson
- don't check for an hardcoded copyright claim year, check the 2 surrounding strings instead
- logic: if either the `//` or `#`-style copyright patterns are found, don't invalidate
- cleanup hardcoded content and streamline the few files with different line breaks

r? @brson
2014-01-04 21:31:51 -08:00
Brian Anderson
3b1862a82f Don't allow newtype structs to be dereferenced. #6246 2014-01-04 14:44:12 -08:00
Adrien Tétar
24f9a93872 etc: licenseck: don't hardcode a specific year 2014-01-04 21:49:52 +01:00