Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

fix js codegen allowing underscore after decimal

+154 -20
+2 -2
compiler-core/src/javascript/decision.rs
··· 1 1 use super::{ 2 2 INDENT, bit_array_segment_int_value_to_bytes, 3 - expression::{self, Generator, Ordering, float}, 3 + expression::{self, Generator, Ordering, float, float_from_value}, 4 4 }; 5 5 use crate::{ 6 6 ast::{AssignmentKind, Endianness, SrcSpan, TypedClause, TypedExpr, TypedPattern}, ··· 1024 1024 RuntimeCheck::String { value: expected } => docvec![value, equality, string(expected)], 1025 1025 RuntimeCheck::Float { 1026 1026 float_value: expected, 1027 - } => docvec![value, equality, expected.value()], 1027 + } => docvec![value, equality, float_from_value(expected.value())], 1028 1028 RuntimeCheck::Int { 1029 1029 int_value: expected, 1030 1030 } => docvec![value, equality, expected.clone()],
+17 -1
compiler-core/src/javascript/expression.rs
··· 288 288 TypedExpr::String { value, .. } => string(value), 289 289 290 290 TypedExpr::Int { value, .. } => int(value), 291 - TypedExpr::Float { value, .. } => float(value), 291 + TypedExpr::Float { float_value, .. } => float_from_value(float_value.value()), 292 292 293 293 TypedExpr::List { elements, tail, .. } => { 294 294 self.not_in_tail_position(Some(Ordering::Strict), |this| match tail { ··· 2351 2351 out.push_str(value); 2352 2352 2353 2353 out.to_doc() 2354 + } 2355 + 2356 + pub fn float_from_value(value: f64) -> Document<'static> { 2357 + if value.is_infinite() { 2358 + if value.is_sign_positive() { 2359 + "Infinity".to_doc() 2360 + } else { 2361 + "-Infinity".to_doc() 2362 + } 2363 + } else if value.is_nan() { 2364 + // NOTE: this case is probably unnecessary, as this function is only 2365 + // invoked with `LiteralFloatValue` values, which cannot be nan. 2366 + "NaN".to_doc() 2367 + } else { 2368 + value.to_doc() 2369 + } 2354 2370 } 2355 2371 2356 2372 /// The context where the constant expression is used, it might be inside a
+50
compiler-core/src/javascript/tests/numbers.rs
··· 432 432 } 433 433 434 434 #[test] 435 + fn underscore_after_decimal_point() { 436 + assert_js!( 437 + " 438 + pub fn main() { 439 + 0._1 440 + } 441 + " 442 + ); 443 + } 444 + 445 + #[test] 446 + fn underscore_after_decimal_point_case_statement() { 447 + assert_js!( 448 + " 449 + pub fn main(x) { 450 + case x { 451 + 0._1 -> \"bar\" 452 + _ -> \"foo\" 453 + } 454 + } 455 + " 456 + ); 457 + } 458 + 459 + #[test] 460 + fn inf_float_case_statement() { 461 + assert_js!( 462 + " 463 + pub fn main(x) { 464 + case x { 465 + 100.001e123_456_789 -> \"bar\" 466 + _ -> \"foo\" 467 + } 468 + } 469 + " 470 + ); 471 + } 472 + 473 + #[test] 474 + fn division_inf_by_inf_float() { 475 + assert_js!( 476 + " 477 + pub fn main(x) { 478 + -100.001e123_456_789 /. 100.001e123_456_789 479 + } 480 + " 481 + ); 482 + } 483 + 484 + #[test] 435 485 fn division_by_zero_float() { 436 486 assert_js!( 437 487 "pub fn main() {
+15
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__division_inf_by_inf_float.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "\npub fn main(x) {\n -100.001e123_456_789 /. 100.001e123_456_789\n}\n" 4 + --- 5 + ----- SOURCE CODE 6 + 7 + pub fn main(x) { 8 + -100.001e123_456_789 /. 100.001e123_456_789 9 + } 10 + 11 + 12 + ----- COMPILED JAVASCRIPT 13 + export function main(x) { 14 + return -Infinity / Infinity; 15 + }
+1 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__float_literals.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 23 4 3 expression: "\npub fn go() {\n 1.5\n 2.0\n -0.1\n 1.\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 19 17 1.5; 20 18 2.0; 21 19 -0.1; 22 - return 1.; 20 + return 1.0; 23 21 }
+8 -10
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__float_scientific_literals.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 37 4 3 expression: "\npub fn go() {\n 0.01e-1\n 0.01e-0\n -10.01e-1\n -10.01e-0\n 100.001e523\n -100.001e-523\n 100.001e123_456_789\n -100.001e-123_456_789\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 20 18 21 19 ----- COMPILED JAVASCRIPT 22 20 export function go() { 23 - 0.01e-1; 24 - 0.01e-0; 25 - -10.01e-1; 26 - -10.01e-0; 27 - 100.001e523; 28 - -100.001e-523; 29 - 100.001e123_456_789; 30 - return -100.001e-123_456_789; 21 + 0.001; 22 + 0.01; 23 + -1.001; 24 + -10.01; 25 + Infinity; 26 + -0.0; 27 + Infinity; 28 + return -0.0; 31 29 }
+22
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__inf_float_case_statement.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "\npub fn main(x) {\n case x {\n 100.001e123_456_789 -> \"bar\"\n _ -> \"foo\"\n }\n}\n" 4 + --- 5 + ----- SOURCE CODE 6 + 7 + pub fn main(x) { 8 + case x { 9 + 100.001e123_456_789 -> "bar" 10 + _ -> "foo" 11 + } 12 + } 13 + 14 + 15 + ----- COMPILED JAVASCRIPT 16 + export function main(x) { 17 + if (x === Infinity) { 18 + return "bar"; 19 + } else { 20 + return "foo"; 21 + } 22 + }
+1 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__preceeding_zeros_float.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 264 4 3 expression: "\npub fn main() {\n 09_179.1\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 13 11 14 12 ----- COMPILED JAVASCRIPT 15 13 export function main() { 16 - return 9_179.1; 14 + return 9179.1; 17 15 }
+15
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__underscore_after_decimal_point.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "\npub fn main() {\n 0._1\n}\n" 4 + --- 5 + ----- SOURCE CODE 6 + 7 + pub fn main() { 8 + 0._1 9 + } 10 + 11 + 12 + ----- COMPILED JAVASCRIPT 13 + export function main() { 14 + return 0.1; 15 + }
+22
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__underscore_after_decimal_point_case_statement.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "\npub fn main(x) {\n case x {\n 0._1 -> \"bar\"\n _ -> \"foo\"\n }\n}\n" 4 + --- 5 + ----- SOURCE CODE 6 + 7 + pub fn main(x) { 8 + case x { 9 + 0._1 -> "bar" 10 + _ -> "foo" 11 + } 12 + } 13 + 14 + 15 + ----- COMPILED JAVASCRIPT 16 + export function main(x) { 17 + if (x === 0.1) { 18 + return "bar"; 19 + } else { 20 + return "foo"; 21 + } 22 + }
+1 -1
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__wide_float_div.snap
··· 11 11 12 12 ----- COMPILED JAVASCRIPT 13 13 export function go() { 14 - return 111111111111111111111111111111. / 22222222222222222222222222222222222.; 14 + return 1.111111111111111e29 / 2.222222222222222e34; 15 15 }