Commit Graph

55 Commits

Author SHA1 Message Date
Alex Burka
3cf73f40fb proc_macro: don't panic parsing ..= (fix #47950) 2018-02-06 14:43:01 +00:00
bors
0b90e4e8cd Auto merge of #46551 - jseyfried:improve_legacy_modern_macro_interaction, r=nrc
macros: improve 1.0/2.0 interaction

This PR supports using unhygienic macros from hygienic macros without breaking the latter's hygiene.
```rust
// crate A:
#[macro_export]
macro_rules! m1 { () => {
    f(); // unhygienic: this macro needs `f` in its environment
    fn g() {} // (1) unhygienic: `g` is usable outside the macro definition
} }

// crate B:
#![feature(decl_macro)]
extern crate A;
use A::m1;

macro m2() {
    fn f() {} // (2)
    m1!(); // After this PR, `f()` in the expansion resolves to (2), not (3)
    g(); // After this PR, this resolves to `fn g() {}` from the above expansion.
         // Today, it is a resolution error.
}

fn test() {
    fn f() {} // (3)
    m2!(); // Today, `m2!()` can see (3) even though it should be hygienic.
    fn g() {} // Today, this conflicts with `fn g() {}` from the expansion, even though it should be hygienic.
}
```

Once this PR lands, you can make an existing unhygienic macro hygienic by wrapping it in a hygienic macro. There is an [example](b766fa887d) of this in the tests.

r? @nrc
2018-01-12 10:00:09 +00:00
bors
a9a03d9bfb Auto merge of #47099 - SergioBenitez:master, r=jseyfried
Add 'Span::parent()' and 'Span::source()' to proc_macro API.

As the title suggests: a couple of useful methods for `proc_macro`.
2018-01-06 12:02:36 +00:00
kennytm
5a5b16ad06 Rollup merge of #47150 - dtolnay:join, r=jseyfried
Return None from Span::join if in different files

Fixes #47148. r? @abonander
2018-01-05 17:22:08 +08:00
Sergio Benitez
ab365be140 Add 'Span.parent()' and 'Span.source()' to proc_macro API. 2018-01-03 00:20:33 -08:00
David Tolnay
000e907c1f
Span::resolved_at and Span::located_at to combine behavior of two spans
Proc macro spans serve two mostly unrelated purposes: controlling name
resolution and controlling error messages. It can be useful to mix the
name resolution behavior of one span with the line/column error message
locations of a different span.

In particular, consider the case of a trait brought into scope within
the def_site of a custom derive. I want to invoke trait methods on the
fields of the user's struct. If the field type does not implement the
right trait, I want the error message to underline the corresponding
struct field.

Generating the method call with the def_site span is not ideal -- it
compiles and runs but error messages sadly always point to the derive
attribute like we saw with Macros 1.1.

```
  |
4 | #[derive(HeapSize)]
  |          ^^^^^^^^
```

Generating the method call with the same span as the struct field's
ident or type is not correct -- it shows the right underlines but fails
to resolve to the trait in scope at the def_site.

```
  |
7 |     bad: std:🧵:Thread,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^
```

The correct span for the method call is one that combines the def_site's
name resolution with the struct field's line/column.

```
field.span.resolved_at(Span::def_site())

// equivalently
Span::def_site().located_at(field.span)
```

Adding both because which one is more natural will depend on context.
2018-01-02 23:43:52 -08:00
David Tolnay
2b9add2c16
Return None from Span::join if in different files 2018-01-02 23:37:36 -08:00
Steve Klabnik
1375be833a Rollup merge of #46690 - mystor:pub_line_column, r=jseyfried
Expose the line and column fields from the proc_macro::LineColumn struct

Right now the `LineColumn` struct is pretty useless because the fields are private.

