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 b55334e
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 19 deletions.
1 change: 1 addition & 0 deletions project/MimaFilters.scala
Expand Up @@ -85,6 +85,7 @@ object MimaFilters extends AutoPlugin {
ProblemFilters.exclude[MissingTypesProblem]("scala.reflect.runtime.JavaMirrors$JavaMirror$typeTagCache$"),
ProblemFilters.exclude[MissingTypesProblem]("scala.reflect.runtime.JavaMirrors$JavaMirror$typeTagCache$"),
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.ClassValueCompat"),
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.ClassValueCompat$"),
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.ClassValueCompat$ClassValueInterface"),
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.ClassValueCompat$JavaClassValue"),
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.ClassValueCompat$FallbackClassValue"),
Expand Down
49 changes: 30 additions & 19 deletions src/library/scala/runtime/ClassValueCompat.scala
Expand Up @@ -12,32 +12,26 @@

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 val instance: ClassValueInterface[T] =
if (classValueAvailable)
new JavaClassValue()
else
new FallbackClassValue()

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

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 +41,20 @@ 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
}

private val classValueAvailable: Boolean =
try {
Class.forName("java.lang.ClassValue", false, classOf[Object].getClassLoader)
true
} catch {
case _: ClassNotFoundException => false
}
}

0 comments on commit b55334e

Please sign in to comment.