merging is not simple

This commit is contained in:
강동윤 (Donny) 2024-07-30 14:54:40 +09:00
parent bddf3b972f
commit f18f9b2c50
2 changed files with 10 additions and 11 deletions

View File

@ -11,6 +11,7 @@ use std::{
#[cfg(feature = "parking_lot")] #[cfg(feature = "parking_lot")]
use parking_lot::Mutex; use parking_lot::Mutex;
use rustc_hash::FxHashMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use url::Url; use url::Url;
@ -116,10 +117,11 @@ impl Globals {
pub fn merge(globals: Vec<Lrc<Globals>>) -> MergeResult { pub fn merge(globals: Vec<Lrc<Globals>>) -> MergeResult {
let mut hygiene_data = hygiene::HygieneData::new(); let mut hygiene_data = hygiene::HygieneData::new();
let mut marks = vec![]; let mut marks = vec![];
let mut result = MergeResult::default();
for g in &globals { for g in &globals {
let g = g.hygiene_data.lock(); let g = g.hygiene_data.lock();
hygiene_data.merge(&g); hygiene_data.merge(&g, &mut result);
} }
for g in &globals { for g in &globals {
@ -127,12 +129,14 @@ impl Globals {
marks.extend(g.iter().cloned()); marks.extend(g.iter().cloned());
} }
MergeResult {} result
} }
} }
#[derive(Debug)] #[derive(Debug, Default)]
pub struct MergeResult {} pub struct MergeResult {
pub ctxts: FxHashMap<SyntaxContext, SyntaxContext>,
}
better_scoped_tls::scoped_tls!( better_scoped_tls::scoped_tls!(

View File

@ -23,7 +23,7 @@ use std::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::GLOBALS; use super::{MergeResult, GLOBALS};
use crate::{collections::AHashMap, EqIgnoreSpan}; use crate::{collections::AHashMap, EqIgnoreSpan};
/// A SyntaxContext represents a chain of macro expansions (represented by /// A SyntaxContext represents a chain of macro expansions (represented by
@ -327,12 +327,7 @@ impl HygieneData {
} }
} }
pub(crate) fn merge(&mut self, other: &Self) { pub(crate) fn merge(&mut self, other: &Self, result: &mut MergeResult) {}
self.syntax_contexts
.extend_from_slice(&other.syntax_contexts);
self.markings
.extend(other.markings.iter().map(|(k, v)| (*k, *v)));
}
fn with<T, F: FnOnce(&mut HygieneData) -> T>(f: F) -> T { fn with<T, F: FnOnce(&mut HygieneData) -> T>(f: F) -> T {
GLOBALS.with(|globals| { GLOBALS.with(|globals| {