|
14 | 14 | //! ownership of the original.
|
15 | 15 |
|
16 | 16 | use std::borrow::Cow;
|
| 17 | +use std::hash::Hash; |
17 | 18 | use std::{cmp, fmt, iter};
|
18 | 19 |
|
19 | 20 | use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
20 | 21 | use rustc_data_structures::sync::{self, Lrc};
|
21 | 22 | use rustc_macros::{Decodable, Encodable, HashStable_Generic};
|
22 |
| -use rustc_serialize::{Decodable, Encodable}; |
| 23 | +use rustc_serialize::{Decodable, Encodable, Encoder}; |
| 24 | +use rustc_span::def_id::{CrateNum, DefIndex}; |
23 | 25 | use rustc_span::{sym, Span, SpanDecoder, SpanEncoder, Symbol, DUMMY_SP};
|
24 | 26 |
|
25 | 27 | use crate::ast::{AttrStyle, StmtKind};
|
@@ -139,8 +141,10 @@ impl fmt::Debug for LazyAttrTokenStream {
|
139 | 141 | }
|
140 | 142 |
|
141 | 143 | impl<S: SpanEncoder> Encodable<S> for LazyAttrTokenStream {
|
142 |
| - fn encode(&self, _s: &mut S) { |
143 |
| - panic!("Attempted to encode LazyAttrTokenStream"); |
| 144 | + fn encode(&self, s: &mut S) { |
| 145 | + // TODO: welp |
| 146 | + // TODO: (also) `.flattened()` here? |
| 147 | + self.to_attr_token_stream().encode(s) |
144 | 148 | }
|
145 | 149 | }
|
146 | 150 |
|
@@ -296,6 +300,96 @@ pub struct AttrsTarget {
|
296 | 300 | #[derive(Clone, Debug, Default, Encodable, Decodable)]
|
297 | 301 | pub struct TokenStream(pub(crate) Lrc<Vec<TokenTree>>);
|
298 | 302 |
|
| 303 | +struct HashEncoder<H: std::hash::Hasher> { |
| 304 | + hasher: H, |
| 305 | +} |
| 306 | + |
| 307 | +impl<H: std::hash::Hasher> Encoder for HashEncoder<H> { |
| 308 | + fn emit_usize(&mut self, v: usize) { |
| 309 | + self.hasher.write_usize(v) |
| 310 | + } |
| 311 | + |
| 312 | + fn emit_u128(&mut self, v: u128) { |
| 313 | + self.hasher.write_u128(v) |
| 314 | + } |
| 315 | + |
| 316 | + fn emit_u64(&mut self, v: u64) { |
| 317 | + self.hasher.write_u64(v) |
| 318 | + } |
| 319 | + |
| 320 | + fn emit_u32(&mut self, v: u32) { |
| 321 | + self.hasher.write_u32(v) |
| 322 | + } |
| 323 | + |
| 324 | + fn emit_u16(&mut self, v: u16) { |
| 325 | + self.hasher.write_u16(v) |
| 326 | + } |
| 327 | + |
| 328 | + fn emit_u8(&mut self, v: u8) { |
| 329 | + self.hasher.write_u8(v) |
| 330 | + } |
| 331 | + |
| 332 | + fn emit_isize(&mut self, v: isize) { |
| 333 | + self.hasher.write_isize(v) |
| 334 | + } |
| 335 | + |
| 336 | + fn emit_i128(&mut self, v: i128) { |
| 337 | + self.hasher.write_i128(v) |
| 338 | + } |
| 339 | + |
| 340 | + fn emit_i64(&mut self, v: i64) { |
| 341 | + self.hasher.write_i64(v) |
| 342 | + } |
| 343 | + |
| 344 | + fn emit_i32(&mut self, v: i32) { |
| 345 | + self.hasher.write_i32(v) |
| 346 | + } |
| 347 | + |
| 348 | + fn emit_i16(&mut self, v: i16) { |
| 349 | + self.hasher.write_i16(v) |
| 350 | + } |
| 351 | + |
| 352 | + fn emit_raw_bytes(&mut self, s: &[u8]) { |
| 353 | + self.hasher.write(s) |
| 354 | + } |
| 355 | +} |
| 356 | + |
| 357 | +impl<H: std::hash::Hasher> SpanEncoder for HashEncoder<H> { |
| 358 | + fn encode_span(&mut self, span: Span) { |
| 359 | + span.hash(&mut self.hasher) |
| 360 | + } |
| 361 | + |
| 362 | + fn encode_symbol(&mut self, symbol: Symbol) { |
| 363 | + symbol.hash(&mut self.hasher) |
| 364 | + } |
| 365 | + |
| 366 | + fn encode_expn_id(&mut self, expn_id: rustc_span::ExpnId) { |
| 367 | + expn_id.hash(&mut self.hasher) |
| 368 | + } |
| 369 | + |
| 370 | + fn encode_syntax_context(&mut self, syntax_context: rustc_span::SyntaxContext) { |
| 371 | + syntax_context.hash(&mut self.hasher) |
| 372 | + } |
| 373 | + |
| 374 | + fn encode_crate_num(&mut self, crate_num: CrateNum) { |
| 375 | + crate_num.hash(&mut self.hasher) |
| 376 | + } |
| 377 | + |
| 378 | + fn encode_def_index(&mut self, def_index: DefIndex) { |
| 379 | + def_index.hash(&mut self.hasher) |
| 380 | + } |
| 381 | + |
| 382 | + fn encode_def_id(&mut self, def_id: rustc_span::def_id::DefId) { |
| 383 | + def_id.hash(&mut self.hasher) |
| 384 | + } |
| 385 | +} |
| 386 | + |
| 387 | +impl Hash for TokenStream { |
| 388 | + fn hash<H: std::hash::Hasher>(&self, state: &mut H) { |
| 389 | + Encodable::encode(self, &mut HashEncoder { hasher: state }); |
| 390 | + } |
| 391 | +} |
| 392 | + |
299 | 393 | /// Indicates whether a token can join with the following token to form a
|
300 | 394 | /// compound token. Used for conversions to `proc_macro::Spacing`. Also used to
|
301 | 395 | /// guide pretty-printing, which is where the `JointHidden` value (which isn't
|
|
0 commit comments