diff --git a/scalameta/tokenizers/shared/src/main/scala/scala/meta/internal/tokenizers/LegacyTokenData.scala b/scalameta/tokenizers/shared/src/main/scala/scala/meta/internal/tokenizers/LegacyTokenData.scala index ef5905d231..6492c559d5 100644 --- a/scalameta/tokenizers/shared/src/main/scala/scala/meta/internal/tokenizers/LegacyTokenData.scala +++ b/scalameta/tokenizers/shared/src/main/scala/scala/meta/internal/tokenizers/LegacyTokenData.scala @@ -2,6 +2,9 @@ package scala.meta package internal package tokenizers +import java.math.MathContext +import java.math.RoundingMode + import scala.meta.inputs._ trait LegacyTokenData { @@ -114,6 +117,9 @@ trait LegacyTokenData { } object LegacyTokenData { - private val bigDecimalMaxFloat = BigDecimal(Float.MaxValue) - private val bigDecimalMaxDouble = BigDecimal(Double.MaxValue) + // add a bit more, JS doesn't handle it well + private val bigDecimalMaxFloat = + BigDecimal.binary(Float.MaxValue, new MathContext(8, RoundingMode.UP)) + private val bigDecimalMaxDouble = + BigDecimal.binary(Double.MaxValue, new MathContext(32, RoundingMode.UP)) } diff --git a/tests/shared/src/test/scala/scala/meta/tests/parsers/LitSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/parsers/LitSuite.scala index e19adbc7c3..7831566775 100644 --- a/tests/shared/src/test/scala/scala/meta/tests/parsers/LitSuite.scala +++ b/tests/shared/src/test/scala/scala/meta/tests/parsers/LitSuite.scala @@ -374,4 +374,136 @@ class LitSuite extends ParseSuite { runTestAssert[Stat](code)(tree) } + Seq( + ("0d", 0d), + ("0.0", 0d), + ("00e0", 0d), + ("00e0f", 0f), + ("0xe1", 225), + ("0xd", 13), + ("0f", 0f), + ("0.0f", 0f), + ("0xf", 15), + ("0", 0), + ("0l", 0L), + ("0L", 0L), + ("0x80000000", -2147483648), + ("0x8000000000000000L", -9223372036854775808L), + ("3.4028235e38f", Float.MaxValue), + ("-3.4028235e38f", Float.MinValue), + ("1.7976931348623157e+308d", Double.MaxValue), + ("-1.7976931348623157e+308d", Double.MinValue), + ("0b00101010", 42), + ("0B_0010_1010", 42), + ("0b_0010_1010L", 42L) + ).foreach { case (code, expected) => + test(s"numeric literal ok scala213: $code") { + parseStat(code, Scala213) match { + case lit: Lit => assertEquals(lit.value, expected) + } + } + } + + Seq( + ( + "0.f", + Term.Select(lit(0), tname("f")) + ), + ( + "1.0 + 2.0f", + Term.ApplyInfix(lit(1d), tname("+"), Nil, List(lit(2f))) + ), + ( + "1d + 2f", + Term.ApplyInfix(lit(1d), tname("+"), Nil, List(lit(2f))) + ), + ( + "0b01.toString", + Term.Select(lit(1), tname("toString")) + ) + ).foreach { case (code, tree: Tree) => + test(s"expr with numeric literal ok scala213: $code") { + runTestAssert[Stat](code, None)(tree) + } + } + + Seq( + ( + "00", + """|:1: error: Non-zero integral values may not have a leading zero. + |00 + |^""".stripMargin + ), + ( + "00l", + """|:1: error: Non-zero integral values may not have a leading zero. + |00l + |^""".stripMargin + ), + ( + "0b01d", + """|:1: error: Invalid literal number, followed by identifier character + |0b01d + | ^""".stripMargin + ), + ( + "0b01f", + """|:1: error: Invalid literal number, followed by identifier character + |0b01f + | ^""".stripMargin + ), + ( + "0b0123", + """|:1: error: Invalid literal number, followed by identifier character + |0b0123 + | ^""".stripMargin + ), + ( + "0b01.2", + """|:1: error: ; expected but double constant found + |0b01.2 + | ^""".stripMargin + ), + ( + "1. + 2.", + """|:1: error: ; expected but integer constant found + |1. + 2. + | ^""".stripMargin + ), + ( + ".f", + """|:1: error: illegal start of definition . + |.f + |^""".stripMargin + ), + ( + "3.4028236e38f", + """|:1: error: floating-point value out of range for Float + |3.4028236e38f + |^""".stripMargin + ), + ( + "-3.4028236e38f", + """|:1: error: floating-point value out of range for Float + |-3.4028236e38f + | ^""".stripMargin + ), + ( + "1.7976931348623158e+308d", + """|:1: error: floating-point value out of range for Double + |1.7976931348623158e+308d + |^""".stripMargin + ), + ( + "-1.7976931348623158e+308d", + """|:1: error: floating-point value out of range for Double + |-1.7976931348623158e+308d + | ^""".stripMargin + ) + ).foreach { case (code, error) => + test(s"numeric literal fail scala213: $code") { + runTestError[Stat](code, error) + } + } + } diff --git a/tests/shared/src/test/scala/scala/meta/tests/tokenizers/TokenizerSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/tokenizers/TokenizerSuite.scala index 48e56d9e24..8d883a9963 100644 --- a/tests/shared/src/test/scala/scala/meta/tests/tokenizers/TokenizerSuite.scala +++ b/tests/shared/src/test/scala/scala/meta/tests/tokenizers/TokenizerSuite.scala @@ -1493,33 +1493,33 @@ class TokenizerSuite extends BaseTokenizerSuite { |""".stripMargin ), ( - "3.40e+38f", + "3.4028235e38f", """|BOF [0..0) - |Constant.Float(3.40e+38f) [0..9) - |EOF [9..9) + |Constant.Float(3.4028235e38f) [0..13) + |EOF [13..13) |""".stripMargin ), ( - "-3.40e+38f", + "-3.4028235e38f", """|BOF [0..0) |Ident(-) [0..1) - |Constant.Float(3.40e+38f) [1..10) - |EOF [10..10) + |Constant.Float(3.4028235e38f) [1..14) + |EOF [14..14) |""".stripMargin ), ( - "1.79e+308d", + "1.7976931348623157e+308d", """|BOF [0..0) - |Constant.Double(1.79e+308d) [0..10) - |EOF [10..10) + |Constant.Double(1.7976931348623157e+308d) [0..24) + |EOF [24..24) |""".stripMargin ), ( - "-1.79e+308d", + "-1.7976931348623157e+308d", """|BOF [0..0) |Ident(-) [0..1) - |Constant.Double(1.79e+308d) [1..11) - |EOF [11..11) + |Constant.Double(1.7976931348623157e+308d) [1..25) + |EOF [25..25) |""".stripMargin ), ( @@ -1598,27 +1598,27 @@ class TokenizerSuite extends BaseTokenizerSuite { | ^""".stripMargin ), ( - "3.41e+38f", + "3.4028236e38f", """|:1: error: floating-point value out of range for Float - |3.41e+38f + |3.4028236e38f |^""".stripMargin ), ( - "-3.41e+38f", + "-3.4028236e38f", """|:1: error: floating-point value out of range for Float - |-3.41e+38f + |-3.4028236e38f | ^""".stripMargin ), ( - "1.80e+308d", + "1.7976931348623158e+308d", """|:1: error: floating-point value out of range for Double - |1.80e+308d + |1.7976931348623158e+308d |^""".stripMargin ), ( - "-1.80e+308d", + "-1.7976931348623158e+308d", """|:1: error: floating-point value out of range for Double - |-1.80e+308d + |-1.7976931348623158e+308d | ^""".stripMargin ) ).foreach { case (code, error) =>