summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala
blob: c69dd23c40114144aafe34a1419eeda2a05045c5 (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
/* NSC -- new Scala compiler
 * Copyright 2005-2013 LAMP/EPFL
 * @author  Martin Odersky
 */

package scala.reflect.internal
package util

import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicLong
import scala.reflect.NameTransformer

class FreshNameCreator(creatorPrefix: String = "") {
  protected val counters = new ConcurrentHashMap[String, AtomicLong]()

  /**
   * Create a fresh name with the given prefix. It is guaranteed
   * that the returned name has never been returned by a previous
   * call to this function (provided the prefix does not end in a digit).
   */
  def newName(prefix: String): String = {
    val safePrefix = NameTransformer.encode(prefix)
    counters.putIfAbsent(safePrefix, new AtomicLong(0))
    val idx = counters.get(safePrefix).incrementAndGet()
    s"$creatorPrefix$safePrefix$idx"
  }
}