2012-04-25 10 views
6

Estoy usando scalap para leer los nombres de campo de algunas clases de casos (como se explica en this question). Tanto las clases de casos como el código que usa scalap para analizarlos se han compilado y puesto en un archivo jar en classpath.¿Es posible usar scalap desde un script scala?

Ahora quiero ejecutar un script que utiliza este código, por lo que siguió the instructions y se acercó con algo así como

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

que no funciona:

java.lang.ClassCastException: scala.None $ no se puede convertir a scala.Option en scala.tools.nsc.interpreter.ByteCode $ .caseParamNamesForPath (ByteCode. scala: 45) en scala.tools.nsc.interpreter.ProductCompletion.caseNames (ProductComple tion.scala: 22)

Sin embargo, el código funciona bien cuando compilo todo. Jugué con opciones adicionales scala como -savecompiled, pero esto no ayudó. ¿Es esto un error, o no puede funcionar esto en principio? (Si es así, ¿podría alguien explicar por qué? Como ya he dicho, se compilan las clases de casos que se analizarán por scalap)

Nota: utilizo Scala 2.9.1-1.

EDITAR

Aquí es lo que estoy esencialmente tratando de hacer (que proporciona una forma sencilla de crear múltiples instancias de una clase de casos):

//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(...) 

Nota: pasé a Scala 2.9.2, el error permanece igual (por lo que probablemente no sea un error).

+0

¿Podría dar un poco más de su código? – Edmondo1984

+0

@ Edmondo1984: seguro, mira arriba. –

+0

Parece que necesito más información. Si elimino los parámetros de createSeq y devuelvo Seq.empty [T], no puedo obtener un bloqueo del compilador ... – Edmondo1984

Respuesta

0

trata de un error en el compilador:

  • Si ejecuta el programa dentro de un IDE, por ejemplo IntelliJ IDEA el código se ejecuta bien, sin embargo no hay campos se encuentran nombres.
  • Si lo ejecuta desde la línea de comando con scala, obtendrá el error que mencionó.

No hay manera de que el tipo seguro podría compilar y lanzar ClassCastException en tiempo de ejecución.

Por favor, abra un error en https://issues.scala-lang.org/secure/Dashboard.jspa

Cuestiones relacionadas