16

私はScala2.9コンパイラプラグイン(ソースコード)を持っていて、2.9で問題なく動作しますが、2.10でもコンパイルできません。次のような同じ種類のエラーが数十(おそらく100以上)あります。

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

...最終的には次のように終了します:

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

2.10で何が変更されたか、またはこれに対処する方法について、情報やヘルプが必要です...グーグルでフォーラムを調べてみましたが、このテーマに関する情報はほとんど見つかりませんでした。

どんな助けにも感謝します!

編集:追加情報。これは明らかにantタスクを使用しています(スタックトレースを参照)。そのタスクは定義されています:

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

編集2:詳細情報:コマンドライン2.10コンパイラを使用してこのプラグインをコンパイルすることができました(他のものが失敗したため、まだ実行していませんでした)(覚えておいてください-2.9の世界ではすべて問題ありません)-antベースのビルドは引き続き失敗します同じように(バグ?)。私は2つの変更をしなければなりませんでした。最初にvarargsを扱います。次のような方法があります。

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

事実上、その広告の同義語である別の方法が2.9Scalaで次のよう記述されています。

    def bar = foo _;

これを機能させるには、これを次のように変更する必要がありました。

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

もう1つは、ValOrDefDef.symbolに存在しない「hasAssignedAnnotations」を処理しました(実際の修正ではなく、コンパイルするためにコメントしました)。

繰り返しになりますが、移行に役立つWebサイトやドキュメントを知っている人はいますか?つまり、コンパイラプラグインを含め、必要な点で2.9から2.10に変更されたものです。

ありがとう!

4

1 に答える 1

2

使用可能なドキュメントはないと思います。私の記憶が正しければ、Martin Oderskyはこのプレゼンテーションで、1000を超えるファイルが編集されたと述べました。2.10では、より良いリフレクションをサポートするためにコンパイラの大部分を書き直しました。副作用として、マクロが出現しました。もちろん、もう1つの副作用は、多くのコンパイラプラグインが機能しなくなったことです。

理論的には、 scalaソースコードのgit履歴を参照/検索できますが、実際には、これには時間がかかりすぎる可能性があります。一部のコンパイラプラグインは、出荷が少し簡単なため、マクロに変換されています。これがあなたの選択肢かどうかはわかりません。

最善の策は、scalaに付属しているプラ​​グインに加えられた変更を確認することです。多くの情報と変更を含む継続プラグインのこのコミット新しいリフレクション-9,001の追加と6,403の削除を含む190の変更されたファイルを表示)を見つけました。これがお役に立てば幸いです。

于 2013-02-18T22:16:48.140 に答える