use symbol::Symbol;
use tokenstream::{TokenStream, TokenTree};
+use std::borrow::Cow;
use std::collections::HashMap;
use std::collections::hash_map::Entry;
}
let directory = Directory {
- path: cx.current_expansion.module.directory.clone(),
+ path: Cow::from(cx.current_expansion.module.directory.as_path()),
ownership: cx.current_expansion.directory_ownership,
};
let mut p = Parser::new(cx.parse_sess(), tts, Some(directory), true, false);
use tokenstream::{TokenStream, TokenTree};
use diagnostics::plugin::ErrorMap;
+use std::borrow::Cow;
use std::collections::HashSet;
use std::iter;
use std::path::{Path, PathBuf};
}
#[derive(Clone)]
-pub struct Directory {
- pub path: PathBuf,
+pub struct Directory<'a> {
+ pub path: Cow<'a, Path>,
pub ownership: DirectoryOwnership,
}
use symbol::{Symbol, keywords};
use util::ThinVec;
+use std::borrow::Cow;
use std::cmp;
use std::mem;
use std::path::{self, Path, PathBuf};
prev_token_kind: PrevTokenKind,
pub restrictions: Restrictions,
/// Used to determine the path to externally loaded source files
- pub directory: Directory,
+ pub directory: Directory<'a>,
/// Whether to parse sub-modules in other files.
pub recurse_into_file_modules: bool,
/// Name of the root module this parser originated from. If `None`, then the
impl<'a> Parser<'a> {
pub fn new(sess: &'a ParseSess,
tokens: TokenStream,
- directory: Option<Directory>,
+ directory: Option<Directory<'a>>,
recurse_into_file_modules: bool,
desugar_doc_comments: bool)
-> Self {
restrictions: Restrictions::empty(),
recurse_into_file_modules,
directory: Directory {
- path: PathBuf::new(),
+ path: Cow::from(PathBuf::new()),
ownership: DirectoryOwnership::Owned { relative: None }
},
root_module_name: None,
if let Some(directory) = directory {
parser.directory = directory;
} else if !parser.span.source_equal(&DUMMY_SP) {
- if let FileName::Real(path) = sess.codemap().span_to_unmapped_path(parser.span) {
- parser.directory.path = path;
- parser.directory.path.pop();
+ if let FileName::Real(mut path) = sess.codemap().span_to_unmapped_path(parser.span) {
+ path.pop();
+ parser.directory.path = Cow::from(path);
}
}
fn push_directory(&mut self, id: Ident, attrs: &[Attribute]) {
if let Some(path) = attr::first_attr_value_str_by_name(attrs, "path") {
- self.directory.path.push(&path.as_str());
+ self.directory.path.to_mut().push(&path.as_str());
self.directory.ownership = DirectoryOwnership::Owned { relative: None };
} else {
- self.directory.path.push(&id.name.as_str());
+ self.directory.path.to_mut().push(&id.name.as_str());
}
}
use serialize::{Decoder, Decodable, Encoder, Encodable};
use util::RcSlice;
+use std::borrow::Cow;
use std::{fmt, iter, mem};
use std::hash::{self, Hash};
-> macro_parser::NamedParseResult {
// `None` is because we're not interpolating
let directory = Directory {
- path: cx.current_expansion.module.directory.clone(),
+ path: Cow::from(cx.current_expansion.module.directory.as_path()),
ownership: cx.current_expansion.directory_ownership,
};
macro_parser::parse(cx.parse_sess(), tts, mtch, Some(directory), true)