|
9 | 9 |
|
10 | 10 | from fluent.syntax import ast as FTL |
11 | 11 | from .errors import FluentCyclicReferenceError, FluentFormatError, FluentReferenceError |
12 | | -from .types import FluentDateType, FluentNone, FluentNumber, fluent_date, fluent_number |
| 12 | +from .types import FluentType, FluentDateType, FluentNone, FluentNumber, fluent_date, fluent_number |
13 | 13 | from .utils import numeric_to_native, reference_to_id, unknown_reference_error_obj |
14 | 14 |
|
15 | 15 | try: |
@@ -54,7 +54,6 @@ class CurrentEnvironment(object): |
54 | 54 | class ResolverEnvironment(object): |
55 | 55 | context = attr.ib() |
56 | 56 | errors = attr.ib() |
57 | | - dirty = attr.ib(factory=set) |
58 | 57 | part_count = attr.ib(default=0) |
59 | 58 | current = attr.ib(factory=CurrentEnvironment) |
60 | 59 |
|
@@ -141,11 +140,16 @@ def __call__(self, env): |
141 | 140 | return FluentNone() |
142 | 141 | self.dirty = True |
143 | 142 | retval = ''.join( |
144 | | - element(env) for element in self.elements |
| 143 | + self.resolve(element(env), env) for element in self.elements |
145 | 144 | ) |
146 | 145 | self.dirty = False |
147 | 146 | return retval |
148 | 147 |
|
| 148 | + def resolve(self, fluentish, env): |
| 149 | + if isinstance(fluentish, FluentType): |
| 150 | + return fluentish.format(env.context._babel_locale) |
| 151 | + return fluentish |
| 152 | + |
149 | 153 |
|
150 | 154 | class TextElement(FTL.TextElement, Literal): |
151 | 155 | def __call__(self, env): |
@@ -189,17 +193,16 @@ def lookup_reference(ref, env): |
189 | 193 | AST node, or FluentNone if not found, including fallback logic |
190 | 194 | """ |
191 | 195 | ref_id = reference_to_id(ref) |
192 | | - |
193 | 196 | try: |
194 | | - return env.context._compiler(env.context._messages_and_terms[ref_id]) |
| 197 | + return env.context.lookup(ref_id) |
195 | 198 | except LookupError: |
196 | 199 | env.errors.append(unknown_reference_error_obj(ref_id)) |
197 | 200 |
|
198 | 201 | if isinstance(ref, AttributeExpression): |
199 | 202 | # Fallback |
200 | 203 | parent_id = reference_to_id(ref.ref) |
201 | 204 | try: |
202 | | - return env.context._compiler(env.context._messages_and_terms[parent_id]) |
| 205 | + return env.context.lookup(parent_id) |
203 | 206 | except LookupError: |
204 | 207 | # Don't add error here, because we already added error for the |
205 | 208 | # actual thing we were looking for. |
@@ -330,10 +333,10 @@ def __call__(self, env): |
330 | 333 |
|
331 | 334 | # TODO What to do if message is not a VariantList? |
332 | 335 | # Need test at least. |
333 | | - assert isinstance(message.value, VariantList) |
| 336 | + assert isinstance(message, VariantList) |
334 | 337 |
|
335 | 338 | variant_name = self.key.name |
336 | | - return message.value.select_from_variant_list(env, variant_name) |
| 339 | + return message.select_from_variant_list(env, variant_name) |
337 | 340 |
|
338 | 341 |
|
339 | 342 | class CallExpression(FTL.CallExpression, BaseResolver): |
@@ -365,6 +368,11 @@ def __call__(self, env): |
365 | 368 | return FluentNoneResolver(function_name + "()") |
366 | 369 |
|
367 | 370 |
|
| 371 | +class NamedArgument(FTL.NamedArgument, BaseResolver): |
| 372 | + def __call__(self, env): |
| 373 | + return self.value(env) |
| 374 | + |
| 375 | + |
368 | 376 | @handle.register(FluentNumber) |
369 | 377 | def handle_fluent_number(number, env): |
370 | 378 | return number.format(env.context._babel_locale) |
|
0 commit comments