Skip to content

Commit

Permalink
Update src/library/scala/runtime/ClassValueCompat.scala
Browse files Browse the repository at this point in the history
Co-authored-by: Ondra Pelech <ondra.pelech@gmail.com>
  • Loading branch information
nwk37011 and sideeffffect committed Oct 12, 2021
1 parent 0a310fd commit c312f37
Showing 1 changed file with 19 additions and 19 deletions.
38 changes: 19 additions & 19 deletions src/library/scala/runtime/ClassValueCompat.scala
Expand Up @@ -12,32 +12,23 @@

package scala.runtime

private[scala] abstract class ClassValueCompat[T] {

private def checkClassValueAvailability(): Boolean =
try {
Class.forName("java.lang.ClassValue", false, classOf[Object].getClassLoader)
true
} catch {
case _: ClassNotFoundException => false
}
import scala.runtime.ClassValueCompat._

private val instance = if (checkClassValueAvailability()) new JavaClassValue() else new FallbackClassValue()
private[scala] abstract class ClassValueCompat[T]() extends ClassValueInterface[T] { self =>

private class JavaClassValue extends ClassValue[T] with ClassValueInterface {
override def computeValue(cls: Class[_]): T = ClassValueCompat.this.computeValue(cls)
}

private class FallbackClassValue extends ClassValueInterface {
override def get(cls: Class[_]): T = ClassValueCompat.this.computeValue(cls)
private val instance =
try { new JavaClassValue() }
catch { case _: ClassNotFoundException => new FallbackClassValue() }

override def remove(cls: Class[_]): Unit = {}
private class JavaClassValue extends ClassValue[T] with ClassValueInterface[T] {
override def computeValue(cls: Class[_]): T = self.computeValue(cls)
}

private trait ClassValueInterface {
def get(cls: Class[_]): T
private class FallbackClassValue extends ClassValueInterface[T] {
override def get(cls: Class[_]): T = self.computeValue(cls)

def remove(cls: Class[_]): Unit
override def remove(cls: Class[_]): Unit = {}
}

def get(cls: Class[_]): T = instance.get(cls)
Expand All @@ -47,3 +38,12 @@ private[scala] abstract class ClassValueCompat[T] {
protected def computeValue(cls: Class[_]): T

}

private[scala] object ClassValueCompat {

trait ClassValueInterface[T] {
def get(cls: Class[_]): T
def remove(cls: Class[_]): Unit
}

}

0 comments on commit c312f37

Please sign in to comment.