aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/parsing/Scanners.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-09-10 20:58:34 +0200
committerMartin Odersky <odersky@gmail.com>2016-10-02 16:11:21 +0200
commitd575e585389b025d7b8056bcb43fea67dddd15d0 (patch)
tree657453c9e17f109e29ead11d52807d1e335930ae /src/dotty/tools/dotc/parsing/Scanners.scala
parente93b7bfe770c8950a52d17bb0aebd3e0a5e93b3c (diff)
downloaddotty-d575e585389b025d7b8056bcb43fea67dddd15d0.tar.gz
dotty-d575e585389b025d7b8056bcb43fea67dddd15d0.tar.bz2
dotty-d575e585389b025d7b8056bcb43fea67dddd15d0.zip
Make inline a keyword
`inline` is now a modifier keyword. To keep disruption tolerable, we still allow `@inline` as an annotation as well. Other uses of `inline` are supported only under `-language:Scala2` and are rewritten to identifiers in backticks.
Diffstat (limited to 'src/dotty/tools/dotc/parsing/Scanners.scala')
-rw-r--r--src/dotty/tools/dotc/parsing/Scanners.scala29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/parsing/Scanners.scala b/src/dotty/tools/dotc/parsing/Scanners.scala
index b46ab6348..a1a21583c 100644
--- a/src/dotty/tools/dotc/parsing/Scanners.scala
+++ b/src/dotty/tools/dotc/parsing/Scanners.scala
@@ -12,7 +12,7 @@ import scala.annotation.{ switch, tailrec }
import scala.collection.mutable
import mutable.ListBuffer
import Utility.isNameStart
-
+import rewrite.Rewrites.patch
object Scanners {
@@ -108,6 +108,7 @@ object Scanners {
target.token = toToken(idx)
}
}
+
def toToken(idx: Int): Token
/** Clear buffer and set string */
@@ -212,8 +213,22 @@ object Scanners {
/** A buffer for comments */
val commentBuf = new StringBuilder
+ private def handleMigration(keyword: Token): Token =
+ if (!isScala2Mode) keyword
+ else if (keyword == INLINE) treatAsIdent()
+ else keyword
+
+
+ private def treatAsIdent() = {
+ testScala2Mode(i"$name is now a keyword, put in `...` to keep as an identifier")
+ patch(source, Position(offset), "`")
+ patch(source, Position(offset + name.length), "`")
+ IDENTIFIER
+ }
+
def toToken(idx: Int): Token =
- if (idx >= 0 && idx <= lastKeywordStart) kwArray(idx) else IDENTIFIER
+ if (idx >= 0 && idx <= lastKeywordStart) handleMigration(kwArray(idx))
+ else IDENTIFIER
private class TokenData0 extends TokenData
@@ -235,6 +250,16 @@ object Scanners {
*/
var sepRegions: List[Token] = List()
+// Scala 2 compatibility
+
+ val isScala2Mode = ctx.settings.language.value.contains(nme.Scala2.toString)
+
+ /** Cannot use ctx.featureEnabled because accessing the context would force too much */
+ def testScala2Mode(msg: String, pos: Position = Position(offset)) = {
+ if (isScala2Mode) ctx.migrationWarning(msg, source atPos pos)
+ isScala2Mode
+ }
+
// Get next token ------------------------------------------------------------
/** Are we directly in a string interpolation expression?