revset: make RevsetParseContext opaque

This commit is contained in:
dploch
2024-05-03 11:50:50 -04:00
committed by Daniel Ploch
parent 3cf521fb41
commit 4e0abf0631
5 changed files with 85 additions and 65 deletions

View File

@@ -967,12 +967,12 @@ impl WorkspaceCommandHelper {
workspace_id: self.workspace_id(),
workspace_root: self.workspace.workspace_root(),
};
RevsetParseContext {
aliases_map: &self.revset_aliases_map,
user_email: self.settings.user_email(),
extensions: &self.revset_extensions,
workspace: Some(workspace_context),
}
RevsetParseContext::new(
&self.revset_aliases_map,
self.settings.user_email(),
&self.revset_extensions,
Some(workspace_context),
)
}
pub fn id_prefix_context(&self) -> Result<&IdPrefixContext, CommandError> {

View File

@@ -489,7 +489,7 @@ fn builtin_commit_methods<'repo>() -> CommitTemplateBuildMethodFnMap<'repo, Comm
);
map.insert("mine", |language, _build_ctx, self_property, function| {
template_parser::expect_no_arguments(function)?;
let user_email = language.revset_parse_context.user_email.clone();
let user_email = language.revset_parse_context.user_email().clone();
let out_property = self_property.map(move |commit| commit.author().email == user_email);
Ok(L::wrap_boolean(out_property))
});
@@ -687,7 +687,7 @@ fn evaluate_revset_expression<'repo>(
) -> Result<Box<dyn Revset + 'repo>, TemplateParseError> {
let symbol_resolver = revset_util::default_symbol_resolver(
language.repo,
language.revset_parse_context.extensions.symbol_resolvers(),
language.revset_parse_context.symbol_resolvers(),
language.id_prefix_context,
);
let revset =

View File

