将Scala 2.9编译器插件迁移到2.10的任何信息?
我有一个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中有什么变化或如何处理这个…我尝试了谷歌搜索和查找论坛,但发现很少有关于这个问题的信息。 会感谢任何帮助! 编辑:附加信息。这显然是使用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的构建继续失败同样的方式(bug?)。我不得不做两个改变。首先处理varargs。有一种方法如: def foo(arg: String*) { ... } 还有另外一种方法,它是一个同义词,它的广告是用2.9 Scala写成: def bar = foo _; 我必须将其改为以下操作才能使其正常工作: def bar(arg: String*) = foo(arg: *); 另一个处理’hasAssignedAnnotations’不存在于ValOrDefDef.symbol中(我只是评论说,让它编译,而不是一个真正的修复)。 有没有人知道一个网站或文档,可以帮助我迁移 – 即从2.9到2.10,我需要的,包括编译器插件。 谢谢! 解决方法
我不认为有任何可用的文件。如果我记得正确,Martin Odersky在
this presentation说,编辑了1000多个文件。对于2.10,他们重写了大部分的编译器来支持更好的反思。作为
macros的副作用突然出现。另一方面的效果当然是很多编译器插件停止工作。
理论上你可以浏览/搜索scala source code的git历史记录,实际上这很可能太费时间了。有些编译器插件已经转换为宏,因为它们更容易发货。我不知道这是否是你的选择。 您最好的选择是查看scala附带的插件所做的更改。我发现this commit(新反思 – 显示190个更改的文件,增加9,001个添加和6,403个删除)的连续插件,其中包含大量的信息和更改。我希望这有什么帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |