|
1 | | -import {Message, Parameter, PatternElement, Selector, StringLiteral, Variant} from "./model.js"; |
| 1 | +import { |
| 2 | + IntegerLiteral, |
| 3 | + Message, |
| 4 | + Parameter, |
| 5 | + PatternElement, |
| 6 | + Selector, |
| 7 | + StringLiteral, |
| 8 | + Variant, |
| 9 | +} from "./model.js"; |
2 | 10 | import {REGISTRY} from "./registry.js"; |
3 | | -import {BooleanValue, NumberValue, RuntimeValue, StringValue} from "./runtime.js"; |
| 11 | +import {BooleanValue, NumberValue, PluralValue, RuntimeValue, StringValue} from "./runtime.js"; |
4 | 12 |
|
5 | 13 | // Resolution context for a single formatMessage() call. |
6 | 14 |
|
@@ -95,12 +103,31 @@ export class FormattingContext { |
95 | 103 | } |
96 | 104 | } |
97 | 105 |
|
98 | | - // TODO(stasm): Add NumberLiterals as keys (maybe). |
99 | | - function matches_corresponding_selector(key: StringLiteral, idx: number) { |
100 | | - return ( |
101 | | - key.value === resolved_selectors[idx].value?.value || |
102 | | - key.value === resolved_selectors[idx].default |
103 | | - ); |
| 106 | + function matches_corresponding_selector(key: StringLiteral | IntegerLiteral, idx: number) { |
| 107 | + let selector = resolved_selectors[idx]; |
| 108 | + switch (key.type) { |
| 109 | + case "StringLiteral": { |
| 110 | + if (key.value === selector.value?.value) { |
| 111 | + return true; |
| 112 | + } |
| 113 | + break; |
| 114 | + } |
| 115 | + case "IntegerLiteral": { |
| 116 | + let num = parseInt(key.value); |
| 117 | + if (selector.value instanceof NumberValue) { |
| 118 | + if (num === selector.value.value) { |
| 119 | + return true; |
| 120 | + } |
| 121 | + } else if (selector.value instanceof PluralValue) { |
| 122 | + if (key.value === selector.value.value || num === selector.value.count) { |
| 123 | + return true; |
| 124 | + } |
| 125 | + } |
| 126 | + break; |
| 127 | + } |
| 128 | + } |
| 129 | + |
| 130 | + return key.value === selector.default; |
104 | 131 | } |
105 | 132 |
|
106 | 133 | for (let variant of variants) { |
|
0 commit comments