Skip to content

Commit 654693f

Browse files
committed
fix(mf2): Drop forward-reference error, extend duplicate-declaration instead
1 parent 11c95da commit 654693f

File tree

2 files changed

+11
-24
lines changed

2 files changed

+11
-24
lines changed

packages/mf2-messageformat/src/data-model/validate.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { MessageDataModelError } from '../errors.js';
2-
import type {
3-
Expression,
4-
Message,
5-
MessageNode,
6-
VariableRef,
7-
Variant
8-
} from './types.js';
2+
import type { Expression, Message, MessageNode, Variant } from './types.js';
93
import { visit } from './visit.js';
104

115
/**
@@ -55,19 +49,16 @@ export function validate(
5549
/** Tracks declared variables for `duplicate-declaration` */
5650
const declared = new Set<string>();
5751

58-
const declRefs = new Map<string, VariableRef[]>();
5952
const functions = new Set<string>();
6053
const localVars = new Set<string>();
6154
const variables = new Set<string>();
6255

56+
let setArgAsDeclared = true;
6357
visit(msg, {
6458
declaration(decl) {
6559
// Skip all ReservedStatement
6660
if (!decl.name) return undefined;
6761

68-
if (declared.has(decl.name)) onError('duplicate-declaration', decl);
69-
else declared.add(decl.name);
70-
7162
if (
7263
decl.value.annotation ||
7364
(decl.type === 'local' &&
@@ -79,12 +70,10 @@ export function validate(
7970

8071
if (decl.type === 'local') localVars.add(decl.name);
8172

73+
setArgAsDeclared = decl.type === 'local';
8274
return () => {
83-
for (const ref of declRefs.get(decl.name) ?? []) {
84-
if (decl.type !== 'input' || ref !== decl.value.arg) {
85-
onError('forward-reference', ref);
86-
}
87-
}
75+
if (declared.has(decl.name)) onError('duplicate-declaration', decl);
76+
else declared.add(decl.name);
8877
};
8978
},
9079

@@ -112,13 +101,14 @@ export function validate(
112101
}
113102
},
114103

115-
value(value, context) {
104+
value(value, context, position) {
116105
if (value.type === 'variable') {
117106
variables.add(value.name);
118-
if (context === 'declaration') {
119-
const prev = declRefs.get(value.name);
120-
if (prev) prev.push(value);
121-
else declRefs.set(value.name, [value]);
107+
if (
108+
context === 'declaration' &&
109+
(position !== 'arg' || setArgAsDeclared)
110+
) {
111+
declared.add(value.name);
122112
}
123113
}
124114
},

packages/mf2-messageformat/src/errors.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export class MessageSyntaxError extends MessageError {
3434
| 'duplicate-declaration'
3535
| 'duplicate-option'
3636
| 'extra-content'
37-
| 'forward-reference'
3837
| 'key-mismatch'
3938
| 'parse-error'
4039
| 'missing-fallback'
@@ -65,7 +64,6 @@ export class MessageSyntaxError extends MessageError {
6564
break;
6665
case 'duplicate-declaration':
6766
case 'duplicate-option':
68-
case 'forward-reference':
6967
case 'key-mismatch':
7068
case 'missing-fallback':
7169
case 'missing-selector-annotation':
@@ -97,7 +95,6 @@ export class MessageDataModelError extends MessageSyntaxError {
9795
declare type:
9896
| 'duplicate-declaration'
9997
| 'duplicate-option'
100-
| 'forward-reference'
10198
| 'key-mismatch'
10299
| 'missing-fallback'
103100
| 'missing-selector-annotation';

0 commit comments

Comments
 (0)