templater: use WrapTemplateProperty trait bound at parsing functions

All parsed template types can be deduced, but I've inserted type annotations
where the type is inferred only by template.format() call.
This commit is contained in:
Yuya Nishihara 2025-05-01 11:43:48 +09:00
parent ae22633247
commit a084561528
13 changed files with 97 additions and 196 deletions

View File

@ -152,7 +152,6 @@ use crate::command_error::user_error_with_hint;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplateLanguage;
use crate::commit_templater::CommitTemplateLanguageExtension;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::config::config_from_environment;
use crate::config::parse_config_args;
@ -172,15 +171,14 @@ use crate::merge_tools::MergeEditor;
use crate::merge_tools::MergeToolConfigError;
use crate::operation_templater::OperationTemplateLanguage;
use crate::operation_templater::OperationTemplateLanguageExtension;
use crate::operation_templater::OperationTemplatePropertyKind;
use crate::revset_util;
use crate::revset_util::RevsetExpressionEvaluator;
use crate::template_builder;
use crate::template_builder::TemplateLanguage;
use crate::template_parser::TemplateAliasesMap;
use crate::template_parser::TemplateDiagnostics;
use crate::templater::BoxedTemplateProperty;
use crate::templater::TemplateRenderer;
use crate::templater::WrapTemplateProperty;
use crate::text_util;
use crate::ui::ColorChoice;
use crate::ui::Ui;
@ -383,22 +381,21 @@ impl CommandHelper {
/// This function also loads template aliases from the settings. Use
/// `WorkspaceCommandHelper::parse_template()` if you've already
/// instantiated the workspace helper.
pub fn parse_template<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
pub fn parse_template<'a, C, L>(
&self,
ui: &Ui,
language: &L,
template_text: &str,
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> Result<TemplateRenderer<'a, C>, CommandError> {
) -> Result<TemplateRenderer<'a, C>, CommandError>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
let mut diagnostics = TemplateDiagnostics::new();
let aliases = load_template_aliases(ui, self.settings().config())?;
let template = template_builder::parse(
language,
&mut diagnostics,
template_text,
&aliases,
wrap_self,
)?;
let template =
template_builder::parse(language, &mut diagnostics, template_text, &aliases)?;
print_parse_diagnostics(ui, "In template expression", &diagnostics)?;
Ok(template)
}
@ -968,23 +965,23 @@ impl WorkspaceCommandEnvironment {
}
/// Parses template of the given language into evaluation tree.
///
/// `wrap_self` specifies the type of the top-level property, which should
/// be one of the `L::wrap_*()` functions.
pub fn parse_template<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
pub fn parse_template<'a, C, L>(
&self,
ui: &Ui,
language: &L,
template_text: &str,
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> Result<TemplateRenderer<'a, C>, CommandError> {
) -> Result<TemplateRenderer<'a, C>, CommandError>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
let mut diagnostics = TemplateDiagnostics::new();
let template = template_builder::parse(
language,
&mut diagnostics,
template_text,
&self.template_aliases_map,
wrap_self,
)?;
print_parse_diagnostics(ui, "In template expression", &diagnostics)?;
Ok(template)
@ -1698,33 +1695,36 @@ to the current parents may contain changes from multiple commits.
}
/// Parses template of the given language into evaluation tree.
///
/// `wrap_self` specifies the type of the top-level property, which should
/// be one of the `L::wrap_*()` functions.
pub fn parse_template<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
pub fn parse_template<'a, C, L>(
&self,
ui: &Ui,
language: &L,
template_text: &str,
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> Result<TemplateRenderer<'a, C>, CommandError> {
self.env
.parse_template(ui, language, template_text, wrap_self)
) -> Result<TemplateRenderer<'a, C>, CommandError>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
self.env.parse_template(ui, language, template_text)
}
/// Parses template that is validated by `Self::new()`.
fn reparse_valid_template<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
fn reparse_valid_template<'a, C, L>(
&self,
language: &L,
template_text: &str,
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> TemplateRenderer<'a, C> {
) -> TemplateRenderer<'a, C>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
template_builder::parse(
language,
&mut TemplateDiagnostics::new(),
template_text,
&self.env.template_aliases_map,
wrap_self,
)
.expect("parse error should be confined by WorkspaceCommandHelper::new()")
}
@ -1736,12 +1736,7 @@ to the current parents may contain changes from multiple commits.
template_text: &str,
) -> Result<TemplateRenderer<'_, Commit>, CommandError> {
let language = self.commit_template_language();
self.parse_template(
ui,
&language,
template_text,
CommitTemplatePropertyKind::wrap_commit,
)
self.parse_template(ui, &language, template_text)
}
/// Parses commit template into evaluation tree.
@ -1751,12 +1746,7 @@ to the current parents may contain changes from multiple commits.
template_text: &str,
) -> Result<TemplateRenderer<'_, Operation>, CommandError> {
let language = self.operation_template_language();
self.parse_template(
ui,
&language,
template_text,
OperationTemplatePropertyKind::wrap_operation,
)
self.parse_template(ui, &language, template_text)
}
/// Creates commit template language environment for this workspace.
@ -1777,31 +1767,19 @@ to the current parents may contain changes from multiple commits.
/// Template for one-line summary of a commit.
pub fn commit_summary_template(&self) -> TemplateRenderer<'_, Commit> {
let language = self.commit_template_language();
self.reparse_valid_template(
&language,
&self.commit_summary_template_text,
CommitTemplatePropertyKind::wrap_commit,
)
self.reparse_valid_template(&language, &self.commit_summary_template_text)
}
/// Template for one-line summary of an operation.
pub fn operation_summary_template(&self) -> TemplateRenderer<'_, Operation> {
let language = self.operation_template_language();
self.reparse_valid_template(
&language,
&self.op_summary_template_text,
OperationTemplatePropertyKind::wrap_operation,
)
.labeled("operation")
self.reparse_valid_template(&language, &self.op_summary_template_text)
.labeled("operation")
}
pub fn short_change_id_template(&self) -> TemplateRenderer<'_, Commit> {
let language = self.commit_template_language();
self.reparse_valid_template(
&language,
SHORT_CHANGE_ID_TEMPLATE_TEXT,
CommitTemplatePropertyKind::wrap_commit,
)
self.reparse_valid_template(&language, SHORT_CHANGE_ID_TEMPLATE_TEXT)
}
/// Returns one-line summary of the given `commit`.
@ -2459,11 +2437,8 @@ impl WorkspaceCommandTransaction<'_> {
/// Template for one-line summary of a commit within transaction.
pub fn commit_summary_template(&self) -> TemplateRenderer<'_, Commit> {
let language = self.commit_template_language();
self.helper.reparse_valid_template(
&language,
&self.helper.commit_summary_template_text,
CommitTemplatePropertyKind::wrap_commit,
)
self.helper
.reparse_valid_template(&language, &self.helper.commit_summary_template_text)
}
/// Creates commit template language environment capturing the current
@ -2484,12 +2459,7 @@ impl WorkspaceCommandTransaction<'_> {
template_text: &str,
) -> Result<TemplateRenderer<'_, Commit>, CommandError> {
let language = self.commit_template_language();
self.helper.env.parse_template(
ui,
&language,
template_text,
CommitTemplatePropertyKind::wrap_commit,
)
self.helper.env.parse_template(ui, &language, template_text)
}
pub fn finish(self, ui: &Ui, description: impl Into<String>) -> Result<(), CommandError> {

View File

@ -33,8 +33,8 @@ use crate::cli_util::CommandHelper;
use crate::cli_util::RevisionArg;
use crate::command_error::CommandError;
use crate::commit_templater::CommitRef;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// List bookmarks and their targets
@ -171,7 +171,7 @@ pub fn cmd_bookmark_list(
None
};
let template = {
let template: TemplateRenderer<Rc<CommitRef>> = {
let language = workspace_command.commit_template_language();
let text = match &args.template {
Some(value) => value.to_owned(),
@ -180,12 +180,7 @@ pub fn cmd_bookmark_list(
.get("templates.bookmark_list")?,
};
workspace_command
.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_commit_ref,
)?
.parse_template(ui, &language, &text)?
.labeled("bookmark_list")
};

View File

@ -13,6 +13,7 @@
// limitations under the License.
use std::collections::HashMap;
use std::rc::Rc;
use clap_complete::ArgValueCandidates;
use itertools::Itertools as _;
@ -22,8 +23,8 @@ use crate::cli_util::CommandHelper;
use crate::cli_util::RemoteBookmarkNamePattern;
use crate::command_error::CommandError;
use crate::commit_templater::CommitRef;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Start tracking given remote bookmarks
@ -87,18 +88,13 @@ pub fn cmd_bookmark_track(
//show conflicted bookmarks if there are some
if let Some(mut formatter) = ui.status_formatter() {
let template = {
let template: TemplateRenderer<Rc<CommitRef>> = {
let language = workspace_command.commit_template_language();
let text = workspace_command
.settings()
.get::<String>("templates.bookmark_list")?;
workspace_command
.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_commit_ref,
)?
.parse_template(ui, &language, &text)?
.labeled("bookmark_list")
};

View File

@ -26,11 +26,10 @@ use crate::config::resolved_config_values;
use crate::config::AnnotatedValue;
use crate::generic_templater;
use crate::generic_templater::GenericTemplateLanguage;
use crate::generic_templater::GenericTemplatePropertyKind;
use crate::template_builder::CoreTemplatePropertyVar as _;
use crate::template_builder::TemplateLanguage;
use crate::templater::TemplatePropertyExt as _;
use crate::templater::WrapTemplateProperty as _;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// List variables set in config files, along with their values.
@ -80,19 +79,14 @@ pub fn cmd_config_list(
command: &CommandHelper,
args: &ConfigListArgs,
) -> Result<(), CommandError> {
let template = {
let template: TemplateRenderer<AnnotatedValue> = {
let language = config_template_language(command.settings());
let text = match &args.template {
Some(value) => value.to_owned(),
None => command.settings().get_string("templates.config_list")?,
};
command
.parse_template(
ui,
&language,
&text,
GenericTemplatePropertyKind::wrap_property,
)?
.parse_template(ui, &language, &text)?
.labeled("config_list")
};

View File

@ -30,11 +30,11 @@ use crate::cli_util::CommandHelper;
use crate::cli_util::LogContentFormat;
use crate::cli_util::RevisionArg;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::diff_util::DiffFormatArgs;
use crate::graphlog::get_graphlog;
use crate::graphlog::GraphStyle;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Show how a change has evolved over time
@ -102,8 +102,8 @@ pub(crate) fn cmd_evolog(
let graph_style = GraphStyle::from_settings(workspace_command.settings())?;
let with_content_format = LogContentFormat::new(ui, workspace_command.settings())?;
let template;
let node_template;
let template: TemplateRenderer<Commit>;
let node_template: TemplateRenderer<Option<Commit>>;
{
let language = workspace_command.commit_template_language();
let template_string = match &args.template {
@ -111,19 +111,13 @@ pub(crate) fn cmd_evolog(
None => workspace_command.settings().get_string("templates.log")?,
};
template = workspace_command
.parse_template(
ui,
&language,
&template_string,
CommitTemplatePropertyKind::wrap_commit,
)?
.parse_template(ui, &language, &template_string)?
.labeled("log");
node_template = workspace_command
.parse_template(
ui,
&language,
&get_node_template(graph_style, workspace_command.settings())?,
CommitTemplatePropertyKind::wrap_commit_opt,
)?
.labeled("node");
}

View File

@ -25,7 +25,6 @@ use crate::cli_util::RevisionArg;
use crate::command_error::user_error;
use crate::command_error::CommandError;
use crate::commit_templater::AnnotationLine;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
@ -97,12 +96,7 @@ pub(crate) fn cmd_file_annotate(
.get_string("templates.file_annotate")?,
};
let language = workspace_command.commit_template_language();
let template = workspace_command.parse_template(
ui,
&language,
&template_text,
CommitTemplatePropertyKind::wrap_annotation_line,
)?;
let template = workspace_command.parse_template(ui, &language, &template_text)?;
// TODO: Should we add an option to limit the domain to e.g. recent commits?
// Note that this is probably different from "--skip REVS", which won't

View File

@ -18,9 +18,9 @@ use tracing::instrument;
use crate::cli_util::CommandHelper;
use crate::cli_util::RevisionArg;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::commit_templater::TreeEntry;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// List files in a revision
@ -66,19 +66,14 @@ pub(crate) fn cmd_file_list(
let matcher = workspace_command
.parse_file_patterns(ui, &args.paths)?
.to_matcher();
let template = {
let template: TemplateRenderer<TreeEntry> = {
let language = workspace_command.commit_template_language();
let text = match &args.template {
Some(value) => value.to_owned(),
None => workspace_command.settings().get("templates.file_list")?,
};
workspace_command
.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_tree_entry,
)?
.parse_template(ui, &language, &text)?
.labeled("file_list")
};

View File

@ -16,6 +16,7 @@ use clap_complete::ArgValueCandidates;
use clap_complete::ArgValueCompleter;
use itertools::Itertools as _;
use jj_lib::backend::CommitId;
use jj_lib::commit::Commit;
use jj_lib::config::ConfigGetError;
use jj_lib::config::ConfigGetResultExt as _;
use jj_lib::graph::reverse_graph;
@ -35,11 +36,11 @@ use crate::cli_util::CommandHelper;
use crate::cli_util::LogContentFormat;
use crate::cli_util::RevisionArg;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::diff_util::DiffFormatArgs;
use crate::graphlog::get_graphlog;
use crate::graphlog::GraphStyle;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Show revision history
@ -163,8 +164,8 @@ pub(crate) fn cmd_log(
let use_elided_nodes = settings.get_bool("ui.log-synthetic-elided-nodes")?;
let with_content_format = LogContentFormat::new(ui, settings)?;
let template;
let node_template;
let template: TemplateRenderer<Commit>;
let node_template: TemplateRenderer<Option<Commit>>;
{
let language = workspace_command.commit_template_language();
let template_string = match &args.template {
@ -172,20 +173,10 @@ pub(crate) fn cmd_log(
None => settings.get_string("templates.log")?,
};
template = workspace_command
.parse_template(
ui,
&language,
&template_string,
CommitTemplatePropertyKind::wrap_commit,
)?
.parse_template(ui, &language, &template_string)?
.labeled("log");
node_template = workspace_command
.parse_template(
ui,
&language,
&get_node_template(graph_style, settings)?,
CommitTemplatePropertyKind::wrap_commit_opt,
)?
.parse_template(ui, &language, &get_node_template(graph_style, settings)?)?
.labeled("node");
}

View File

@ -40,7 +40,6 @@ use jj_lib::revset::RevsetIteratorExt as _;
use crate::cli_util::CommandHelper;
use crate::cli_util::LogContentFormat;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::diff_util::diff_formats_for_log;
use crate::diff_util::DiffFormatArgs;
@ -132,12 +131,7 @@ pub fn cmd_op_diff(
let commit_summary_template = {
let language = workspace_env.commit_template_language(merged_repo, &id_prefix_context);
let text = settings.get_string("templates.commit_summary")?;
workspace_env.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_commit,
)?
workspace_env.parse_template(ui, &language, &text)?
};
let op_summary_template = workspace_command.operation_summary_template();

View File

@ -32,7 +32,6 @@ use crate::cli_util::CommandHelper;
use crate::cli_util::LogContentFormat;
use crate::cli_util::WorkspaceCommandEnvironment;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::diff_util::diff_formats_for_log;
use crate::diff_util::DiffFormatArgs;
@ -41,7 +40,7 @@ use crate::formatter::Formatter;
use crate::graphlog::get_graphlog;
use crate::graphlog::GraphStyle;
use crate::operation_templater::OperationTemplateLanguage;
use crate::operation_templater::OperationTemplatePropertyKind;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Show the operation log
@ -123,8 +122,8 @@ fn do_op_log(
let graph_style = GraphStyle::from_settings(settings)?;
let with_content_format = LogContentFormat::new(ui, settings)?;
let template;
let op_node_template;
let template: TemplateRenderer<Operation>;
let op_node_template: TemplateRenderer<Operation>;
{
let language = OperationTemplateLanguage::new(
repo_loader,
@ -136,21 +135,11 @@ fn do_op_log(
None => settings.get_string("templates.op_log")?,
};
template = workspace_env
.parse_template(
ui,
&language,
&text,
OperationTemplatePropertyKind::wrap_operation,
)?
.parse_template(ui, &language, &text)?
.labeled("operation")
.labeled("op_log");
op_node_template = workspace_env
.parse_template(
ui,
&language,
&get_node_template(graph_style, settings)?,
OperationTemplatePropertyKind::wrap_operation,
)?
.parse_template(ui, &language, &get_node_template(graph_style, settings)?)?
.labeled("node");
}
@ -170,12 +159,7 @@ fn do_op_log(
let commit_summary_template = {
let language =
workspace_env.commit_template_language(repo.as_ref(), &id_prefix_context);
workspace_env.parse_template(
ui,
&language,
&template_text,
CommitTemplatePropertyKind::wrap_commit,
)?
workspace_env.parse_template(ui, &language, &template_text)?
};
let path_converter = workspace_env.path_converter();
let conflict_marker_style = workspace_env.conflict_marker_style();

View File

@ -14,17 +14,18 @@
use clap_complete::ArgValueCandidates;
use itertools::Itertools as _;
use jj_lib::operation::Operation;
use super::diff::show_op_diff;
use crate::cli_util::CommandHelper;
use crate::cli_util::LogContentFormat;
use crate::command_error::CommandError;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::diff_util::diff_formats_for_log;
use crate::diff_util::DiffFormatArgs;
use crate::diff_util::DiffRenderer;
use crate::graphlog::GraphStyle;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Show changes to the repository in an operation
@ -66,12 +67,7 @@ pub fn cmd_op_show(
let commit_summary_template = {
let language = workspace_env.commit_template_language(repo.as_ref(), &id_prefix_context);
let text = settings.get_string("templates.commit_summary")?;
workspace_env.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_commit,
)?
workspace_env.parse_template(ui, &language, &text)?
};
let graph_style = GraphStyle::from_settings(settings)?;
@ -91,7 +87,7 @@ pub fn cmd_op_show(
};
// TODO: Should we make this customizable via clap arg?
let template = {
let template: TemplateRenderer<Operation> = {
let text = settings.get_string("templates.op_log")?;
workspace_command
.parse_operation_template(ui, &text)?

View File

@ -12,14 +12,16 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use std::rc::Rc;
use clap_complete::ArgValueCandidates;
use jj_lib::str_util::StringPattern;
use crate::cli_util::CommandHelper;
use crate::command_error::CommandError;
use crate::commit_templater::CommitRef;
use crate::commit_templater::CommitTemplatePropertyKind;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
/// Manage tags.
@ -75,19 +77,14 @@ fn cmd_tag_list(
let repo = workspace_command.repo();
let view = repo.view();
let template = {
let template: TemplateRenderer<Rc<CommitRef>> = {
let language = workspace_command.commit_template_language();
let text = match &args.template {
Some(value) => value.to_owned(),
None => workspace_command.settings().get("templates.tag_list")?,
};
workspace_command
.parse_template(
ui,
&language,
&text,
CommitTemplatePropertyKind::wrap_commit_ref,
)?
.parse_template(ui, &language, &text)?
.labeled("tag_list")
};

View File

@ -1906,37 +1906,39 @@ pub fn build_expression<'a, L: TemplateLanguage<'a> + ?Sized>(
}
/// Builds template evaluation tree from AST nodes, with fresh build context.
///
/// `wrap_self` specifies the type of the top-level property, which should be
/// one of the `L::Property::wrap_*()` functions.
pub fn build<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
pub fn build<'a, C, L>(
language: &L,
diagnostics: &mut TemplateDiagnostics,
node: &ExpressionNode,
// TODO: Generic L: WrapProperty<C> trait might be better. See the
// comment in build_formattable_list_method().
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> TemplateParseResult<TemplateRenderer<'a, C>> {
) -> TemplateParseResult<TemplateRenderer<'a, C>>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
let self_placeholder = PropertyPlaceholder::new();
let build_ctx = BuildContext {
local_variables: HashMap::new(),
self_variable: &|| wrap_self(self_placeholder.clone().into_dyn()),
self_variable: &|| self_placeholder.clone().into_dyn_wrapped(),
};
let template = expect_template_expression(language, diagnostics, &build_ctx, node)?;
Ok(TemplateRenderer::new(template, self_placeholder))
}
/// Parses text, expands aliases, then builds template evaluation tree.
pub fn parse<'a, C: Clone + 'a, L: TemplateLanguage<'a> + ?Sized>(
pub fn parse<'a, C, L>(
language: &L,
diagnostics: &mut TemplateDiagnostics,
template_text: &str,
aliases_map: &TemplateAliasesMap,
wrap_self: impl Fn(BoxedTemplateProperty<'a, C>) -> L::Property,
) -> TemplateParseResult<TemplateRenderer<'a, C>> {
) -> TemplateParseResult<TemplateRenderer<'a, C>>
where
C: Clone + 'a,
L: TemplateLanguage<'a> + ?Sized,
L::Property: WrapTemplateProperty<'a, C>,
{
let node = template_parser::parse(template_text, aliases_map)?;
build(language, diagnostics, &node, wrap_self)
.map_err(|err| err.extend_alias_candidates(aliases_map))
build(language, diagnostics, &node).map_err(|err| err.extend_alias_candidates(aliases_map))
}
pub fn expect_boolean_expression<'a, L: TemplateLanguage<'a> + ?Sized>(
@ -2130,7 +2132,6 @@ mod tests {
&mut TemplateDiagnostics::new(),
template,
&self.aliases_map,
P::wrap_property,
)
}