This patch just marks the fields as public, which seems like the easiest solution.
2017-12-15 09:26:58 -05:00
Oliver Schneider
d732da813b
Use PathBuf instead of String where applicable 2017-12-14 11:22:08 +01:00
Jeffrey Seyfried
d052d28d70 Improve interaction between macros 2.0 and macro_rules!. 2017-12-13 13:33:03 -08:00
Nika Layzell
0ccf1af437 Expose the line and column fields from the proc_macro::LineColumn struct 2017-12-12 12:14:54 -05:00
Jeffrey Seyfried
dfa6c25afd Fix hygiene bug. 2017-11-28 18:59:12 -08:00
Jeffrey Seyfried
74cc1fdb52 Rename Span::default -> Span::def_site. 2017-11-14 21:53:37 -08:00
Eduard-Mihai Burtescu
fbcc6733d4 proc_macro: use the proc_macro API at runtime to construct quasi-quoted TokenStream's. 2017-11-09 01:40:04 +02:00
Eduard-Mihai Burtescu
a51c69e2d5 proc_macro: process proc_macro tokens instead of libsyntax ones in the quasi-quoter. 2017-11-09 01:40:04 +02:00
Chris Wong
f108fce21c Make the result of Literal::string() more readable
Closes #45076
2017-10-08 21:44:13 +13:00
Austin Bonander
7be36d2a6d proc_macro::Span API improvements 2017-10-05 17:00:55 -07:00
Alex Burka
e64efc91f4 Add support for ..= syntax
Add ..= to the parser

Add ..= to libproc_macro

Add ..= to ICH

Highlight ..= in rustdoc

Update impl Debug for RangeInclusive to ..=

Replace `...` to `..=` in range docs

Make the dotdoteq warning point to the ...

Add warning for ... in expressions

Updated more tests to the ..= syntax

Updated even more tests to the ..= syntax

Updated the inclusive_range entry in unstable book
2017-09-22 22:05:18 +02:00
Alex Crichton
0694e4fde4 rustc: Forbid interpolated tokens in the HIR
Right now the HIR contains raw `syntax::ast::Attribute` structure but nowadays
these can contain arbitrary tokens. One variant of the `Token` enum is an
"interpolated" token which basically means to shove all the tokens for a
nonterminal in this position. A "nonterminal" in this case is roughly analagous
to a macro argument:

    macro_rules! foo {
        ($a:expr) => {
            // $a is a nonterminal as an expression
        }
    }

Currently nonterminals contain namely items and expressions, and this poses a
problem for incremental compilation! With incremental we want a stable hash of
all HIR items, but this means we may transitively need a stable hash *of the
entire AST*, which is certainly not stable w/ node ids and whatnot. Hence today
there's a "bug" where the "stable hash" of an AST is just the raw hash value of
the AST, and this only arises with interpolated nonterminals. The downside of
this approach, however, is that a bunch of errors get spewed out during
compilation about how this isn't a great idea.

This PR is focused at fixing these warnings, basically deleting them from the
compiler. The implementation here is to alter attributes as they're lowered from
the AST to HIR, expanding all nonterminals in-place as we see them. This code
for expanding a nonterminal to a token stream already exists for the
`proc_macro` crate, so we basically just reuse the same implementation there.

After this PR it's considered a bug to have an `Interpolated` token and hence
the stable hash implementation simply uses `bug!` in this location.

Closes #40946
2017-09-18 17:20:12 -07:00
Alex Crichton
fd4f362b30 Rollup merge of #44125 - SergioBenitez:master, r=nrc
Initial diagnostic API for proc-macros.

This commit introduces the ability to create and emit `Diagnostic` structures from proc-macros, allowing for proc-macro authors to emit warning, error, note, and help messages just like the compiler does.

The API is somewhat based on the diagnostic API already present in `rustc` with several changes that improve usability. The entry point into the diagnostic API is a new `Diagnostic` type which is primarily created through new `error`, `warning`, `help`, and `note` methods on `Span`. The `Diagnostic` type records the diagnostic level, message, and optional `Span` for the top-level diagnostic and contains a `Vec` of all of the child diagnostics. Child diagnostics can be added through builder methods on `Diagnostic`.

A typical use of the API may look like:

```rust
let token = parse_token();
let val = parse_val();

val.span
    .error(format!("expected A but found {}", val))
    .span_note(token.span, "because of this token")
    .help("consider using a different token")
    .emit();
```

