mirror of
https://github.com/martinvonz/jj.git
synced 2024-10-24 07:32:54 +00:00
revset: make .get_symbol/function() compatible with TemplateAliasesMap
These map types will be combined.
This commit is contained in:
parent
3db1f9fe5d
commit
467d73f1e6
2 changed files with 21 additions and 12 deletions
|
@ -137,7 +137,7 @@ pub fn load_revset_aliases(
|
||||||
|
|
||||||
// TODO: If we add support for function overloading (#2966), this check can
|
// TODO: If we add support for function overloading (#2966), this check can
|
||||||
// be removed.
|
// be removed.
|
||||||
let (params, _) = aliases_map.get_function(BUILTIN_IMMUTABLE_HEADS).unwrap();
|
let (_, params, _) = aliases_map.get_function(BUILTIN_IMMUTABLE_HEADS).unwrap();
|
||||||
if !params.is_empty() {
|
if !params.is_empty() {
|
||||||
return Err(user_error(format!(
|
return Err(user_error(format!(
|
||||||
"The `revset-aliases.{name}()` function must be declared without arguments",
|
"The `revset-aliases.{name}()` function must be declared without arguments",
|
||||||
|
@ -175,7 +175,7 @@ pub fn default_symbol_resolver<'a>(
|
||||||
pub fn parse_immutable_expression(
|
pub fn parse_immutable_expression(
|
||||||
context: &RevsetParseContext,
|
context: &RevsetParseContext,
|
||||||
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
||||||
let (params, immutable_heads_str) = context
|
let (_, params, immutable_heads_str) = context
|
||||||
.aliases_map()
|
.aliases_map()
|
||||||
.get_function(BUILTIN_IMMUTABLE_HEADS)
|
.get_function(BUILTIN_IMMUTABLE_HEADS)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -476,8 +476,7 @@ fn parse_symbol_rule(
|
||||||
let name = first.as_str();
|
let name = first.as_str();
|
||||||
if let Some(expr) = state.locals.get(name) {
|
if let Some(expr) = state.locals.get(name) {
|
||||||
Ok(expr.clone())
|
Ok(expr.clone())
|
||||||
} else if let Some(defn) = state.aliases_map.get_symbol(name) {
|
} else if let Some((id, defn)) = state.aliases_map.get_symbol(name) {
|
||||||
let id = RevsetAliasId::Symbol(name);
|
|
||||||
let locals = HashMap::new(); // Don't spill out the current scope
|
let locals = HashMap::new(); // Don't spill out the current scope
|
||||||
state.with_alias_expanding(id, &locals, first.as_span(), |state| {
|
state.with_alias_expanding(id, &locals, first.as_span(), |state| {
|
||||||
parse_program(defn, state)
|
parse_program(defn, state)
|
||||||
|
@ -517,7 +516,7 @@ fn parse_function_expression(
|
||||||
primary_span: pest::Span<'_>,
|
primary_span: pest::Span<'_>,
|
||||||
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
||||||
let name = name_pair.as_str();
|
let name = name_pair.as_str();
|
||||||
if let Some((params, defn)) = state.aliases_map.get_function(name) {
|
if let Some((id, params, defn)) = state.aliases_map.get_function(name) {
|
||||||
// Resolve arguments in the current scope, and pass them in to the alias
|
// Resolve arguments in the current scope, and pass them in to the alias
|
||||||
// expansion scope.
|
// expansion scope.
|
||||||
let (required, optional) =
|
let (required, optional) =
|
||||||
|
@ -527,7 +526,6 @@ fn parse_function_expression(
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|arg| parse_expression_rule(arg.into_inner(), state))
|
.map(|arg| parse_expression_rule(arg.into_inner(), state))
|
||||||
.try_collect()?;
|
.try_collect()?;
|
||||||
let id = RevsetAliasId::Function(name);
|
|
||||||
let locals = params.iter().map(|s| s.as_str()).zip(args).collect();
|
let locals = params.iter().map(|s| s.as_str()).zip(args).collect();
|
||||||
state.with_alias_expanding(id, &locals, primary_span, |state| {
|
state.with_alias_expanding(id, &locals, primary_span, |state| {
|
||||||
parse_program(defn, state)
|
parse_program(defn, state)
|
||||||
|
@ -587,14 +585,25 @@ impl RevsetAliasesMap {
|
||||||
self.function_aliases.keys().map(|n| n.as_ref())
|
self.function_aliases.keys().map(|n| n.as_ref())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_symbol(&self, name: &str) -> Option<&str> {
|
/// Looks up symbol alias by name. Returns identifier and definition text.
|
||||||
self.symbol_aliases.get(name).map(|defn| defn.as_ref())
|
pub fn get_symbol(&self, name: &str) -> Option<(RevsetAliasId<'_>, &str)> {
|
||||||
|
self.symbol_aliases
|
||||||
|
.get_key_value(name)
|
||||||
|
.map(|(name, defn)| (RevsetAliasId::Symbol(name), defn.as_ref()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_function(&self, name: &str) -> Option<(&[String], &str)> {
|
/// Looks up function alias by name. Returns identifier, list of parameter
|
||||||
|
/// names, and definition text.
|
||||||
|
pub fn get_function(&self, name: &str) -> Option<(RevsetAliasId<'_>, &[String], &str)> {
|
||||||
self.function_aliases
|
self.function_aliases
|
||||||
.get(name)
|
.get_key_value(name)
|
||||||
.map(|(params, defn)| (params.as_ref(), defn.as_ref()))
|
.map(|(name, (params, defn))| {
|
||||||
|
(
|
||||||
|
RevsetAliasId::Function(name),
|
||||||
|
params.as_ref(),
|
||||||
|
defn.as_ref(),
|
||||||
|
)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,7 +647,7 @@ impl RevsetAliasDeclaration {
|
||||||
|
|
||||||
/// Borrowed reference to identify alias expression.
|
/// Borrowed reference to identify alias expression.
|
||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
pub(super) enum RevsetAliasId<'a> {
|
pub enum RevsetAliasId<'a> {
|
||||||
Symbol(&'a str),
|
Symbol(&'a str),
|
||||||
Function(&'a str),
|
Function(&'a str),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue