问题标签 [scala-compiler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1879 浏览

scala - 什么是“Scala 演示文稿编译器”?

什么是“Scala Presentation Compiler”?

0 投票
1 回答
1726 浏览

scala - 使用 Global.Run 编译 Scala 代码时出现 MissingRequirementError

我正在尝试使用以下实例以编程方式编译 Scala 文件Global.Run

不幸的是,我得到一个MissingRequirementError说法:

找不到编译器镜像中的对象 scala.runtime

所以我的问题是如何使用Run类以编程方式编译文件,或者我在这里做错了什么?

我试图弄清楚是否可以更改settings它以使其正常工作。实际上,我需要 Scala 文件中的类列表,path不一定是完全可运行的输出。因此,如果符号仍未解决(如果我可以运行编译器阶段的一个子集),那会很好。

我也在Writing Scala Compiler Plugins,但如果我可以通过实例化 Compiler Run 对象来运行它,我更喜欢这个解决方案。我还偶然发现了Scala编译器是否可重入?(类似的代码,不同的问题),这让我觉得它可能会按照我的想法工作。

编辑 1:将 Scala JAR 添加到toolcp(只是带有绝对路径的示例代码!)

根据评论,我将scalac.bat类路径填充脚本改编为我的 Scala 代码:

0 投票
1 回答
540 浏览

scala - Scala 编译器生成抛出代码

我正在尝试更改其他人编写的编译器插件,该插件直接在打字机之后运行,我想生成引发异常的代码。

异常类如下所示:

不过,在实际代码中,这是一个内部类。

我查看了他如何获得固定类的符号并以类似的方式进行操作,我不知道是否有更好的方法,但这是他的操作方式:

为了抛出异常,我这样做了:

我认为,以下也是等效的(并且产生等效的行为)

但我有一个例外:

我想我不得不以不同的方式使用“新”,有人知道这是如何正确完成的吗?

0 投票
1 回答
651 浏览

scala - Scala 编译器不会终止(以编程方式调用)

我正在使用这段代码以编程方式编译 Scala 代码:

2.10 RC1 编译器工作了大约三分钟然后崩溃,而 2.10 无限地做某事(完全 CPU 使用)。当我通过 SBT(而不是以编程方式)调用编译器时,它可以正常工作并在不到一分钟的时间内完成编译。

缩短的输出如下所示(冗长 - 在第一行和错误之间运行三分钟):

Scala 2.10 稳定版

没有进一步的输出。1 个核心的 100% CPU 使用率。

斯卡拉 2.10 RC1

使用 RC1 大约 3 分钟后出现此错误:

下一段输出(也是我的应用程序崩溃之前的最终输出)是OutOfMemoryError. 我不确定它的原因是代码本身还是编译错误。这两个选项对我来说都很奇怪,因为它在 SBT 控制台上编译并且编译器错误不应该消耗那么多内存,不是吗?

我偶然发现为什么在 Scala 中出现 OutOfMemoryError 编译错误?. 但是,我不确定我是否实际上只是缺少用于编译的堆空间。不涉及 Maven,它只有 Scala 代码和本地构建路径上的一些 JAR。

我正在寻找错误的原因OutOfMemory或修复错误的调整。

0 投票
1 回答
416 浏览

scala - 有关于将 Scala 2.9 编译器插件迁移到 2.10 的任何信息吗?

我有一个 Scala 2.9 编译器插件(源代码),在 2.9 中工作得很好,但甚至不能用 2.10 编译。有几十个(可能有 100 多个)相同类型的错误,例如:

...最终以:

我需要一些关于 2.10 中发生了哪些变化或如何以其他方式处理此问题的信息或帮助......我尝试谷歌搜索并查看论坛,但发现关于此主题的信息很少。

将不胜感激任何帮助!

编辑:附加信息。这显然是在使用 ant 任务(参见堆栈跟踪)。该任务已定义:

编辑 2:更多附加信息:我设法使用命令行 2.10 编译器编译了这个插件由于其他事情失败了还没有运行它)(记住 - 在 2.9 世界中一切都很好) - 基于 ant 的构建继续失败同样的方式(错误?)。我不得不做出两个改变。首先处理可变参数。有一种方法如:

