1
Fork 0

Remove the Cow from Directory.

The previous commit wrapped `Parser` within a `Cow` for the hot macro
parsing path. As a result, there's no need for the `Cow` within
`Directory`, because it lies within `Parser`.
This commit is contained in:
Nicholas Nethercote 2020-02-05 14:33:08 +11:00
parent 6bf2cc2229
commit f840a955bd
4 changed files with 13 additions and 15 deletions

View file

@ -260,7 +260,7 @@ fn generic_extension<'cx>(
} }
let directory = Directory { let directory = Directory {
path: Cow::from(cx.current_expansion.module.directory.as_path()), path: cx.current_expansion.module.directory.clone(),
ownership: cx.current_expansion.directory_ownership, ownership: cx.current_expansion.directory_ownership,
}; };
let mut p = Parser::new(cx.parse_sess(), tts, Some(directory), true, false, None); let mut p = Parser::new(cx.parse_sess(), tts, Some(directory), true, false, None);
@ -1218,7 +1218,7 @@ fn base_parser_from_cx<'cx>(
tts: TokenStream, tts: TokenStream,
) -> Parser<'cx> { ) -> Parser<'cx> {
let directory = Directory { let directory = Directory {
path: Cow::from(current_expansion.module.directory.as_path()), path: current_expansion.module.directory.clone(),
ownership: current_expansion.directory_ownership, ownership: current_expansion.directory_ownership,
}; };
Parser::new(sess, tts, Some(directory), true, true, rustc_parse::MACRO_ARGUMENTS) Parser::new(sess, tts, Some(directory), true, true, rustc_parse::MACRO_ARGUMENTS)

View file

@ -12,8 +12,7 @@ use syntax::ast;
use syntax::token::{self, Nonterminal}; use syntax::token::{self, Nonterminal};
use syntax::tokenstream::{self, TokenStream, TokenTree}; use syntax::tokenstream::{self, TokenStream, TokenTree};
use std::borrow::Cow; use std::path::{Path, PathBuf};
use std::path::Path;
use std::str; use std::str;
use log::info; use log::info;
@ -29,8 +28,8 @@ pub mod validate_attr;
pub mod config; pub mod config;
#[derive(Clone)] #[derive(Clone)]
pub struct Directory<'a> { pub struct Directory {
pub path: Cow<'a, Path>, pub path: PathBuf,
pub ownership: DirectoryOwnership, pub ownership: DirectoryOwnership,
} }
@ -274,7 +273,7 @@ pub fn stream_to_parser<'a>(
pub fn stream_to_parser_with_base_dir<'a>( pub fn stream_to_parser_with_base_dir<'a>(
sess: &'a ParseSess, sess: &'a ParseSess,
stream: TokenStream, stream: TokenStream,
base_dir: Directory<'a>, base_dir: Directory,
) -> Parser<'a> { ) -> Parser<'a> {
Parser::new(sess, stream, Some(base_dir), true, false, None) Parser::new(sess, stream, Some(base_dir), true, false, None)
} }

View file

@ -29,7 +29,6 @@ use syntax::token::{self, DelimToken, Token, TokenKind};
use syntax::tokenstream::{self, DelimSpan, TokenStream, TokenTree, TreeAndJoint}; use syntax::tokenstream::{self, DelimSpan, TokenStream, TokenTree, TreeAndJoint};
use syntax::util::comments::{doc_comment_style, strip_doc_comment_decoration}; use syntax::util::comments::{doc_comment_style, strip_doc_comment_decoration};
use std::borrow::Cow;
use std::path::PathBuf; use std::path::PathBuf;
use std::{cmp, mem, slice}; use std::{cmp, mem, slice};
@ -114,7 +113,7 @@ pub struct Parser<'a> {
prev_token_kind: PrevTokenKind, prev_token_kind: PrevTokenKind,
restrictions: Restrictions, restrictions: Restrictions,
/// Used to determine the path to externally loaded source files. /// Used to determine the path to externally loaded source files.
pub(super) directory: Directory<'a>, pub(super) directory: Directory,
/// `true` to parse sub-modules in other files. /// `true` to parse sub-modules in other files.
// Public for rustfmt usage. // Public for rustfmt usage.
pub recurse_into_file_modules: bool, pub recurse_into_file_modules: bool,
@ -376,7 +375,7 @@ impl<'a> Parser<'a> {
pub fn new( pub fn new(
sess: &'a ParseSess, sess: &'a ParseSess,
tokens: TokenStream, tokens: TokenStream,
directory: Option<Directory<'a>>, directory: Option<Directory>,
recurse_into_file_modules: bool, recurse_into_file_modules: bool,
desugar_doc_comments: bool, desugar_doc_comments: bool,
subparser_name: Option<&'static str>, subparser_name: Option<&'static str>,
@ -390,7 +389,7 @@ impl<'a> Parser<'a> {
restrictions: Restrictions::empty(), restrictions: Restrictions::empty(),
recurse_into_file_modules, recurse_into_file_modules,
directory: Directory { directory: Directory {
path: Cow::from(PathBuf::new()), path: PathBuf::new(),
ownership: DirectoryOwnership::Owned { relative: None }, ownership: DirectoryOwnership::Owned { relative: None },
}, },
root_module_name: None, root_module_name: None,
@ -418,7 +417,7 @@ impl<'a> Parser<'a> {
&sess.source_map().lookup_char_pos(parser.token.span.lo()).file.unmapped_path &sess.source_map().lookup_char_pos(parser.token.span.lo()).file.unmapped_path
{ {
if let Some(directory_path) = path.parent() { if let Some(directory_path) = path.parent() {
parser.directory.path = Cow::from(directory_path.to_path_buf()); parser.directory.path = directory_path.to_path_buf();
} }
} }
} }

View file

@ -285,7 +285,7 @@ impl<'a> Parser<'a> {
fn push_directory(&mut self, id: Ident, attrs: &[Attribute]) { fn push_directory(&mut self, id: Ident, attrs: &[Attribute]) {
if let Some(path) = attr::first_attr_value_str_by_name(attrs, sym::path) { if let Some(path) = attr::first_attr_value_str_by_name(attrs, sym::path) {
self.directory.path.to_mut().push(&*path.as_str()); self.directory.path.push(&*path.as_str());
self.directory.ownership = DirectoryOwnership::Owned { relative: None }; self.directory.ownership = DirectoryOwnership::Owned { relative: None };
} else { } else {
// We have to push on the current module name in the case of relative // We have to push on the current module name in the case of relative
@ -297,10 +297,10 @@ impl<'a> Parser<'a> {
if let DirectoryOwnership::Owned { relative } = &mut self.directory.ownership { if let DirectoryOwnership::Owned { relative } = &mut self.directory.ownership {
if let Some(ident) = relative.take() { if let Some(ident) = relative.take() {
// remove the relative offset // remove the relative offset
self.directory.path.to_mut().push(&*ident.as_str()); self.directory.path.push(&*ident.as_str());
} }
} }
self.directory.path.to_mut().push(&*id.as_str()); self.directory.path.push(&*id.as_str());
} }
} }
} }