Skip to content

Commit d8f9bd0

Browse files
committed
Longlit deprecation is -Xlint:longlit
1 parent 8fda311 commit d8f9bd0

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import dotty.tools.dotc.core.Contexts._
1010
import dotty.tools.dotc.rewrites.Rewrites
1111
import dotty.tools.io.{AbstractFile, Directory, JDK9Reflectors, PlainDirectory}
1212

13-
import scala.util.chaining._
13+
import scala.util.chaining.given
1414

1515
class ScalaSettings extends SettingGroup with AllScalaSettings
1616

@@ -156,6 +156,8 @@ private sealed trait WarningSettings:
156156
self: SettingGroup =>
157157
val Whelp: Setting[Boolean] = BooleanSetting("-W", "Print a synopsis of warning options.")
158158
val XfatalWarnings: Setting[Boolean] = BooleanSetting("-Werror", "Fail the compilation if there are any warnings.", aliases = List("-Xfatal-warnings"))
159+
val Xlint: Setting[List[String]] = EnumSetting("-Wlint", "warning", "Enable recommended warnings.", LintWarning.values, default = Nil, aliases = List("-Xlint"))
160+
def isLintEnabled(w: LintWarning)(using Context): Boolean = Xlint.value.contains(w.toString)
159161

160162
val Wunused: Setting[List[String]] = MultiChoiceSetting(
161163
name = "-Wunused",
@@ -339,3 +341,7 @@ private sealed trait YSettings:
339341
val YforceInlineWhileTyping: Setting[Boolean] = BooleanSetting("-Yforce-inline-while-typing", "Make non-transparent inline methods inline when typing. Emulates the old inlining behavior of 3.0.0-M3.")
340342
end YSettings
341343

344+
/** Warnings that may be queried with `ctx.settings.isLintEnabled`. */
345+
enum LintWarning:
346+
case deprecation, longLit
347+
end LintWarning

compiler/src/dotty/tools/dotc/config/Settings.scala

+6-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import dotty.tools.io.{AbstractFile, Directory, JarArchive, PlainDirectory}
99

1010
import annotation.tailrec
1111
import collection.mutable.ArrayBuffer
12-
import reflect.ClassTag
12+
import reflect.{ClassTag, Enum}
1313
import scala.util.{Success, Failure}
1414

1515
object Settings:
@@ -61,7 +61,8 @@ object Settings:
6161
prefix: String = "",
6262
aliases: List[String] = Nil,
6363
depends: List[(Setting[?], Any)] = Nil,
64-
propertyClass: Option[Class[?]] = None)(private[Settings] val idx: Int) {
64+
propertyClass: Option[Class[?]] = None,
65+
)(private[Settings] val idx: Int) {
6566

6667
private var changed: Boolean = false
6768

@@ -265,6 +266,9 @@ object Settings:
265266
def MultiChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String], default: List[String], aliases: List[String] = Nil): Setting[List[String]] =
266267
publish(Setting(name, descr, default, helpArg, Some(choices), aliases = aliases))
267268

269+
def EnumSetting[E <: Enum](name: String, helpArg: String, descr: String, choices: Array[E], default: List[String], aliases: List[String] = Nil): Setting[List[String]] =
270+
publish(Setting(name, descr, default, helpArg, Some(choices.toList.map(_.toString)), aliases = aliases))
271+
268272
def IntSetting(name: String, descr: String, default: Int, aliases: List[String] = Nil): Setting[Int] =
269273
publish(Setting(name, descr, default, aliases = aliases))
270274

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import util.Chars._
1111
import util.{SourcePosition, CharBuffer}
1212
import util.Spans.Span
1313
import config.Config
14+
import config.LintWarning
1415
import Tokens._
1516
import scala.annotation.{switch, tailrec}
1617
import scala.collection.mutable
@@ -1488,7 +1489,7 @@ object Scanners {
14881489
getFraction()
14891490
// 1l is an acknowledged bad practice
14901491
def lintel(): Unit =
1491-
if ch == 'l' then
1492+
if ch == 'l' && ctx.settings.isLintEnabled(LintWarning.longLit) then
14921493
val msg = "Lowercase el for long is not recommended because it is easy to confuse with numeral 1; use uppercase L instead"
14931494
report.deprecationWarning(msg, sourcePos(offset + litBuf.length))
14941495
// after int: 5e7f, 42L, 42.toDouble but not 42b.

tests/neg/longlit.scala

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// scalac: -Werror -Xlint:longLit,deprecation -deprecation
2+
3+
trait DejectedLiterals:
4+
5+
def bad = 1l // error
6+
7+
def worse = 123l // error
8+
9+
def worstest = 32l // error
10+
11+
// Lowercase el for long is not recommended because it is easy to confuse with numeral 1; use uppercase L instead

0 commit comments

Comments
 (0)