2013-01-16 11 views
16

Ich habe ein Scala 2.9 Compiler-Plugin (Quellcode) und funktioniert gut in 2.9, aber kompiliert nicht mit 2.10. Es gibt Dutzende (vielleicht 100+) von Fehlern alle von der gleichen Art wie:Gibt es irgendwelche Informationen über die Migration eines Scala 2.9 Compiler Plugins auf 2.10?

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

..., die mit schließlich beenden:

[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) 
    ... 

Ich brauche einige Informationen oder helfen, was hat in 2.10 geändert oder wie man sonst damit umgeht ... Ich habe versucht herum zu googlen und in Foren zu suchen, habe aber sehr wenig Informationen zu diesem Thema gefunden.

Wir werden für jede Hilfe dankbar sein!

EDIT: Zusätzliche Informationen. Dies ist offensichtlich Ant-Task (siehe Stack-Trace). Diese Aufgabe definiert wurde:

<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> 

EDIT 2: Weitere Zusatzinfo: ich es geschafft, dieses Plugin zu kompilieren zu bekommen (habe es noch nicht laufen, wie andere Dinge nicht) mithilfe von Befehlszeilen 2.10 Compiler (nicht vergessen - alles ist in 2.9 Welt in Ordnung) - Ameisen-basierte Build weiterhin auf die gleiche Weise scheitern (Bug?). Ich musste zwei Änderungen vornehmen. Erste Angebote mit Varargs. Es gibt ein Verfahren, wie:

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

Es gibt eine andere Methode, die für sie ad effektiv ein Synonym ist wurde in 2,9 Scala geschrieben wie:

def bar = foo _; 

ich die folgenden ändern musste um es zu arbeiten:

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

Ein weiteres behandelt ‚hasAssignedAnnotations‘ nicht vorhanden ist, in ValOrDefDef.symbol mehr (ich bemerkte nur, dass, um es zu bekommen kompilieren, keine echte Lösung).

Noch einmal, jemand weiß von einer Website oder einem Dokument da draußen, die mir bei der Migration helfen kann - d. H. Was sich von 2,9 zu 2,10 in den benötigten Begriffen geändert hat, einschließlich Compiler-Plugins.

Danke!

+0

Nur raten, vielleicht gibt es eine neue Beschattung des Symbols "System" in der 2.10 Compiler. In 2.10 können Sie auch 'sys.props (" file.separator ")' verwenden, um diesen Fehler zu beheben. –

+0

Der Fehler tritt in vielen Zeilen auf, die sehr unterschiedlich sind und überhaupt nicht verwandt zu sein scheinen. Die hier angegebene ist nur ein Beispiel. – Learner

+0

Haben Sie einen Link zu Ihren Quellen? –

Antwort

2

Ich glaube nicht, dass es eine brauchbare Dokumentation gibt. Wenn ich mich richtig erinnere, sagte Martin Odersky in this presentation, dass mehr als 1000 Dateien bearbeitet wurden. Für 2.10 haben sie große Teile des Compilers neu geschrieben, um eine bessere Reflexion zu unterstützen. Als Nebeneffekt tauchte macros auf. Der andere Nebeneffekt ist natürlich, dass viele Compiler-Plugins nicht mehr funktionieren.

In der Theorie könnten Sie durchsuchen/suchen Sie die Git-Geschichte der scala source code, in der Praxis wird dies wahrscheinlich zu zeitaufwendig sein. Einige Compiler-Plugins wurden in Makros konvertiert, da sie einfacher zu versenden sind. Ich weiß nicht, ob das eine Option für dich ist.

Ihre beste Wette könnte sein, die Änderungen an Plugins zu sehen, die mit scala geliefert werden. Ich fand this commit (Die neue Reflektion - Zeige 190 geänderte Dateien mit 9.001 Additionen und 6.403 Löschungen) des Fortsetzungs-Plugins, das viele Informationen und Änderungen enthält. Ich hoffe, das hilft mir.