Commit graph

587 commits

Author SHA1 Message Date
Yuki Okushi
d19294feee Add new literal type Err 2019-01-16 09:27:43 +09:00
Mark Rousskov
2a663555dd Remove licenses 2018-12-25 21:08:33 -07:00
Vadim Petrochenkov
f756257fb7 Do not interpret mismatches from pretty-printed $crate as token stream invalidation 2018-12-19 23:17:54 +03:00
kennytm
dadf7fcc2d
Rollup merge of #56699 - nnethercote:SymbolIndex, r=oli-obk
Use a `newtype_index!` within `Symbol`.

This shrinks `Option<Symbol>` from 8 bytes to 4 bytes, which shrinks
`Token` from 24 bytes to 16 bytes. This reduces instruction counts by up
to 1% across a range of benchmarks.

r? @oli-obk
2018-12-14 22:10:09 +08:00
Nicholas Nethercote
0f68749260 Use a newtype_index! within Symbol.
This shrinks `Option<Symbol>` from 8 bytes to 4 bytes, which shrinks
`Token` from 24 bytes to 16 bytes. This reduces instruction counts by up
to 1% across a range of benchmarks.
2018-12-12 08:38:08 +11:00
Nicholas Nethercote
1fe2c03240 Remove tokenstream::Delimited.
Because it's an extra type layer that doesn't really help; in a couple
of places it actively gets in the way, and overall removing it makes the
code nicer. It does, however, move `tokenstream::TokenTree` further away
from the `TokenTree` in `quote.rs`.

More importantly, this change reduces the size of `TokenStream` from 48
bytes to 40 bytes on x86-64, which is enough to slightly reduce
instruction counts on numerous benchmarks, the best by 1.5%.

Note that `open_tt` and `close_tt` have gone from being methods on
`Delimited` to associated methods of `TokenTree`.
2018-12-10 12:10:10 +11:00
Alexander Regueiro
ee89c088b0 Various minor/cosmetic improvements to code 2018-12-07 23:53:34 +00:00
Matthew Russo
88130f1796 updates all Filename variants to take a fingerprint 2018-12-04 17:24:12 -05:00
yui-knk
96bf06baf3 Remove not used DotEq token
Currently libproc_macro does not use `DotEq` token.
https://github.com/rust-lang/rust/pull/49545 changed libproc_macro
to not generate `DotEq` token.
2018-12-02 23:11:08 +09:00
Sergio Benitez
78eb516dda Ignore non-semantic tokens for 'probably_eq' streams. 2018-11-16 23:37:23 -08:00
Nicholas Nethercote
c6862992d9 Change Lit::short_name to Lit::literal_name.
This avoids a moderately hot allocation in `parse_lit_token`.
2018-11-12 15:16:03 +11:00
varkor
cb594cf373 Treat dyn as a keyword in the 2018 edition 2018-09-16 23:34:42 +01:00
David Tolnay
a1dd39e724
Track distinct spans for open and close delimiter 2018-09-08 19:01:48 -07:00
Matthew Tran
3d44da65cd Enable macros to pass $:literal to another macro 2018-08-05 11:02:59 -05:00
Taylor Cramer
f685142f86 async can begin expressions 2018-08-01 09:50:15 -07:00
Alex Crichton
53323751a9 proc_macro: Preserve spans of attributes on functions
This commit updates the tokenization of items which are subsequently passed to
`proc_macro` to ensure that span information is preserved on attributes as much
as possible. Previously this area of the code suffered from #43081 where we
haven't actually implemented converting an attribute to to a token tree yet, but
a local fix was possible here.

Closes #47941
2018-07-19 07:06:44 -07:00
Vadim Petrochenkov
5987fe8f75 Remove most of Hash impls from AST and HIR structures 2018-07-14 14:57:14 +03:00
Vadim Petrochenkov
4d1a30c92b Remove most of PartialEq impls from AST and HIR structures 2018-07-14 14:56:57 +03:00
Mark Simulacrum
60058e5dbe Crate-ify and delete unused code in syntax::parse 2018-06-09 16:57:19 -06:00
Crazycolorz5
a5dc83d970 Tidy fixes. 2018-06-04 22:25:01 -04:00
Crazycolorz5
7a9ffa7307 Added is_like_plus to token, and used that in place of equality comparison to Plus token. 2018-06-04 22:25:00 -04:00
Vadim Petrochenkov
1e4269cb83 Add Ident::as_str helper 2018-05-26 15:20:23 +03:00
kennytm
aa63dce256
Rollup merge of #50946 - alexcrichton:fix-parse-lifetime, r=petrochenkov
rustc: Fix procedural macros generating lifetime tokens

