in python/moz/l10n/formats/fluent/parse.py [0:0]
def inline_expression(exp: ftl.InlineExpression) -> Expression:
if isinstance(exp, ftl.NumberLiteral):
value = exp.value
return Expression(value, "number")
elif isinstance(exp, ftl.StringLiteral):
value = exp.parse().get("value") or ""
return Expression(value)
elif isinstance(exp, ftl.MessageReference):
name = exp.id.name
if exp.attribute is not None:
name += "." + exp.attribute.name
return Expression(name, "message")
elif isinstance(exp, ftl.TermReference):
name = "-" + exp.id.name
if exp.attribute is not None:
name += "." + exp.attribute.name
ftl_named = exp.arguments.named if exp.arguments else []
return Expression(
name,
"message",
{opt.name.name: literal_value(opt.value) for opt in ftl_named},
)
elif isinstance(exp, ftl.VariableReference):
name = exp.id.name
return Expression(VariableRef(name))
else: # ftl.FunctionReference
name = exp.id.name.lower()
if len(exp.arguments.positional) > 1:
raise ValueError(
f"Functions with more than one positional argument are not supported: {name}"
)
ftl_arg: ftl.Placeable | ftl.InlineExpression | None = next(
iter(exp.arguments.positional), None
)
while isinstance(ftl_arg, ftl.Placeable):
ftl_arg = cast(ftl.InlineExpression, ftl_arg.expression)
arg: str | VariableRef | None
if not ftl_arg:
arg = None
elif isinstance(ftl_arg, ftl.NumberLiteral) or isinstance(
ftl_arg, ftl.StringLiteral
):
arg = literal_value(ftl_arg)
elif isinstance(ftl_arg, ftl.VariableReference):
arg = VariableRef(ftl_arg.id.name)
else:
raise ValueError(f"Unexpected value: {ftl_arg}")
ftl_named = exp.arguments.named
return Expression(
arg,
name,
{opt.name.name: literal_value(opt.value) for opt in ftl_named},
)