diff options
author | Adriaan Moors <adriaan@lightbend.com> | 2016-12-19 15:30:54 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-19 15:30:54 -0800 |
commit | 56fb9172756d95ef903c36efcf54f1ae95c64b4b (patch) | |
tree | 5fd366037ff241337737cdd3ad9e8a31edb4e767 /src/compiler/scala/tools | |
parent | bba42ff5d410127c8fd9be0073a6eda91b8029d1 (diff) | |
parent | 582c8a2fdd1d5b3cacff982b0c4af0a7dd37b651 (diff) | |
download | scala-56fb9172756d95ef903c36efcf54f1ae95c64b4b.tar.gz scala-56fb9172756d95ef903c36efcf54f1ae95c64b4b.tar.bz2 scala-56fb9172756d95ef903c36efcf54f1ae95c64b4b.zip |
Merge pull request #5539 from som-snytt/issue/10068
SI-10068 Only permit elidable methods
Diffstat (limited to 'src/compiler/scala/tools')
3 files changed, 21 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 5455111674..7be65431db 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -84,7 +84,10 @@ trait ScalaSettings extends AbsScalaSettings * though this helper. */ def isScala211: Boolean = source.value >= ScalaVersion("2.11.0") - def isScala212: Boolean = source.value >= ScalaVersion("2.12.0") + private[this] val version212 = ScalaVersion("2.12.0") + def isScala212: Boolean = source.value >= version212 + private[this] val version213 = ScalaVersion("2.13.0") + def isScala213: Boolean = source.value >= version213 /** * -X "Advanced" settings diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index ea3c7da014..096b6b9263 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -410,8 +410,17 @@ abstract class UnCurry extends InfoTransform def isLiftedLambdaMethod(funSym: Symbol) = funSym.isArtifact && funSym.name.containsName(nme.ANON_FUN_NAME) && funSym.isLocalToBlock + def checkIsElisible(sym: Symbol): Boolean = + (sym ne null) && sym.elisionLevel.exists { level => + if (sym.isMethod) level < settings.elidebelow.value + else { + if (settings.isScala213) reporter.error(sym.pos, s"${sym.name}: Only methods can be marked @elidable!") + false + } + } + val result = - if ((sym ne null) && sym.elisionLevel.exists(_ < settings.elidebelow.value)) + if (checkIsElisible(sym)) replaceElidableTree(tree) else translateSynchronized(tree) match { case dd @ DefDef(mods, name, tparams, _, tpt, rhs) => diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 08cd5e5450..296d9c6bca 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -1412,6 +1412,12 @@ abstract class RefChecks extends Transform { transformTrees(annots flatMap (_.args)) } + def checkIsElisible(sym: Symbol) = if (sym ne null) sym.elisionLevel.foreach { level => + if (!sym.isMethod || sym.isAccessor || sym.isLazy || sym.isDeferred) + reporter.error(sym.pos, s"${sym.name}: Only methods can be marked @elidable.") + } + if (settings.isScala213) checkIsElisible(tree.symbol) + tree match { case m: MemberDef => val sym = m.symbol @@ -1425,7 +1431,7 @@ abstract class RefChecks extends Transform { analyzer.ImplicitAmbiguousMsg.check(sym) foreach messageWarning("implicitAmbiguous") case tpt@TypeTree() => - if(tpt.original != null) { + if (tpt.original != null) { tpt.original foreach { case dc@TypeTreeWithDeferredRefCheck() => applyRefchecksToAnnotations(dc.check()) // #2416 |