This commit fixes an accidental regression from #50473 where lifetime tokens
produced by procedural macros ended up getting lost in translation in the
compiler and not actually producing parseable code. The issue lies in the fact
that a lifetime's `Ident` is prefixed with `'`. The `glue` implementation for
gluing joint tokens together forgot to take this into account so the lifetime
inside of `Ident` was missing the leading tick!

The `glue` implementation here is updated to create a new `Symbol` in these
situations to manufacture a new `Ident` with a leading tick to ensure it parses
correctly.

Closes #50942
2018-05-23 00:26:18 +08:00
Alex Crichton
3b8f791bf6 rustc: Fix procedural macros generating lifetime tokens
This commit fixes an accidental regression from #50473 where lifetime tokens
produced by procedural macros ended up getting lost in translation in the
compiler and not actually producing parseable code. The issue lies in the fact
that a lifetime's `Ident` is prefixed with `'`. The `glue` implementation for
gluing joint tokens together forgot to take this into account so the lifetime
inside of `Ident` was missing the leading tick!

The `glue` implementation here is updated to create a new `Symbol` in these
situations to manufacture a new `Ident` with a leading tick to ensure it parses
correctly.

Closes #50942
2018-05-21 09:35:15 -07:00
Alex Crichton
0ee031ab96 rustc: Fix joint-ness of stringified token-streams
This commit fixes `StringReader`'s parsing of tokens which have been stringified
through procedural macros. Whether or not a token tree is joint is defined by
span information, but when working with procedural macros these spans are often
dummy and/or overridden which means that they end up considering all operators
joint if they can!

The fix here is to track the raw source span as opposed to the overridden span.
With this information we can more accurately classify `Punct` structs as either
joint or not.

Closes #50700
2018-05-18 10:36:24 -07:00
Vadim Petrochenkov
c4352ff198 Turn some functions from token.rs into methods on Ident 2018-05-17 23:13:09 +03:00
Vadim Petrochenkov
f89e356245 Add two keywords specific to editions 2015 and 2018 respectively 2018-05-17 23:13:09 +03:00
Vadim Petrochenkov
c106125431 Represent lifetimes as two joint tokens in proc macros 2018-05-15 23:54:08 +03:00
Dan Aloni
37ed2ab910 Macros: Add a 'literal' fragment specifier
Implements RFC 1576.

See: https://github.com/rust-lang/rfcs/blob/master/text/1576-macros-literal-matcher.md

Changes are mostly in libsyntax, docs, and tests. Feature gate is
enabled for 1.27.0.

Many thanks to Vadim Petrochenkov for following through code reviews
and suggestions.

Example:

````rust

macro_rules! test_literal {
    ($l:literal) => {
        println!("literal: {}", $l);
    };
    ($e:expr) => {
        println!("expr: {}", $e);
    };
}

