@@ -26,7 +26,7 @@ use syntax_pos::{BytePos, Mark, Span, DUMMY_SP};
26
26
use ext:: base;
27
27
use ext:: tt:: { macro_parser, quoted} ;
28
28
use parse:: Directory ;
29
- use parse:: token:: { self , Token } ;
29
+ use parse:: token:: { self , DelimToken , Token } ;
30
30
use print:: pprust;
31
31
use serialize:: { Decoder , Decodable , Encoder , Encodable } ;
32
32
use util:: RcVec ;
@@ -38,7 +38,7 @@ use std::{fmt, iter, mem};
38
38
#[ derive( Clone , PartialEq , RustcEncodable , RustcDecodable , Debug ) ]
39
39
pub struct Delimited {
40
40
/// The type of delimiter
41
- pub delim : token :: DelimToken ,
41
+ pub delim : DelimToken ,
42
42
/// The delimited sequence of token trees
43
43
pub tts : ThinTokenStream ,
44
44
}
@@ -368,8 +368,30 @@ impl TokenStream {
368
368
// This is otherwise the same as `eq_unspanned`, only recursing with a
369
369
// different method.
370
370
pub fn probably_equal_for_proc_macro ( & self , other : & TokenStream ) -> bool {
371
- let mut t1 = self . trees ( ) ;
372
- let mut t2 = other. trees ( ) ;
371
+ // When checking for `probably_eq`, we ignore certain tokens that aren't
372
+ // preserved in the AST. Because they are not preserved, the pretty
373
+ // printer arbitrarily adds or removes them when printing as token
374
+ // streams, making a comparison between a token stream generated from an
375
+ // AST and a token stream which was parsed into an AST more reliable.
376
+ fn semantic_tree ( tree : & TokenTree ) -> bool {
377
+ match tree {
378
+ // The pretty printer tends to add trailing commas to
379
+ // everything, and in particular, after struct fields.
380
+ | TokenTree :: Token ( _, Token :: Comma )
381
+ // The pretty printer emits `NoDelim` as whitespace.
382
+ | TokenTree :: Token ( _, Token :: OpenDelim ( DelimToken :: NoDelim ) )
383
+ | TokenTree :: Token ( _, Token :: CloseDelim ( DelimToken :: NoDelim ) )
384
+ // The pretty printer collapses many semicolons into one.
385
+ | TokenTree :: Token ( _, Token :: Semi )
386
+ // The pretty printer collapses whitespace arbitrarily and can
387
+ // introduce whitespace from `NoDelim`.
388
+ | TokenTree :: Token ( _, Token :: Whitespace ) => false ,
389
+ _ => true
390
+ }
391
+ }
392
+
393
+ let mut t1 = self . trees ( ) . filter ( semantic_tree) ;
394
+ let mut t2 = other. trees ( ) . filter ( semantic_tree) ;
373
395
for ( t1, t2) in t1. by_ref ( ) . zip ( t2. by_ref ( ) ) {
374
396
if !t1. probably_equal_for_proc_macro ( & t2) {
375
397
return false ;
0 commit comments