cc @jseyfried @nrc @dtolnay @alexcrichton
2017-08-30 11:11:12 -05:00
Vadim Petrochenkov
3da868dcb6 Make fields of Span private 2017-08-30 01:38:54 +03:00
Sergio Benitez
8be132e9d7 Initial diagnostic API for proc-macros.
This commit introduces the ability to create and emit `Diagnostic`
structures from proc-macros, allowing for proc-macro authors to emit
warning, error, note, and help messages just like the compiler does.
2017-08-28 02:58:22 -07:00
Tamir Duberstein
b3f50caee0
*: remove crate_{name,type} attributes
Fixes #41701.
2017-08-25 16:18:21 -04:00
Corey Farwell
99ab3193da Rollup merge of #44016 - steffengy:master, r=alexcrichton
libproc_macro docs: fix brace and bracket mixup

The documentation indicates that brace is `[`.
Brace is mapped token::Brace which (expectedly) is `{`.
So the documentation is simply confusing brace and bracket there.

Even though it's just a very small issue, it can lead to quite some confusion.
2017-08-23 08:44:26 -04:00
Steffen
d46660edc9 libproc_macro docs: fix brace and bracket mixup
the documentation indicates that brace is `[` but maps to token::Brace
which (expectedly) is `{`. Just a little confusion in the docs.
2017-08-21 17:17:27 +02:00
Lukas Kalbertodt
4ba242b7e0 Add PartialEq/Eq impls to proc_macro::{Spacing, Delimiter}
I don't see a reason why those two types shouldn't be tested for equality.
2017-08-20 23:20:34 +02:00
Bastien Orivel
ea5be96bab Fix some more typos, this time words that are duplicated. 2017-08-11 00:31:47 +02:00
Alex Crichton
4886ec8665 syntax: Capture a TokenStream when parsing items
This is then later used by `proc_macro` to generate a new
`proc_macro::TokenTree` which preserves span information. Unfortunately this
isn't a bullet-proof approach as it doesn't handle the case when there's still
other attributes on the item, especially inner attributes.

Despite this the intention here is to solve the primary use case for procedural
attributes, attached to functions as outer attributes, likely bare. In this
situation we should be able to now yield a lossless stream of tokens to preserve
span information.
2017-07-28 10:47:01 -07:00
Alex Crichton
36f2816a1e proc_macro: Use an item's tokens if available
This partly resolves the `FIXME` located in `src/libproc_macro/lib.rs` when
interpreting interpolated tokens. All instances of `ast::Item` which have a list
of tokens attached to them now use that list of tokens to losslessly get
converted into a `TokenTree` instead of going through stringification and losing
span information.

cc #43081
2017-07-28 07:58:20 -07:00
Chris Wong
b525abb7b2 Add #[derive(Clone)] to TokenTreeIter 2017-07-17 20:34:13 +12:00
bors
70cd955277 Auto merge of #43179 - oli-obk:mark_all_the_expansions, r=jseyfried
Reintroduce expansion info for proc macros 1.1

r? @jseyfried
2017-07-15 08:36:27 +00:00
Oliver Schneider
a260baae7e Reintroduce expansion info for proc macros 1.1 2017-07-12 09:47:04 +02:00
Alex Crichton
28ce2924f1 Add isize and usize constructors to Literal
This commit fills out the remaining integer literal constructors on the
`proc_macro::Literal` type with `isize` and `usize`. (I think these were just
left out by accident)
2017-07-06 15:20:01 -07:00
Jeffrey Seyfried
71d4a860a1 Address review comments. 2017-06-26 02:06:34 +00:00
Jeffrey Seyfried
7d493bdd2a Add LazyTokenStream. 2017-06-26 02:06:31 +00:00
Jeffrey Seyfried
e42836b208 Implement quote! and other proc_macro API. 2017-06-26 02:06:26 +00:00
Jeffrey Seyfried
7d41674b17 Clean up tokenstream::Cursor and proc_macro. 2017-06-26 02:05:46 +00:00
Jeffrey Seyfried
d4488b7df9 Simplify hygiene::Mark application, and
remove variant `Token::SubstNt` in favor of `quoted::TokenTree::MetaVar`.
2017-06-26 02:05:45 +00:00
Wonwoo Choi
3cb7825986 Update older URLs pointing to the first edition of the Book
`compiler-plugins.html` is moved into the Unstable Book.
Explanation is slightly modified to match the change.
2017-06-15 00:04:00 +09:00
Oliver Middleton
74ccbec3ac Add doc attributes to proc_macro crate
This adds the same logo and favicon as the rest of the std docs.
2017-03-12 02:54:43 +00:00
Alex Crichton
f846aaf81f rustbuild: Build documentation for proc_macro
This commit fixes #38749 by building documentation for the `proc_macro` crate by
default for configured hosts. Unfortunately did not turn out to be a trivial
fix. Currently rustbuild generates documentation into multiple locations: one
for std, one for test, and one for rustc. The initial fix for this issue simply
actually executed `cargo doc -p proc_macro` which was otherwise completely
elided before.

