Lea*_*ner 16 scala scala-2.10 scala-compiler
我有一个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] ^
Run Code Online (Sandbox Code Playgroud)
......最终终止于:
[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)
...
Run Code Online (Sandbox Code Playgroud)
我需要一些信息或帮助,以了解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>
Run Code Online (Sandbox Code Playgroud)
编辑2:更多附加信息:我设法使用命令行2.10编译器来编译这个插件(没有运行它,因为其他事情失败了)(记住 - 在2.9世界中一切都很好) - 基于ant的构建继续失败同样的方式(错误?).我不得不做两处改动.首先涉及varargs.有一种方法,如:
def foo(arg: String*) { ... }
Run Code Online (Sandbox Code Playgroud)
还有另一种方法实际上是它的同义词广告是用2.9 Scala编写的:
def bar = foo _;
Run Code Online (Sandbox Code Playgroud)
我必须将此更改为以下内容才能使其工作:
def bar(arg: String*) = foo(arg: *);
Run Code Online (Sandbox Code Playgroud)
另一个处理'hasAssignedAnnotations'不再出现在ValOrDefDef.symbol中(我只是评论说它要编译,而不是真正的修复).
同样,有没有人知道一个网站或那里的文件可以帮助我进行迁移 - 即我需要的术语从2.9变为2.10,包括编译器插件.
谢谢!
我认为没有任何可用的文档。如果我没记错的话,Martin Odersky 在这次演示中说过,编辑了 1000 多个文件。对于 2.10,他们重写了编译器的大部分内容以支持更好的反射。作为副作用,宏突然出现了。当然,另一个副作用是许多编译器插件停止工作。
理论上你可以浏览/搜索scala 源代码的 git 历史记录,但实际上这很可能太耗时。一些编译器插件已转换为宏,因为它们更容易发布。我不知道这是否适合您。
您最好的选择可能是查看对 scala 附带的插件所做的更改。我发现Continuations插件的这个提交(新的反射 - 显示 190 个更改的文件,其中有 9,001 个添加和 6,403 个删除)包含大量信息和更改。我希望这有帮助。
归档时间: |
|
查看次数: |
412 次 |
最近记录: |