@@ -176,7 +176,7 @@ pub fn parse_immutable_expression(
context: &RevsetParseContext,
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
let (params, immutable_heads_str) = context
.aliases_map
.aliases_map()
.get_function(BUILTIN_IMMUTABLE_HEADS)
.unwrap();
assert!(

View File

@@ -2656,10 +2656,38 @@ impl RevsetExtensions {
/// Information needed to parse revset expression.
#[derive(Clone)]
pub struct RevsetParseContext<'a> {
pub aliases_map: &'a RevsetAliasesMap,
pub user_email: String,
pub extensions: &'a RevsetExtensions,
pub workspace: Option<RevsetWorkspaceContext<'a>>,
aliases_map: &'a RevsetAliasesMap,
user_email: String,
extensions: &'a RevsetExtensions,
workspace: Option<RevsetWorkspaceContext<'a>>,
}
impl<'a> RevsetParseContext<'a> {
pub fn new(
aliases_map: &'a RevsetAliasesMap,
user_email: String,
extensions: &'a RevsetExtensions,
workspace: Option<RevsetWorkspaceContext<'a>>,
) -> Self {
Self {
aliases_map,
user_email,
extensions,
workspace,
}
}
pub fn aliases_map(&self) -> &'a RevsetAliasesMap {
self.aliases_map
}
pub fn user_email(&self) -> &String {
&self.user_email
}
pub fn symbol_resolvers(&self) -> &[impl AsRef<dyn SymbolResolverExtension>] {
self.extensions.symbol_resolvers()
}
}
/// Workspace information needed to parse revset expression.
@@ -2696,13 +2724,13 @@ mod tests {
for (decl, defn) in aliases {
aliases_map.insert(decl, defn).unwrap();
}
let extensions: RevsetExtensions = Default::default();
let context = RevsetParseContext {
aliases_map: &aliases_map,
user_email: "test.user@example.com".to_string(),
extensions: &extensions,
workspace: None,
};
let extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(
&aliases_map,
"test.user@example.com".to_string(),
&extensions,
None,
);
// Map error to comparable object
super::parse(revset_str, &context).map_err(|e| e.kind)
}
@@ -2722,13 +2750,13 @@ mod tests {
for (decl, defn) in aliases {
aliases_map.insert(decl, defn).unwrap();
}
let extensions: RevsetExtensions = Default::default();
let context = RevsetParseContext {
aliases_map: &aliases_map,
user_email: "test.user@example.com".to_string(),
extensions: &extensions,
workspace: Some(workspace_ctx),
};
let extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(
&aliases_map,
"test.user@example.com".to_string(),
&extensions,
Some(workspace_ctx),
);
// Map error to comparable object
super::parse(revset_str, &context).map_err(|e| e.kind)
}
@@ -2747,13 +2775,13 @@ mod tests {
for (decl, defn) in aliases {
aliases_map.insert(decl, defn).unwrap();
}
let extensions: RevsetExtensions = Default::default();
let context = RevsetParseContext {
aliases_map: &aliases_map,
user_email: "test.user@example.com".to_string(),
extensions: &extensions,
workspace: None,
};
let extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(
&aliases_map,
"test.user@example.com".to_string(),
&extensions,
None,
);
// Map error to comparable object
super::parse_with_modifier(revset_str, &context).map_err(|e| e.kind)
}

View File

@@ -13,7 +13,6 @@
// limitations under the License.
use std::path::Path;
use std::sync::Arc;
use assert_matches::assert_matches;
use itertools::Itertools;
@@ -42,15 +41,11 @@ use testutils::{
fn resolve_symbol_with_extensions(
repo: &dyn Repo,
extensions: &Arc<RevsetExtensions>,
extensions: &RevsetExtensions,
symbol: &str,
) -> Result<Vec<CommitId>, RevsetResolutionError> {
let context = RevsetParseContext {
aliases_map: &RevsetAliasesMap::new(),
user_email: String::new(),
extensions,
workspace: None,
};
let aliases_map = RevsetAliasesMap::default();
let context = RevsetParseContext::new(&aliases_map, String::new(), extensions, None);
let expression = parse(symbol, &context).unwrap();
assert_matches!(*expression, RevsetExpression::CommitRef(_));
let symbol_resolver = DefaultSymbolResolver::new(repo, extensions.symbol_resolvers());
@@ -61,8 +56,7 @@ fn resolve_symbol_with_extensions(
}
fn resolve_symbol(repo: &dyn Repo, symbol: &str) -> Result<Vec<CommitId>, RevsetResolutionError> {
let extensions: Arc<RevsetExtensions> = Default::default();
resolve_symbol_with_extensions(repo, &extensions, symbol)
resolve_symbol_with_extensions(repo, &RevsetExtensions::default(), symbol)
}
fn revset_for_commits<'index>(
@@ -183,13 +177,9 @@ fn test_resolve_symbol_commit_id() {
repo.as_ref(),
&([] as [&Box<dyn SymbolResolverExtension>; 0]),
);
let extensions: Arc<RevsetExtensions> = Default::default();
let context = RevsetParseContext {
aliases_map: &RevsetAliasesMap::new(),
user_email: settings.user_email(),
extensions: &extensions,
workspace: None,
};
let aliases_map = RevsetAliasesMap::default();
let extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(&aliases_map, settings.user_email(), &extensions, None);
assert_matches!(
optimize(parse("present(04)", &context).unwrap()).resolve_user_expression(repo.as_ref(), &symbol_resolver),
Err(RevsetResolutionError::AmbiguousCommitIdPrefix(s)) if s == "04"
@@ -842,13 +832,14 @@ fn test_resolve_symbol_git_refs() {
fn resolve_commit_ids(repo: &dyn Repo, revset_str: &str) -> Vec<CommitId> {
let settings = testutils::user_settings();
let revset_extensions: Arc<RevsetExtensions> = Default::default();
let context = RevsetParseContext {
aliases_map: &RevsetAliasesMap::new(),
user_email: settings.user_email(),
extensions: &revset_extensions,
workspace: None,
};
let aliases_map = RevsetAliasesMap::default();
let revset_extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(
&aliases_map,
settings.user_email(),
&revset_extensions,
None,
);
let expression = optimize(parse(revset_str, &context).unwrap());
let symbol_resolver = DefaultSymbolResolver::new(repo, revset_extensions.symbol_resolvers());
let expression = expression
@@ -869,13 +860,14 @@ fn resolve_commit_ids_in_workspace(
workspace_id: workspace.workspace_id(),
workspace_root: workspace.workspace_root(),
};
let extensions: Arc<RevsetExtensions> = Default::default();
let context = RevsetParseContext {
aliases_map: &RevsetAliasesMap::new(),
user_email: settings.user_email(),
extensions: &extensions,
workspace: Some(workspace_ctx),
};
let aliases_map = RevsetAliasesMap::default();
let extensions = RevsetExtensions::default();
let context = RevsetParseContext::new(
&aliases_map,
settings.user_email(),
&extensions,
Some(workspace_ctx),
);
let expression = optimize(parse(revset_str, &context).unwrap());
let symbol_resolver =
DefaultSymbolResolver::new(repo, &([] as [&Box<dyn SymbolResolverExtension>; 0]));