diff --git a/tamer/src/nir/interp.rs b/tamer/src/nir/interp.rs
index 98104ebf..cc8d6bc8 100644
--- a/tamer/src/nir/interp.rs
+++ b/tamer/src/nir/interp.rs
@@ -41,7 +41,7 @@
//!
//! ```xml
//!
+//! desc="Generated from interpolated string">
//! foo
//!
//! baz
@@ -69,6 +69,12 @@
//! then it is interpreted as a literal within the context of the template
//! system and is echoed back unchanged.
//!
+//! There is currently no way to escape `{` within a string.
+//! Such a feature will be considered in the future,
+//! but for the meantime,
+//! this can be worked around by using metavariables that expand into the
+//! desired literal.
+//!
//! Desugared Spans
//! ---------------
//! [`Span`]s for the generated tokens are derived from the specification
@@ -107,8 +113,8 @@ use crate::{
parse::{prelude::*, util::SPair, NoContext},
span::Span,
sym::{
- st::quick_contains_byte, GlobalSymbolIntern, GlobalSymbolResolve,
- SymbolId,
+ st::{quick_contains_byte, raw::S_GEN_FROM_INTERP},
+ GlobalSymbolIntern, GlobalSymbolResolve, SymbolId,
},
};
use std::{error::Error, fmt::Display};
@@ -286,25 +292,25 @@ impl ParseState for InterpState {
.with_lookahead(tok)
}
+ // Note: This historically generated a description containing
+ // the interpolated string,
+ // which was useful when looking at generated code.
+ // But this ends up producing output that is not a fixpoint,
+ // because if you run it back through the compiler,
+ // it needs interpolation again,
+ // but now in an incorrect context.
+ // We can revisit this
+ // (see commit introducing this comment)
+ // when we introduce escaping of some form,
+ // if it's worth doing.
GenDesc(sym, gen_ident) => {
let s = sym.lookup_str();
- // Description is not interned since there's no use in
- // wasting time hashing something that will not be
- // referenced
- // (it's just informative for a human).
- // Note that this means that tests cannot compare SymbolId.
- let gen_desc = format!(
- "Generated from interpolated string {}",
- TtQuote::wrap(s)
- )
- .clone_uninterned();
-
// Begin parsing in a _literal_ context,
// since interpolation is most commonly utilized with literal
// prefixes.
Transition(ParseLiteralAt(s, gen_ident, 0))
- .ok(Nir::Desc(SPair(gen_desc, span)))
+ .ok(Nir::Desc(SPair(S_GEN_FROM_INTERP, span)))
.with_lookahead(tok)
}
diff --git a/tamer/src/nir/interp/test.rs b/tamer/src/nir/interp/test.rs
index 2ef87562..a205bdc9 100644
--- a/tamer/src/nir/interp/test.rs
+++ b/tamer/src/nir/interp/test.rs
@@ -22,7 +22,6 @@ use crate::{
nir::NirEntity,
parse::{Parsed, ParsedResult, Parser},
span::dummy::{DUMMY_CONTEXT as DC, *},
- sym::GlobalSymbolResolve,
};
use std::assert_matches::assert_matches;
use Parsed::*;
@@ -81,7 +80,6 @@ fn does_not_desugar_text() {
fn expect_expanded_header(
sut: &mut Parser>,
- given_val: &str,
span: Span,
) -> SymbolId {
let GenIdentSymbolId(expect_name) = gen_tpl_param_ident_at_offset(span);
@@ -103,9 +101,8 @@ fn expect_expanded_header(
);
assert_matches!(
sut.next(),
- Some(Ok(Object(Nir::Desc(SPair(desc_str, desc_span)))))
- if desc_str.lookup_str().contains(given_val)
- && desc_span == span
+ Some(Ok(Object(Nir::Desc(SPair(S_GEN_FROM_INTERP, desc_span)))))
+ if desc_span == span
);
expect_name_sym
@@ -133,7 +130,7 @@ fn desugars_spec_with_only_var() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -180,7 +177,7 @@ fn concrete_bind_ident_desugars_into_abstract_bind_after_interpolation() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -222,7 +219,7 @@ fn desugars_literal_with_ending_var() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -269,7 +266,7 @@ fn desugars_var_with_ending_literal() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -306,7 +303,7 @@ fn desugars_many_vars_and_literals() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -356,7 +353,7 @@ fn proper_multibyte_handling() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -397,7 +394,7 @@ fn desugars_adjacent_interpolated_vars() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
Ok(vec![
@@ -432,7 +429,7 @@ fn error_missing_closing_interp_delim() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
vec![
@@ -478,7 +475,7 @@ fn error_nested_delim() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
vec![
@@ -527,7 +524,7 @@ fn error_empty_interp() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
vec![
@@ -569,7 +566,7 @@ fn error_close_before_open() {
let mut sut = Sut::parse(toks.into_iter());
- let expect_name = expect_expanded_header(&mut sut, given_val, a);
+ let expect_name = expect_expanded_header(&mut sut, a);
assert_eq!(
vec![
diff --git a/tamer/src/sym/prefill.rs b/tamer/src/sym/prefill.rs
index 3b340fec..c0420a62 100644
--- a/tamer/src/sym/prefill.rs
+++ b/tamer/src/sym/prefill.rs
@@ -733,6 +733,8 @@ pub mod st {
URI_LV_TPL: uri "http://www.lovullo.com/rater/apply-template",
URI_LV_WORKSHEET: uri "http://www.lovullo.com/rater/worksheet",
+ S_GEN_FROM_INTERP: str "Generated from interpolated string",
+
// Common whitespace.
//
// _This does not represent all forms of whitespace!_
diff --git a/tamer/tests/xmli/meta-interp/expected.xml b/tamer/tests/xmli/meta-interp/expected.xml
index 8560526d..fb98b1e9 100644
--- a/tamer/tests/xmli/meta-interp/expected.xml
+++ b/tamer/tests/xmli/meta-interp/expected.xml
@@ -15,21 +15,21 @@
+ desc="Generated from interpolated string">
+ desc="Generated from interpolated string">
Prefix
+ desc="Generated from interpolated string">
suffix
+ desc="Generated from interpolated string">
Prefix
suffix
@@ -45,21 +45,21 @@
+ desc="Generated from interpolated string">
+ desc="Generated from interpolated string">
prefix-
+ desc="Generated from interpolated string">
-suffix
+ desc="Generated from interpolated string">
prefix-
-suffix