还有另一种方法实际上是它的同义词,它用 2.9 Scala 编写的:

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

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

再说一次,有没有人知道可以帮助我迁移的网站或文档 - 即在我需要的方面从 2.9 更改为 2.10,包括编译器插件。

谢谢!

0 投票
1 回答
130 浏览

scala - Scala 编译器插件的动态加载

根据这篇文章为了创建一个Scala编译器插件,需要将插件编译成一个jar,然后要么指定对jar的引用作为命令行参数,要么将jar放在$SCALA_HOME/misc/scala-devel/plugins.

我需要在运行时调用编译器,使用 scala 编译器 API (scala.tools.nsc)。在调用编译器之前,是否可以在运行时动态地编译器插件?

0 投票
1 回答
265 浏览

scala - .eq 导致警告。我该如何摆脱它?

我在 Scala 中使用 JDO 和 DataNucleus 类型安全查询语言。因此,我的代码如下所示:

简而言之,这将对字段等于的所有DbObjects运行查询。不幸的是,我收到以下警告:idid

很明显,Scala 编译器认为这NumericExpression[Long]是使用 的内置定义eq(),类似于==,但由于这是来自 Java,因此该eq()方法与 Scala 的方法完全无关eq()

有没有办法摆脱警告?显然,这会发生很多,我担心这些非警告会隐藏真正的警告。

更新(2013-06-29)

这已在 Scala 2.10.2 中修复。警告消失了。

0 投票
1 回答
421 浏览

scala - 将闭包传递给 Scala 编译器插件

我正在尝试编写一个允许非常通用代码生成的 Scala 编译器插件:类似于 C 预处理器的通用性,但更安全(我不确定这是否是一个糟糕的想法,但这是一个有趣的练习)。我的理想用例如下所示:

重要的插件代码可能如下所示(基于this):

知道怎么做吗?请不要说“只使用宏”;至少在 2.10 中,它们还不够通用。

顺便说一句,我发现我概述的方法存在两个问题:1)编译器插件采用 AST,而不是闭包。它需要某种创建闭包的方法,可能会添加对用户代码的构建依赖项。2)用户无权访问 scala.reflect.internal.Trees.Tree,只能访问 scala.reflect.runtime.universe.Tree,因此插件需要在两者之间进行转换。

0 投票
2 回答
187 浏览

scala - 为什么 scala 编译器不会对模式匹配中总是产生 false 的 if 语句生成警告?

scala 编译器应该为我在下面评论过的 if 语句生成警告,但它没有。为什么?

如您所料,结果将是“第三”,但编译器应该在case a if(a == "A")和 上生成警告if (a == "A"),但可惜没有警告。

如果我编写以下代码,它的行为就像我期望的那样:

为什么会这样?

编辑:我使用的是 Scala 2.10.1。

0 投票
5 回答
3473 浏览

scala - 了解 Scala GADT 支持的限制

Test.test 中的错误似乎不合理:

有几种方法可以使错误更改或消失:

如果我们删除特征 A(和案例类 B)上的 V 参数,错误的“GADT-skolem”部分就会消失,但“构造函数无法实例化”部分仍然存在。

如果我们将 Test 类的 U 参数移到 Test.test 方法中,错误就会消失。为什么 ?(同样,Test2.test2 中不存在该错误)

以下链接也确定了该问题,但我不理解提供的解释。http://lambdalog.seanseefried.com/tags/GADTs.html

这是编译器中的错误吗?(2.10.2-RC2)

感谢您为澄清这一点提供的任何帮助。


2014/08/05:我设法进一步简化了代码,并提供了另一个示例,其中 U 绑定在立即函数之外而不会导致编译错误。我仍然在 2.11.2 中观察到这个错误。

像这样简化,这看起来更像是编译器错误或限制。还是我错过了什么?