2013-01-16 15 views
16

Mam wtyczkę kompilatora Scala 2.9 (kod źródłowy) i działa dobrze w wersji 2.9, ale nawet nie kompiluje się z wersją 2.10. Istnieją dziesiątki (może 100+) błędów wszystkie tego samego rodzaju, takie jak:Jakieś informacje na temat migracji wtyczki kompilatora Scala 2.9 do wersji 2.10?

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

... które ostatecznie kończą się:

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

Potrzebuję informacji lub pomocy, co ma zmieniono w 2.10 lub jak inaczej sobie z tym poradzić ... Próbowałem Googlować i przeglądać fora, ale znalazłem bardzo mało informacji na ten temat.

Będziemy wdzięczni za każdą pomoc!

EDYCJA: Dodatkowe informacje. Jest to oczywiście użycie zadania ant (zobacz śledzenie stosu). Że zadanie zostało zdefiniowane:

<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: więcej dodatkowych informacji: udało mi się ten plugin do skompilować (nie uruchomić go jeszcze inne rzeczy, nie powiodło się) przy użyciu wiersza polecenia 2,10 kompilatora (pamiętaj - wszystko jest w porządku w świecie 2.9) - konstrukcja oparta na mrówce nadal nie działa w ten sam sposób (błąd?). Musiałem wprowadzić dwie zmiany. Najpierw zajmuje się varargs. Jest to metoda, takie jak:

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

Jest jeszcze inna metoda, która jest praktycznie synonimem to ogłoszenie został napisany w 2,9 Scala jako:

def bar = foo _; 

musiałem zmienić na następujące aby zmusić go do pracy:

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

Innym przedmiotem „hasAssignedAnnotations” nie występuje w ValOrDefDef.symbol nic więcej (ja po prostu powiedział, że się je zdobyć do kompilacji, a nie prawdziwej poprawki).

Jeszcze raz, czy ktoś wie o stronie internetowej lub dokumencie, który może mi pomóc w migracji - tj. Co zmieniło się z 2,9 do 2,10 w zakresie, który jest mi potrzebny, łącznie z wtyczkami kompilatora.

Dzięki!

+0

Po prostu zgaduję, może jest nowy cień symbolu "System" w 2.10 kompilatorów. W 2.10 można również użyć 'sys.props (" file.separator ")', może naprawić ten błąd. –

+0

Błąd pojawia się w wielu wierszach, które są bardzo różne i nie wydają się być w ogóle powiązane. Ta, którą tu zamieściłem, jest tylko przykładem. – Learner

+0

Czy masz link do swoich źródeł? –

Odpowiedz

2

Nie sądzę, że istnieje jakaś użyteczna dokumentacja. Jeśli dobrze pamiętam, Martin Odersky powiedział w this presentation, że edytowano ponad 1000 plików. W wersji 2.10 przepisali duże części kompilatora, aby zapewnić lepsze odbicie. Jako efekt uboczny powstało macros. Innym efektem ubocznym jest oczywiście to, że wiele wtyczek kompilatora przestało działać.

Teoretycznie można przeglądać/przeszukiwać historię git z scala source code, w praktyce będzie to najprawdopodobniej zbyt czasochłonne. Niektóre wtyczki kompilatora zostały skonwertowane do makr, ponieważ są nieco łatwiejsze do wysłania. Nie wiem, czy jest to opcja dla ciebie.

Najlepszym rozwiązaniem może być obejrzenie zmian wprowadzonych w wtyczkach dostarczanych ze scala. Znalazłem this commit (Nowe odbicie - Pokazuje 190 zmienionych plików z 9 001 dodatkami i 6 403 usunięciami) wtyczki kontynuacji, która zawiera wiele informacji i zmian. Mam nadzieję, że to pomoże.

Powiązane problemy