Skip to content

Commit aaf3a03

Browse files
authored
Merge pull request #343 from knockout/pc/342-parser-wrong-operator-precedence
Fix operator precedence values to match MDN specification
2 parents d823f22 + 3e7a37a commit aaf3a03

1 file changed

Lines changed: 62 additions & 55 deletions

File tree

packages/utils.parser/src/operators.ts

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,22 @@ export interface Operators {
2929
function looseEqual(a, b) {
3030
return a == b
3131
}
32-
looseEqual.precedence = 10
32+
looseEqual.precedence = 8
3333

3434
function looseNotEqual(a, b) {
3535
return a != b
3636
}
37-
looseNotEqual.precedence = 10
37+
looseNotEqual.precedence = 8
3838

3939
function strictEqual(a, b) {
4040
return a === b
4141
}
42-
strictEqual.precedence = 10
42+
strictEqual.precedence = 8
4343

4444
function strictNotEqual(a, b) {
4545
return a !== b
4646
}
47-
strictNotEqual.precedence = 10
47+
strictNotEqual.precedence = 8
4848

4949
const operators: Operators = {
5050
// unary
@@ -157,69 +157,76 @@ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Oper
157157
operators['@'].precedence = 21
158158
operators['#'].precedence = 21
159159

160-
// Member
161-
operators['.'].precedence = 19
162-
operators['['].precedence = 19
163-
operators['?.'].precedence = 19
160+
// Member access and call
161+
operators['.'].precedence = 17
162+
operators['['].precedence = 17
163+
operators['?.'].precedence = 17
164164

165-
// Logical not
166-
operators['!'].precedence = 16
167-
operators['!!'].precedence = 16 // explicit double-negative
165+
// Prefix operators
166+
operators['!'].precedence = 14
167+
operators['!!'].precedence = 14 // explicit double-negative
168168

169169
// Prefix inc/dec
170-
operators['++'].precedence = 16
171-
operators['--'].precedence = 16
172-
operators['&-'].precedence = 16
173-
174-
// exponent
175-
operators['**'].precedence = 15
176-
177-
// mul/div/remainder
178-
operators['%'].precedence = 14
179-
operators['*'].precedence = 14
180-
operators['/'].precedence = 14
181-
182-
// add/sub
183-
operators['+'].precedence = 13
184-
operators['-'].precedence = 13
185-
186-
// bitwise
187-
operators['|'].precedence = 12
188-
operators['^'].precedence = 11
189-
operators['&'].precedence = 10
190-
191-
// comparison
192-
operators['<'].precedence = 11
193-
operators['<='].precedence = 11
194-
operators['>'].precedence = 11
195-
operators['>='].precedence = 11
196-
197-
// operators['in'].precedence = 8;
198-
// operators['instanceof'].precedence = 8;
199-
// equality
200-
operators['=='].precedence = 10
201-
operators['!='].precedence = 10
202-
operators['==='].precedence = 10
203-
operators['!=='].precedence = 10
204-
205-
// logic
206-
operators['&&'].precedence = 6
207-
operators['||'].precedence = 5
208-
operators['??'].precedence = 5
170+
operators['++'].precedence = 14
171+
operators['--'].precedence = 14
172+
operators['&-'].precedence = 14
173+
174+
// Exponentiation
175+
operators['**'].precedence = 13
176+
177+
// Multiplicative
178+
operators['%'].precedence = 12
179+
operators['*'].precedence = 12
180+
operators['/'].precedence = 12
181+
182+
// Additive
183+
operators['+'].precedence = 11
184+
operators['-'].precedence = 11
185+
186+
// Relational
187+
operators['<'].precedence = 9
188+
operators['<='].precedence = 9
189+
operators['>'].precedence = 9
190+
operators['>='].precedence = 9
191+
192+
// operators['in'].precedence = 9;
193+
// operators['instanceof'].precedence = 9;
194+
195+
// Equality
196+
operators['=='].precedence = 8
197+
operators['!='].precedence = 8
198+
operators['==='].precedence = 8
199+
operators['!=='].precedence = 8
200+
201+
// Bitwise AND
202+
operators['&'].precedence = 7
203+
204+
// Bitwise XOR
205+
operators['^'].precedence = 6
206+
207+
// Bitwise OR
208+
operators['|'].precedence = 5
209+
210+
// Logical AND
211+
operators['&&'].precedence = 4
212+
213+
// Logical OR / Nullish coalescing
214+
operators['||'].precedence = 3
215+
operators['??'].precedence = 3
209216

210217
operators['&&'].earlyOut = a => !a
211218
operators['||'].earlyOut = a => a
212219
operators['??'].earlyOut = a => a
213220

214-
// multiple values
215-
operators[','].precedence = 2
221+
// Assignment and miscellaneous (lamda)
222+
operators['=>'].precedence = 2
223+
224+
// Comma, multiple values
225+
operators[','].precedence = 1
216226

217227
// Call a function
218228
operators['call'].precedence = 1
219229

220-
// lambda
221-
operators['=>'].precedence = 1
222-
223230
// Extend the Options type so ko.options.strictEquality is strongly typed
224231
declare module '@tko/utils' {
225232
interface Options {

0 commit comments

Comments
 (0)