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:
parent
6bf2cc2229
commit
f840a955bd
4 changed files with 13 additions and 15 deletions
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue