【问题标题】:Any info out there on migrating a Scala 2.9 compiler plugin to 2.10?有关于将 Scala 2.9 编译器插件迁移到 2.10 的任何信息吗?
【发布时间】:2013-01-16 20:26:45
【问题描述】:

我有一个 Scala 2.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 中发生了什么变化或如何以其他方式处理此问题...我尝试在 Google 上四处搜索并查看论坛,但发现关于此主题的信息很少。

将不胜感激!

编辑:附加信息。这显然是在使用 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 world) - 基于 ant 的构建继续以同样的方式失败(错误?)。我不得不做出两个改变。首先处理可变参数。有一种方法如:

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

还有另一种方法实际上是它的同义词广告在 2.9 Scala 中编写为:

    def bar = foo _;

我必须将其更改为以下内容才能使其正常工作:

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

另一个处理 'hasAssignedAnnotations' 不再出现在 ValOrDefDef.symbol 中(我只是将其注释掉以使其编译,而不是真正的修复)。

再一次,有没有人知道可以帮助我迁移的网站或文档 - 即从 2.9 到 2.10 的哪些变化是我需要的,包括编译器插件。

谢谢!

【问题讨论】:

  • 只是猜测,也许在 2.10 编译器中有符号 System 的新阴影。在 2.10 中,您还可以使用 sys.props("file.separator"),可能会修复该错误。
  • 该错误出现在许多非常不同且似乎根本不相关的行上。我在这里包含的只是一个示例。
  • 你有资源链接吗?
  • 不是开源的。他们属于我工作的公司,不能透露。

标签: scala scala-2.10 scala-compiler


【解决方案1】:

我认为没有任何可用的文档。如果我没记错的话,Martin Odersky 在this presentation 中说编辑了超过 1000 个文件。对于 2.10,他们重写了大部分编译器以支持更好的反射。作为副作用macros突然出现。当然,另一个副作用是许多编译器插件停止工作。

理论上你可以浏览/搜索 scala source code 的 git 历史记录,实际上这很可能太耗时了。一些编译器插件已转换为宏,因为它们更容易发布。我不知道这是否适合您。

您最好的选择可能是查看对 scala 附带的插件所做的更改。我找到了包含大量信息和更改的延续插件的this commit新的反射 - 显示 190 个更改的文件,其中包含 9,001 个添加和 6,403 个删除)。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 2022-01-18
    • 2015-11-19
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多