diff --git a/compiler/ml/unified_ops.ml b/compiler/ml/unified_ops.ml index 997606135e..99ad08e353 100644 --- a/compiler/ml/unified_ops.ml +++ b/compiler/ml/unified_ops.ml @@ -187,6 +187,19 @@ let entries = string = None; }; }; + { + path = builtin "|"; + name = "%bitor"; + form = Binary; + specialization = + { + int = Porint; + bool = None; + float = None; + bigint = Some Porbigint; + string = None; + }; + }; |] let index_by_path = diff --git a/compiler/syntax/src/res_parsetree_viewer.ml b/compiler/syntax/src/res_parsetree_viewer.ml index 5305bd3fc2..f33c2e16c1 100644 --- a/compiler/syntax/src/res_parsetree_viewer.ml +++ b/compiler/syntax/src/res_parsetree_viewer.ml @@ -272,12 +272,13 @@ let operator_precedence operator = | ":=" -> 1 | "||" -> 2 | "&&" -> 3 - | "^" -> 4 - | "==" | "===" | "<" | ">" | "!=" | "<>" | "!==" | "<=" | ">=" | "|>" -> 5 - | "+" | "+." | "-" | "-." | "++" -> 6 - | "*" | "*." | "/" | "/." | "%" -> 7 - | "**" -> 8 - | "#" | "##" | "->" -> 9 + | "|" -> 4 + | "^" -> 5 + | "==" | "===" | "<" | ">" | "!=" | "<>" | "!==" | "<=" | ">=" | "|>" -> 6 + | "+" | "+." | "-" | "-." | "++" -> 7 + | "*" | "*." | "/" | "/." | "%" -> 8 + | "**" -> 9 + | "#" | "##" | "->" -> 10 | _ -> 0 let is_unary_operator operator = @@ -300,7 +301,7 @@ let is_binary_operator operator = match operator with | ":=" | "||" | "&&" | "==" | "===" | "<" | ">" | "!=" | "!==" | "<=" | ">=" | "|>" | "+" | "+." | "-" | "-." | "++" | "*" | "*." | "/" | "/." | "**" - | "->" | "<>" | "%" | "^" -> + | "->" | "<>" | "%" | "^" | "|" -> true | _ -> false diff --git a/compiler/syntax/src/res_token.ml b/compiler/syntax/src/res_token.ml index 29d2b503d4..595e6bdbc3 100644 --- a/compiler/syntax/src/res_token.ml +++ b/compiler/syntax/src/res_token.ml @@ -79,6 +79,7 @@ type t = | Lor | Band (* Bitwise and: & *) | Caret + | BangEqual | BangEqualEqual | LessEqual @@ -103,15 +104,16 @@ let precedence = function | HashEqual | ColonEqual -> 1 | Lor -> 2 | Land -> 3 - | Caret -> 4 + | Bar -> 4 + | Caret -> 5 | Equal | EqualEqual | EqualEqualEqual | LessThan | GreaterThan | BangEqual | BangEqualEqual | LessEqual | GreaterEqual | BarGreater -> - 5 - | Plus | PlusDot | Minus | MinusDot | PlusPlus -> 6 - | Asterisk | AsteriskDot | Forwardslash | ForwardslashDot | Percent -> 7 - | Exponentiation -> 8 - | MinusGreater -> 9 - | Dot -> 10 + 6 + | Plus | PlusDot | Minus | MinusDot | PlusPlus -> 7 + | Asterisk | AsteriskDot | Forwardslash | ForwardslashDot | Percent -> 8 + | Exponentiation -> 9 + | MinusGreater -> 10 + | Dot -> 11 | _ -> 0 let to_string = function diff --git a/runtime/Pervasives.res b/runtime/Pervasives.res index 6d997a603f..c8b5da7831 100644 --- a/runtime/Pervasives.res +++ b/runtime/Pervasives.res @@ -68,6 +68,7 @@ external \"%": ('a, 'a) => 'a = "%mod" external mod: ('a, 'a) => 'a = "%mod" external \"**": ('a, 'a) => 'a = "%pow" external \"^": ('a, 'a) => 'a = "%bitxor" +external \"|": ('a, 'a) => 'a = "%bitor" /* Comparisons */ /* Note: Later comparisons will be converted to unified operations too */ diff --git a/tests/syntax_tests/data/parsing/grammar/expressions/binary.res b/tests/syntax_tests/data/parsing/grammar/expressions/binary.res index 224eb2da39..3c9d60e15f 100644 --- a/tests/syntax_tests/data/parsing/grammar/expressions/binary.res +++ b/tests/syntax_tests/data/parsing/grammar/expressions/binary.res @@ -29,6 +29,7 @@ let x = a + -1 + -2 let x = a + @attr -1 + @attr -2 let x = a % a == 0 let x = a ^ a == 0 +let x = a | a == a // should be interpreted as binary expression not prefix op let x = a -b diff --git a/tests/syntax_tests/data/printer/expr/binary.res b/tests/syntax_tests/data/printer/expr/binary.res index 6f43115a00..b68f625ca2 100644 --- a/tests/syntax_tests/data/printer/expr/binary.res +++ b/tests/syntax_tests/data/printer/expr/binary.res @@ -55,6 +55,7 @@ x + y / z x / y + z x % y * z x ^ y + z +x | y + z 100 * x / total 2 / 3 * 10 / 2 + 2 let rotateX = ((range / rect.height) * refY - range / 2) * getXMultiplication(rect.width) diff --git a/tests/tests/src/belt_int_test.res b/tests/tests/src/belt_int_test.res index 0c77875493..701c7d35df 100644 --- a/tests/tests/src/belt_int_test.res +++ b/tests/tests/src/belt_int_test.res @@ -42,5 +42,6 @@ describe(__MODULE__, () => { eq(__LOC__, 2 / 3, 0) eq(__LOC__, 2 % 2, 0) eq(__LOC__, 2 ^ 3, 1) + eq(__LOC__, 2 | 3, 3) }) }) diff --git a/tests/tests/src/unified_ops_test.res b/tests/tests/src/unified_ops_test.res index d98d453837..ffb58efa0f 100644 --- a/tests/tests/src/unified_ops_test.res +++ b/tests/tests/src/unified_ops_test.res @@ -29,3 +29,6 @@ let pow_overflow = 2147483647 ** 2 let bxor_int = (a, b) => a ^ b let bxor_bigint = (a: bigint, b) => a ^ b + +let bitor_int = (a, b) => a | b +let bitor_bigint = (a: bigint, b) => a | b