Fallout in libsyntax/librustc: use newtype'd options for linked lists,
since `Option` is not fundamental and hence the old impls run afoul of the orphan rules.
This commit is contained in:
parent
30b2d9e764
commit
15b58fedca
@ -34,8 +34,7 @@ use std::io::prelude::*;
|
||||
use std::io::{Cursor, SeekFrom};
|
||||
use syntax::abi;
|
||||
use syntax::ast::{self, DefId, NodeId};
|
||||
use syntax::ast_map::{PathElem, PathElems};
|
||||
use syntax::ast_map;
|
||||
use syntax::ast_map::{self, LinkedPath, PathElem, PathElems};
|
||||
use syntax::ast_util::*;
|
||||
use syntax::ast_util;
|
||||
use syntax::attr;
|
||||
@ -1513,7 +1512,7 @@ fn encode_info_for_items(ecx: &EncodeContext,
|
||||
&krate.module,
|
||||
&[],
|
||||
ast::CRATE_NODE_ID,
|
||||
[].iter().cloned().chain(None),
|
||||
[].iter().cloned().chain(LinkedPath::empty()),
|
||||
syntax::parse::token::special_idents::invalid,
|
||||
ast::Public);
|
||||
|
||||
@ -1874,7 +1873,7 @@ fn encode_misc_info(ecx: &EncodeContext,
|
||||
}
|
||||
|
||||
// Encode reexports for the root module.
|
||||
encode_reexports(ecx, rbml_w, 0, [].iter().cloned().chain(None));
|
||||
encode_reexports(ecx, rbml_w, 0, [].iter().cloned().chain(LinkedPath::empty()));
|
||||
|
||||
rbml_w.end_tag();
|
||||
rbml_w.end_tag();
|
||||
|
@ -53,18 +53,29 @@ impl fmt::Display for PathElem {
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct LinkedPathNode<'a> {
|
||||
pub struct LinkedPathNode<'a> {
|
||||
node: PathElem,
|
||||
next: LinkedPath<'a>,
|
||||
}
|
||||
|
||||
type LinkedPath<'a> = Option<&'a LinkedPathNode<'a>>;
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct LinkedPath<'a>(Option<&'a LinkedPathNode<'a>>);
|
||||
|
||||
impl<'a> LinkedPath<'a> {
|
||||
pub fn empty() -> LinkedPath<'a> {
|
||||
LinkedPath(None)
|
||||
}
|
||||
|
||||
pub fn from(node: &'a LinkedPathNode) -> LinkedPath<'a> {
|
||||
LinkedPath(Some(node))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iterator for LinkedPath<'a> {
|
||||
type Item = PathElem;
|
||||
|
||||
fn next(&mut self) -> Option<PathElem> {
|
||||
match *self {
|
||||
match self.0 {
|
||||
Some(node) => {
|
||||
*self = node.next;
|
||||
Some(node.node)
|
||||
@ -384,7 +395,7 @@ impl<'ast> Map<'ast> {
|
||||
pub fn with_path<T, F>(&self, id: NodeId, f: F) -> T where
|
||||
F: FnOnce(PathElems) -> T,
|
||||
{
|
||||
self.with_path_next(id, None, f)
|
||||
self.with_path_next(id, LinkedPath::empty(), f)
|
||||
}
|
||||
|
||||
pub fn path_to_string(&self, id: NodeId) -> String {
|
||||
@ -422,7 +433,7 @@ impl<'ast> Map<'ast> {
|
||||
_ => f([].iter().cloned().chain(next))
|
||||
}
|
||||
} else {
|
||||
self.with_path_next(parent, Some(&LinkedPathNode {
|
||||
self.with_path_next(parent, LinkedPath::from(&LinkedPathNode {
|
||||
node: self.get_path_elem(id),
|
||||
next: next
|
||||
}), f)
|
||||
|
Loading…
x
Reference in New Issue
Block a user