首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有关于将Scala2.9编译器插件迁移到2.10的信息?

有没有关于将Scala2.9编译器插件迁移到2.10的信息?
EN

Stack Overflow用户
提问于 2013-01-17 04:26:46
回答 1查看 413关注 0票数 16

我有一个Scala2.9编译器插件(源代码),在2.9下工作得很好,但在2.10下甚至不能编译。有几十个(可能是100+的)错误都是相同类型的,例如:

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

..。最终以以下方式终止:

代码语言:javascript
复制
    [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 task (参见堆栈跟踪)。已经定义了该任务:

代码语言:javascript
复制
    <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的构建仍然以同样的方式失败(bug?)。我不得不做两个改变。首先处理varargs。有一种方法,例如:

代码语言:javascript
复制
    def foo(arg: String*) { ... }

还有另一种方法,它实际上是它的同义词,在2.9scala中被写成:

代码语言:javascript
复制
    def bar = foo _;

为了让它正常工作,我不得不将其更改为以下代码:

代码语言:javascript
复制
    def bar(arg: String*) = foo(arg: *);

另一个问题是'hasAssignedAnnotations‘不再出现在ValOrDefDef.symbol中(我只是注释出来让它编译,而不是真正的修复)。

再说一次,有没有人知道有网站或文档可以帮助我进行迁移--也就是说,从2.9到2.10,我需要的是什么,包括编译器插件。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 06:16:48

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14367189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档