Unfortunately rustbuild was the left to merge two documentation trees together.
One for the standard library and one for the rustc tree (which only had docs for
the `proc_macro` crate). Rustdoc itself knows how to merge documentation files
(specifically around search indexes, etc) but rustbuild was unaware of this, so
an initial fix ended up destroying the sidebar and the search bar from the
libstd docs.

To solve this issue the method of documentation has been tweaked slightly in
rustbuild. The build system will not use symlinks (or directory junctions on
Windows) to generate all documentation into the same location initially. This'll
rely on rustdoc's logic to weave together all the output and ensure that it ends
up all consistent.

Closes #38749
2017-03-10 13:04:49 -08:00
Jeffrey Seyfried
f6eaaf350e Integrate TokenStream. 2017-03-03 02:15:37 +00:00
Corey Farwell
c883f4f584 Rollup merge of #40129 - abonander:proc_macro_bang, r=jseyfried
Implement function-like procedural macros ( `#[proc_macro]`)

Adds the `#[proc_macro]` attribute, which expects bare functions of the kind `fn(TokenStream) -> TokenStream`, which can be invoked like `my_macro!()`.

cc rust-lang/rfcs#1913, #38356

r? @jseyfried
cc @nrc
2017-03-02 14:53:46 -05:00
Austin Bonander
2fcbb48c72 Implement function-like procedural macros ( #[proc_macro]) 2017-02-28 18:34:22 -08:00
Jeffrey Seyfried
d8b34e9a74 Add syntax::ext::tt::quoted::{TokenTree, ..} and remove tokenstream::TokenTree::Sequence. 2017-02-28 22:14:29 +00:00
Jeffrey Seyfried
2dc60b1180 Refactor TokenStream. 2017-01-22 21:37:38 +00:00
Austin Bonander
f6c0c4837c Refactor proc_macro::TokenStream to use syntax::tokenstream::TokenStream; fix tests for changed semantics 2017-01-15 23:11:50 -08:00
bors
7ac9d337dc Auto merge of #38679 - alexcrichton:always-deny-warnings, r=nrc
Remove not(stage0) from deny(warnings)

Historically this was done to accommodate bugs in lints, but there hasn't been a
bug in a lint since this feature was added which the warnings affected. Let's
completely purge warnings from all our stages by denying warnings in all stages.
This will also assist in tracking down `stage0` code to be removed whenever
we're updating the bootstrap compiler.
2017-01-08 08:22:06 +00:00
Steve Klabnik
3075c1f65e Document custom derive.
These are some bare-bones documentation for custom derive, needed
to stabilize "macros 1.1",
https://github.com/rust-lang/rust/issues/35900

The book chapter is based off of a blog post by @cbreeden,
https://cbreeden.github.io/Macros11/

Normally, we have a policy of not mentioning external crates in
documentation. However, given that syn/quote are basically neccesary
for properly using macros 1.1, I feel that not including them here
would make the documentation very bad. So the rules should be bent
in this instance.
2017-01-04 17:34:30 -05:00
Alex Crichton
045f8f6929 rustc: Stabilize the proc_macro feature
This commit stabilizes the `proc_macro` and `proc_macro_lib` features in the
compiler to stabilize the "Macros 1.1" feature of the language. Many more
details can be found on the tracking issue, #35900.

Closes #35900
2017-01-02 12:13:30 -08:00