I have a function which constructs a map by reflection from an object literal (the purpose is to make porting some JavaScript code easier). The function works fine, but I have found a case in which the reflections lists variables from an enclosing scope between members:
def mapFromObject[T](m: Any): Map[String, T] = {
  import scala.reflect.runtime.currentMirror
def listMembers(m: Any) = {
  import scala.reflect.runtime.currentMirror
  val anyMirror = currentMirror.reflect(m)
  val items = for {
    symbol <- currentMirror.classSymbol(m.getClass).toType.members
    if symbol.isTerm && !symbol.isMethod && !symbol.isModule
  } yield {
    val field = anyMirror.reflectField(symbol.asTerm)
    symbol.name.decodedName.toString
  }
  items
}
def convertLiteral() = {
  val par_some = ""
  val literal = new {
    var item = new {}
    var item2 = new {
      var value = par_some
    }
  }
  println(listMembers(literal))
}
convertLiteral()
I expect to get result item, item2, but I get par_some$1, item2, item instead.
Why is par_some$1 listed as a member of the class?
How can I check for such member, so that I can ignore it? I have tried various methods of Symbol, including isSynthetic and isImplementationArtifact, but nothing I have tried seems to be different from normal members.
Scastie repro: https://scastie.scala-lang.org/uiv4DBIERIKnZaiViZ0Aaw
 
Aucun commentaire:
Enregistrer un commentaire