Skip to content

Commit

Permalink
Simplify handling of raw metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
cmyr committed Nov 6, 2018
1 parent 09ac1bd commit a75c4bb
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 16 deletions.
18 changes: 18 additions & 0 deletions src/parsing/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,24 @@ impl Metadata {
pub fn metadata_for_scope(&self, scope: &[Scope]) -> ScopedMetadata {
ScopedMetadata(self.metadata_matching_scope(scope))
}

pub(crate) fn merged_with_raw(self, raw: LoadMetadata) -> Metadata {
let Metadata { mut scoped_metadata } = self;
let mut final_items: BTreeMap<String, MetadataSet> = scoped_metadata
.drain(..)
.map(|ms| (ms.selector_string.clone(), ms))
.collect();
let Metadata { scoped_metadata } = raw.into();
for item in scoped_metadata {
final_items.insert(item.selector_string.clone(), item);
}

let scoped_metadata: Vec<MetadataSet> = final_items.into_iter()
.map(|(_k, v)| v)
.collect();

Metadata { scoped_metadata }
}
}

impl MetadataSet {
Expand Down
35 changes: 19 additions & 16 deletions src/parsing/syntax_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ pub struct SyntaxSet {
#[cfg(feature = "metadata")]
#[serde(skip, default)]
pub(crate) metadata: Metadata,
/// Raw metadata. We hold on to this so that if additional metadata is loaded,
/// we can merge it appropriately.
#[cfg(feature = "metadata")]
#[serde(skip, default)]
raw_metadata: LoadMetadata,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
Expand Down Expand Up @@ -73,6 +68,8 @@ pub struct SyntaxSetBuilder {
path_syntaxes: Vec<(String, usize)>,
#[cfg(feature = "metadata")]
raw_metadata: LoadMetadata,
#[cfg(feature = "metadata")]
existing_metadata: Option<Metadata>,

}

Expand Down Expand Up @@ -103,9 +100,6 @@ impl Clone for SyntaxSet {
first_line_cache: AtomicLazyCell::new(),
#[cfg(feature = "metadata")]
metadata: self.metadata.clone(),
#[cfg(feature = "metadata")]
raw_metadata: self.raw_metadata.clone(),

}
}
}
Expand All @@ -119,8 +113,6 @@ impl Default for SyntaxSet {
first_line_cache: AtomicLazyCell::new(),
#[cfg(feature = "metadata")]
metadata: Metadata::default(),
#[cfg(feature = "metadata")]
raw_metadata: LoadMetadata::default(),
}
}
}
Expand Down Expand Up @@ -272,7 +264,7 @@ impl SyntaxSet {
/// in the set, but not the other way around.
pub fn into_builder(self) -> SyntaxSetBuilder {
#[cfg(feature = "metadata")]
let SyntaxSet { syntaxes, contexts, path_syntaxes, raw_metadata, .. } = self;
let SyntaxSet { syntaxes, contexts, path_syntaxes, metadata, .. } = self;
#[cfg(not(feature = "metadata"))]
let SyntaxSet { syntaxes, contexts, path_syntaxes, .. } = self;

Expand Down Expand Up @@ -317,7 +309,9 @@ impl SyntaxSet {
syntaxes: builder_syntaxes,
path_syntaxes,
#[cfg(feature = "metadata")]
raw_metadata,
existing_metadata: Some(metadata),
#[cfg(feature = "metadata")]
raw_metadata: LoadMetadata::default(),
}
}

Expand Down Expand Up @@ -428,7 +422,12 @@ impl SyntaxSetBuilder {
#[cfg(not(feature = "metadata"))]
let SyntaxSetBuilder { syntaxes: syntax_definitions, path_syntaxes } = self;
#[cfg(feature = "metadata")]
let SyntaxSetBuilder { syntaxes: syntax_definitions, path_syntaxes, raw_metadata } = self;
let SyntaxSetBuilder {
syntaxes: syntax_definitions,
path_syntaxes,
raw_metadata,
existing_metadata,
} = self;

let mut syntaxes = Vec::with_capacity(syntax_definitions.len());
let mut all_contexts = Vec::new();
Expand Down Expand Up @@ -490,15 +489,19 @@ impl SyntaxSetBuilder {
}
}

#[cfg(feature = "metadata")]
let metadata = match existing_metadata {
Some(mut existing) => existing.merged_with_raw(raw_metadata),
None => raw_metadata.into(),
};

SyntaxSet {
syntaxes,
contexts: all_contexts,
path_syntaxes,
first_line_cache: AtomicLazyCell::new(),
#[cfg(feature = "metadata")]
metadata: raw_metadata.clone().into(),
#[cfg(feature = "metadata")]
raw_metadata,
metadata,
}
}

Expand Down

0 comments on commit a75c4bb

Please sign in to comment.