fn main() {
    let a = 1;
    test_literal!(a);
    test_literal!(2);
    test_literal!(-3);
}
```

Output:

```
expr: 1
literal: 2
literal: -3
```
2018-05-13 19:17:02 +03:00
est31
40f2ca2c95 'label can start expressions
let foo = 'label: loop { break 'label 42; };

is valid Rust code.
2018-04-23 11:17:59 +02:00
Alex Crichton
e9348738fc proc_macro: Stay on the "use the cache" path more
Discovered in #50061 we're falling off the "happy path" of using a stringified
token stream more often than we should. This was due to the fact that a
user-written token like `0xf` is equality-different from the stringified token
of `15` (despite being semantically equivalent).

This patch updates the call to `eq_unspanned` with an even more awful solution,
`probably_equal_for_proc_macro`, which ignores the value of each token and
basically only compares the structure of the token stream, assuming that the AST
doesn't change just one token at a time.

While this is a step towards fixing #50061 there is still one regression
from #49154 which needs to be fixed.
2018-04-18 19:36:48 -07:00
bors
3dfda16525 Auto merge of #49993 - nnethercote:shrink-Token, r=alexcrichton
Change the hashcounts in raw `Lit` variants from usize to u16.

This reduces the size of `Token` from 32 bytes to 24 bytes on 64-bit
platforms.
2018-04-18 14:44:54 +00:00
kennytm
95b7e6fe92
Rollup merge of #49852 - alexcrichton:fix-more-proc-macros, r=nrc
proc_macro: Avoid cached TokenStream more often

This commit adds even more pessimization to use the cached `TokenStream` inside
of an AST node. As a reminder the `proc_macro` API requires taking an arbitrary
AST node and transforming it back into a `TokenStream` to hand off to a
procedural macro. Such functionality isn't actually implemented in rustc today,
so the way `proc_macro` works today is that it stringifies an AST node and then
reparses for a list of tokens.

This strategy unfortunately loses all span information, so we try to avoid it
whenever possible. Implemented in #43230 some AST nodes have a `TokenStream`
cache representing the tokens they were originally parsed from. This
`TokenStream` cache, however, has turned out to not always reflect the current
state of the item when it's being tokenized. For example `#[cfg]` processing or
macro expansion could modify the state of an item. Consequently we've seen a
number of bugs (#48644 and #49846) related to using this stale cache.

This commit tweaks the usage of the cached `TokenStream` to compare it to our
lossy stringification of the token stream. If the tokens that make up the cache
and the stringified token stream are the same then we return the cached version
(which has correct span information). If they differ, however, then we will
return the stringified version as the cache has been invalidated and we just
haven't figured that out.

Closes #48644
Closes #49846
2018-04-14 15:21:19 +08:00
Vadim Petrochenkov
7e1f73beb6 macros: Do not match on "complex" nonterminals requiring AST comparisons 2018-04-14 02:28:39 +03:00
Nicholas Nethercote
4d34bfd00a Change the hashcounts in raw Lit variants from usize to u16.
This reduces the size of `Token` from 32 bytes to 24 bytes on 64-bit
platforms.
2018-04-12 20:12:42 +10:00
Alex Crichton
6d7cfd4f1a proc_macro: Avoid cached TokenStream more often
This commit adds even more pessimization to use the cached `TokenStream` inside
of an AST node. As a reminder the `proc_macro` API requires taking an arbitrary
AST node and transforming it back into a `TokenStream` to hand off to a
procedural macro. Such functionality isn't actually implemented in rustc today,
so the way `proc_macro` works today is that it stringifies an AST node and then
reparses for a list of tokens.

This strategy unfortunately loses all span information, so we try to avoid it
whenever possible. Implemented in #43230 some AST nodes have a `TokenStream`
cache representing the tokens they were originally parsed from. This
`TokenStream` cache, however, has turned out to not always reflect the current
state of the item when it's being tokenized. For example `#[cfg]` processing or
macro expansion could modify the state of an item. Consequently we've seen a
number of bugs (#48644 and #49846) related to using this stale cache.

This commit tweaks the usage of the cached `TokenStream` to compare it to our
lossy stringification of the token stream. If the tokens that make up the cache
and the stringified token stream are the same then we return the cached version
(which has correct span information). If they differ, however, then we will
return the stringified version as the cache has been invalidated and we just
haven't figured that out.

Closes #48644
Closes #49846
2018-04-10 13:05:13 -07:00
bors
67712d7945 Auto merge of #49390 - Zoxc:sync-syntax, r=michaelwoerister
More thread-safety changes

r? @michaelwoerister
2018-04-10 09:00:27 +00:00
Zack M. Davis
ba0dd8eb02 in which ! is suggested for erroneous identifier not
Impressing confused Python users with magical diagnostics is perhaps
worth this not-grossly-unreasonable (only 40ish lines) extra complexity
in the parser?

Thanks to Vadim Petrochenkov for guidance.

This resolves #46836.
2018-04-09 08:45:12 -07:00
Vadim Petrochenkov
bfaf4180ae Make lifetime nonterminals closer to identifier nonterminals 2018-04-06 11:52:16 +03:00
Vadim Petrochenkov
b3b5ef186c Remove more duplicated spans 2018-04-06 11:50:49 +03:00
Vadim Petrochenkov
e2afefd80b Get rid of SpannedIdent 2018-04-06 11:48:19 +03:00
Austin Bonander
5d74990ceb expand macro invocations in extern {} blocks 2018-04-03 13:16:11 -07:00
John Kåre Alsaker
11ccc4cac6 Make LazyTokenStream thread-safe 2018-03-28 01:27:58 +02:00
Vadim Petrochenkov
a637dd00c8 Fix pretty-printing for raw identifiers 2018-03-27 00:07:16 +03:00
Lymia Aluysia
bfb94ac5f4
Clean up raw identifier handling when recovering tokens from AST. 2018-03-22 10:34:51 -05:00
Lymia Aluysia
5c3d6320de
Return a is_raw parameter from Token::ident rather than having separate methods. 2018-03-18 12:16:02 -05:00
Lymia Aluysia
fad1648e0f
Initial implementation of RFC 2151, Raw Identifiers 2018-03-18 10:07:19 -05:00
bors
5e3ecdce4e Auto merge of #48917 - petrochenkov:import, r=oli-obk
syntax: Make imports in AST closer to the source and cleanup their parsing

This is a continuation of https://github.com/rust-lang/rust/pull/45846 in some sense.
2018-03-18 01:50:52 +00:00
Vadim Petrochenkov
e5fb13897d AST: Keep distinction between path and ::path in imports and visibilities
Add the root segment for name resolution purposes only
2018-03-17 22:12:21 +03:00
Vadim Petrochenkov
5d06c890fe syntax: Make _ an identifier 2018-03-17 22:08:07 +03:00