Make ParseSess thread-safe

This commit is contained in:
John Kåre Alsaker
2018-02-15 10:52:26 +01:00
parent 3f0cb8ccff
commit c979189867
2 changed files with 12 additions and 14 deletions

View File

@@ -1781,7 +1781,6 @@ mod tests {
use errors; use errors;
use feature_gate::UnstableFeatures; use feature_gate::UnstableFeatures;
use parse::token; use parse::token;
use std::cell::RefCell;
use std::collections::HashSet; use std::collections::HashSet;
use std::io; use std::io;
use std::path::PathBuf; use std::path::PathBuf;
@@ -1797,12 +1796,12 @@ mod tests {
span_diagnostic: errors::Handler::with_emitter(true, false, Box::new(emitter)), span_diagnostic: errors::Handler::with_emitter(true, false, Box::new(emitter)),
unstable_features: UnstableFeatures::from_environment(), unstable_features: UnstableFeatures::from_environment(),
config: CrateConfig::new(), config: CrateConfig::new(),
included_mod_stack: RefCell::new(Vec::new()), included_mod_stack: Lock::new(Vec::new()),
code_map: cm, code_map: cm,
missing_fragment_specifiers: RefCell::new(HashSet::new()), missing_fragment_specifiers: Lock::new(HashSet::new()),
raw_identifier_spans: RefCell::new(Vec::new()), raw_identifier_spans: Lock::new(Vec::new()),
registered_diagnostics: Lock::new(ErrorMap::new()), registered_diagnostics: Lock::new(ErrorMap::new()),
non_modrs_mods: RefCell::new(vec![]), non_modrs_mods: Lock::new(vec![]),
} }
} }

View File

@@ -23,7 +23,6 @@ use symbol::Symbol;
use tokenstream::{TokenStream, TokenTree}; use tokenstream::{TokenStream, TokenTree};
use diagnostics::plugin::ErrorMap; use diagnostics::plugin::ErrorMap;
use std::cell::RefCell;
use std::collections::HashSet; use std::collections::HashSet;
use std::iter; use std::iter;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@@ -47,17 +46,17 @@ pub struct ParseSess {
pub span_diagnostic: Handler, pub span_diagnostic: Handler,
pub unstable_features: UnstableFeatures, pub unstable_features: UnstableFeatures,
pub config: CrateConfig, pub config: CrateConfig,
pub missing_fragment_specifiers: RefCell<HashSet<Span>>, pub missing_fragment_specifiers: Lock<HashSet<Span>>,
/// Places where raw identifiers were used. This is used for feature gating /// Places where raw identifiers were used. This is used for feature gating
/// raw identifiers /// raw identifiers
pub raw_identifier_spans: RefCell<Vec<Span>>, pub raw_identifier_spans: Lock<Vec<Span>>,
/// The registered diagnostics codes /// The registered diagnostics codes
pub registered_diagnostics: Lock<ErrorMap>, pub registered_diagnostics: Lock<ErrorMap>,
// Spans where a `mod foo;` statement was included in a non-mod.rs file. // Spans where a `mod foo;` statement was included in a non-mod.rs file.
// These are used to issue errors if the non_modrs_mods feature is not enabled. // These are used to issue errors if the non_modrs_mods feature is not enabled.
pub non_modrs_mods: RefCell<Vec<(ast::Ident, Span)>>, pub non_modrs_mods: Lock<Vec<(ast::Ident, Span)>>,
/// Used to determine and report recursive mod inclusions /// Used to determine and report recursive mod inclusions
included_mod_stack: RefCell<Vec<PathBuf>>, included_mod_stack: Lock<Vec<PathBuf>>,
code_map: Lrc<CodeMap>, code_map: Lrc<CodeMap>,
} }
@@ -76,12 +75,12 @@ impl ParseSess {
span_diagnostic: handler, span_diagnostic: handler,
unstable_features: UnstableFeatures::from_environment(), unstable_features: UnstableFeatures::from_environment(),
config: HashSet::new(), config: HashSet::new(),
missing_fragment_specifiers: RefCell::new(HashSet::new()), missing_fragment_specifiers: Lock::new(HashSet::new()),
raw_identifier_spans: RefCell::new(Vec::new()), raw_identifier_spans: Lock::new(Vec::new()),
registered_diagnostics: Lock::new(ErrorMap::new()), registered_diagnostics: Lock::new(ErrorMap::new()),
included_mod_stack: RefCell::new(vec![]), included_mod_stack: Lock::new(vec![]),
code_map, code_map,
non_modrs_mods: RefCell::new(vec![]), non_modrs_mods: Lock::new(vec![]),
} }
} }