Можно ли использовать scalap из сценария Scala?

Я использую scalapдля считывания имен полей некоторых классов case (, как обсуждалось в . этот вопрос). И классы case, и код, который использует scalapдля их анализа, были скомпилированы и помещены в jar-файл в пути к классам.

Теперь я хочу запустить скрипт, который использует этот код, поэтому я следовал инструкциям и придумал нечто вроде

::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap

, которое не работает:

java.lang.ClassCastException :scala.None$ нельзя преобразовать в scala.Option в scala.tools.nsc.interpreter.ByteCode$.caseParamNamesForPath (ByteCode. скала :45 )в scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple tion.scala :22)

Однако, когда я все компилирую, код работает нормально. Я поигрался с дополнительными опциями scalaвроде -savecompiled, но это не помогло. Это баг, или это не может работать в принципе? (Если да, то может ли кто-нибудь объяснить, почему нет? Как я уже сказал, классы случаев, которые должны быть проанализированы в scalap, компилируются.)

Примечание :Я использую Scala 2.9.1 -1.

РЕДАКТИРОВАТЬ

Вот что я по существу пытаюсь сделать (предоставляя простой способ создания нескольких экземпляров класса case):

//This is pre-compiled:
import scala.tools.nsc.interpreter.ProductCompletion
//...
trait MyFactoryTrait[T <: MyFactoryTrait[T] with Product] {
  this: T =>

  private[this] val copyMethod = this.getClass.getMethods.find(x => x.getName == "copy").get

  lazy val productCompletion = new ProductCompletion(this)

  /** The names of all specified fields. */
  lazy val fieldNames = productCompletion.caseNames //<- provokes the exception (see above)

  def createSeq(...):Seq[T] = {
    val x = fieldNames map {... } // <- this method uses the fieldNames value
    //[...] invoke copyMethod to create instances
  }   
 //...
}

//This is pre-compiled too: 
case class MyCaseClass(x: Int = 0, y: Int = 0) extends MyFactoryTrait[MyCaseClass]

//This should be interpreted (but crashes):
val seq = MyCaseClass().createSeq(...)

Примечание :Я перешел на Scala 2.9.2, ошибка остается прежней (, так что, вероятно, это не ошибка ).

6
задан Community 23 May 2017 в 12:16
поделиться