summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/interpreter/Naming.scala
blob: 396f2deeba2d3a0278a459fafa900300309e4d02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* NSC -- new Scala compiler
 * Copyright 2005-2011 LAMP/EPFL
 * @author  Paul Phillips
 */

package scala.tools.nsc
package interpreter

trait Naming {
  val global: Global

  import global.{ Name, nme }
  import nme.{
    INTERPRETER_VAR_PREFIX, INTERPRETER_SYNTHVAR_PREFIX, INTERPRETER_LINE_PREFIX
  }

  /** Generates names pre0, pre1, etc. via calls to apply method */
  class NameCreator(pre: String) {
    private var x = -1
    var mostRecent: String = ""

    def apply(): String = {
      x += 1
      mostRecent = pre + x.toString
      mostRecent
    }
    def reset(): Unit = x = -1
    def didGenerate(name: String) =
      (name startsWith pre) && ((name drop pre.length) forall (_.isDigit))
  }

  private lazy val line        = new NameCreator(INTERPRETER_LINE_PREFIX)     // line name, like line$0
  private lazy val userVar     = new NameCreator(INTERPRETER_VAR_PREFIX)      // var name, like res0
  private lazy val internalVar = new NameCreator(INTERPRETER_SYNTHVAR_PREFIX) // internal var name, like $synthvar0

  def isUserVarName(name: String)              = userVar didGenerate name
  def isInternalVarName(name: String): Boolean = internalVar didGenerate name
  def isInternalVarName(name: Name): Boolean   = internalVar didGenerate name.toString

  def freshLineName()        = line()
  def freshUserVarName()     = userVar()
  def freshInternalVarName() = internalVar()

  def resetAllCreators() {
    line.reset()
    userVar.reset()
    internalVar.reset()
  }

  def mostRecentVar = userVar.mostRecent
}