scala scala-2.10 scala-compiler

¿Alguna información sobre la migración de un complemento del compilador Scala 2.9 a 2.10?



scala-2.10 scala-compiler (1)

Tengo un complemento de compilador Scala 2.9 (código fuente) y funciona bien en 2.9, pero ni siquiera compila con 2.10. Hay docenas (quizás más de 100) de errores, todos del mismo tipo, tales como:

[scalac] C:/***.scala:31: error: illegal cyclic reference involving class Global [scalac] val fileSeparator = System.getProperty("file.separator"); [scalac] ^

... que eventualmente terminará con:

[scalac] scala.reflect.internal.Types$TypeError: illegal cyclic reference involving class Global [scalac] at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1731) [scalac] at scala.reflect.internal.SymbolTable.defineBaseClassesOfCompoundType(SymbolTable.scala:12) [scalac] at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1581) [scalac] at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2369) [scalac] at scala.reflect.internal.Types$SimpleTypeProxy$class.baseClasses(Types.scala:248) [scalac] at scala.reflect.internal.Types$SingletonType.baseClasses(Types.scala:1292) [scalac] at scala.reflect.internal.Types$Type.findMembers(Types.scala:1058) [scalac] at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:683) [scalac] at scala.reflect.internal.Types$Type.implicitMembers(Types.scala:637) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.collect$1(Contexts.scala:630) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.collectImplicitImports(Contexts.scala:642) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:670) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675) [scalac] at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1378) [scalac] at scala.tools.nsc.typechecker.Implicits$class.inferImplicit(Implicits.scala:82) [scalac] at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:490) [scalac] at scala.tools.nsc.typechecker.Implicits$class.inferImplicit(Implicits.scala:37) [scalac] at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:490) [scalac] at scala.tools.nsc.typechecker.Typers$Typer.hasImport$1(Typers.scala:764) [scalac] at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$action$1(Typers.scala:766) [scalac] at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$checkFeature$1.apply$mcV$sp(Typers.scala:788) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$apply$1.apply(Analyzer.scala:100) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$apply$1.apply(Analyzer.scala:100) [scalac] at scala.collection.immutable.List.foreach(List.scala:309) [scalac] at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) [scalac] at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:100) [scalac] at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:461) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:90) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:90) [scalac] at scala.collection.Iterator$class.foreach(Iterator.scala:727) [scalac] at scala.collection.AbstractIterator.foreach(Iterator.scala:1156) [scalac] at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:90) [scalac] at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1574) [scalac] at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1548) [scalac] at scala.tools.nsc.Global$Run.compileSources(Global.scala:1544) [scalac] at scala.tools.nsc.Global$Run.compile(Global.scala:1654) [scalac] at scala.tools.ant.Scalac.executeInternal(Scalac.scala:699) [scalac] at scala.tools.ant.Scalac.execute(Scalac.scala:647) ...

Necesito información o ayuda sobre lo que ha cambiado en 2.10 o cómo tratar esto de otra manera ... Intenté buscar en Google y buscar en foros pero encontré muy poca información sobre este tema.

Estaremos agradecidos por cualquier ayuda!

EDITAR: información adicional. Esto es obviamente usando la tarea ant (ver seguimiento de pila). Esa tarea ha sido definida:

<taskdef resource="scala/tools/ant/antlib.xml"> <classpath> <pathelement location=".../scala-library.jar" /> <pathelement location=".../scala-reflect.jar" /> <pathelement location=".../scala-compiler.jar" /> </classpath> </taskdef>

EDITAR 2: Más información adicional: logré compilar este complemento (no lo ejecuté todavía porque otras cosas fallaron) usando el compilador de la línea de comandos 2.10 (recuerde, todo está bien en el mundo 2.9) - la construcción basada en ant continúa fallando de la misma manera (bug?). Tuve que hacer dos cambios. Primero se ocupa de los varargs. Existe un método tal como:

def foo(arg: String*) { ... }

Hay otro método que es efectivamente un sinónimo para su anuncio fue escrito en 2.9 Scala como:

def bar = foo _;

Tuve que cambiar esto a lo siguiente para que funcione:

def bar(arg: String*) = foo(arg: *);

Otro se ocupó de que ''hasAssignedAnnotations'' ya no estaba presente en ValOrDefDef.symbol (solo comenté eso para compilarlo, no una solución real).

Una vez más, ¿alguien sabe de un sitio web o un documento que pueda ayudarme con la migración? Es decir, qué cambió de 2.9 a 2.10 en los términos que necesito, incluidos los complementos del compilador.

¡Gracias!


No creo que haya ninguna documentación utilizable. Si recuerdo correctamente, Martin Odersky dijo en esta presentación que se editaron más de 1000 archivos. Para 2.10, han reescrito grandes partes del compilador para soportar una mejor reflexión. Como efecto secundario aparecieron las macros . El otro efecto secundario, por supuesto, es que muchos complementos del compilador dejaron de funcionar.

En teoría, puede explorar / buscar el historial de git del código fuente de Scala , en la práctica es muy probable que esto lleve demasiado tiempo. Algunos complementos del compilador se han convertido a macros, ya que son un poco más fáciles de enviar. No sé si esta es una opción para ti.

Su mejor opción podría ser observar los cambios realizados en los complementos que se envían con scala. Encontré esta confirmación ( La nueva reflexión: Mostrar 190 archivos modificados con 9,001 adiciones y 6,403 eliminaciones ) del complemento de continuaciones que contiene mucha información y cambios. Espero que esto sea de alguna ayuda.