问题标签 [scalac]

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 回答
2424 浏览

parsing - scalac缺少带有奇怪行号的右括号错误报告

当我一直在学习 Scalag++时,我经常在读取来自scalac. 然而,今天我遇到了一些我怀疑即使在g++宇宙中也会发生的事情。

一位朋友给我发了一个非常简单的代码片段,其中包含一个相当常见的错误:

完整的源文件发布在这里。由于case class Var类声明缺少右大括号,您会认为编译器会告诉您该声明的左大括号(第 11 行)缺少右大括号。然而,报告它“假设”在前一个声明scalac的中间缺少一个右括号(在第 7 行)。case class(完整的错误输出包含在发布的代码的底部。)

如果您了解语言的内部结构,大多数scalac错误消息都是有意义的,但我在这里完全不知所措。后面的类声明中缺少的右大括号如何最终传播到文件前面已经成功解析的类定义?

您到底是如何向 Scala 初学者解释这一点的?省略右括号正是 Scala 新手通常会犯的错误,但这里的错误消息似乎会让用户误入歧途,因此报告类似的内容可能会更有帮助error: you seem to be missing a '}' somewhere

注意:我知道此类问题的通常答案只是“使用 IDE,增量编译会立即标记它”或“语法突出显示应该使这个错误显而易见”——但我的问题是专门询问scalac输出,所以请请记住,我知道这些是有效的点,但我真的只想了解编译器在这里发生了什么。

更新:

让我尝试一种不同的方法来解释我的困惑。该错误源于缺少右大括号,因此显然是大括号嵌套的问题。将我发布的片段中的文本(代码)转换为一系列行号+大括号对,我们得到:

我们显然缺少一个右括号。我可以理解scalac猜测缺少的大括号可能会出现在以下任何一个地方(每个地方都由 表示x):

但是,这就是输出的内容scalac

输入的那部分已经很好地嵌套了!在那里添加另一个右括号怎么可能有意义?

编辑:我觉得我应该再次重申我的主要问题:您将如何向 Scala 的新手解释此错误消息(以及如何在源代码中找到错误的根源)?

0 投票
0 回答
159 浏览

scala - 如何安装 Scala 编译器插件以便它自动与 Ant 一起工作?

我正在编写一个Scala编译器插件,我想在调用时使用它,所以我scalac把它放在 Scala 发行版的插件目录(使用带有嵌入式任务的 Ant 脚本,例如:misc/scala-devel/pluginsscalac HelloWorld.scalascalac

我可以通过更改构建脚本以指定插件目录来使其工作,例如:

但是,我需要它来处理我无法手动更改的第三方构建脚本,所以我的简单修复并没有解决它 - 请有任何想法吗?


更新:

经过一番挖掘,我发现您可以使用覆盖任务定义presetdef,例如:

这并不能直接解决问题,但它可能很有趣 - 我目前的调查是是否可以将它(或类似的东西)放在导入原始脚本的包装 Ant 脚本中(不知道这是否可行,我不太使用 Ant)。

0 投票
2 回答
655 浏览

scala - scalac“-deprecation”和“-unchecked”编译器选项会使其变慢

有趣的是,启用这些选项后,我们的构建似乎变慢了。我在网上搜索了一下,并试图做一些比较,但没有发现任何结论。想问问有没有人知道的。

0 投票
1 回答
702 浏览

eclipse - 保证不会被优化掉的Scala no-op?

您可以在关闭}Scala 方法时设置断点,但这样做毫无意义,因为它显然不会被命中。

我还是想把它放在那里。所以我想,“我在该行之前放置一个空操作,并在其上设置一个断点怎么样?”

但是由于显然当我尝试设置一个永远不会被命中的断点时 Eclipse 并没有警告我(因为那里没有代码),因此我不能依赖 Eclipse 告诉我是否已经优化了无操作(特别是因为我什至没有使用与 Eclipse Scala 插件使用的相同版本的 Scala 来运行代码)。

那么是否有一个简短的无操作语句或表达式可以在这里使用,它保证在任何情况下都不会被 Scala 编译器优化掉- 并且保证不会被 JIT 优化掉以防止断点它被击中了吗?我想在我的例子中它必须是一个表达式而不是一个语句,因为这个方法返回一个有用的值,而不是Unit.

0 投票
1 回答
679 浏览

scala - -Xdisable-assertions 和 -Xelide-below 不关闭断言

我目前正在开发一个使用 SBT 的 Scala 项目,并且我正在尝试生成生产构建设置,其中一个条件是所有断言都已关闭。我只是将这一行添加到我的 build.sbt 中:

我在调试时运行 logLevel,我看到选项被传递给编译器,但是当我运行我们的程序(它的长期运行程序分析)时,我遇到了一个断言。尽管从所有迹象来看,所有断言都应该被编译掉。我已经用 diable-assertions 和 elide-below 尝试了这个,但没有结果。如果有人能给我一些关于我做错了什么的指示,那就太好了。我写了很多 Scala,但除了一些基本项目之外,我并没有使用过多的 SBT。

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 回答
478 浏览

scala - 为什么Scalac类型不匹配期望Int?

我昨晚正在做一个项目,并且有一些这样的代码:

然后我不小心写道:

遗漏了和.之间的内容。xsfoldLeft

有问题的类型有点复杂,它要求我注释 lambda 的参数类型,所以我很快就做了,认为这是我错误的根源。我最终得到了这样的结果:

此时我收到错误:

显然修复是xs.foldLeft("") ...,但我一直想知道为什么编译器在这种情况下需要一个 Int 。谁能阐明这是如何解析的?这整天都在唠叨我。

0 投票
1 回答
334 浏览

scala - 修复 Travis CI 上的 sbt OutOfMemoryError

我有一个在本地构建良好的sbt 项目因为SBT_OPTS="-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"~/.sbtconfig的. 是否有任何项目特定的设置可以添加到我的项目本身,Travis 会选择?

0 投票
1 回答
1360 浏览

scala - Scala 编译器崩溃:这里有什么问题?

我开始为 Scala 中的 X500PrincipalBuilder 类编写单元测试。这是我的测试代码:

但是,当使用 Scala 2.9.2 或 2.10.0 编译此代码时,我遇到了编译器崩溃。这是 2.9.2 的初始堆栈跟踪:

2.10.0 的输出似乎是一些难以理解的伪代码来生成 AST:

WTF 这意味着什么,我该如何解决?

0 投票
0 回答
340 浏览

scalac - scalac 如何在包含空格的源上使用?

该命令的手册页(http://www.scala-lang.org/docu/files/tools/scalac.html)没有解释如何执行此操作。

显而易见的解决方法是简单地更改文件名以避免空格,但这不是解决方案。

我正在使用 Windows 并从命令提示符运行 scalac。

我努力了:

  • scalac源文件名.scala =>错误:找不到源文件'the'
  • scalac "the source file name.scala" => source 在这个时候是意外的。
  • scalac '源文件名.scala' => 错误:找不到源文件''the'
  • scalac `源文件名.scala` => 错误:找不到源文件'`the'
  • scalac -sourcepath 源文件名.scala => 错误:找不到源文件“源”
  • scalac -sourcepath "源文件名.scala" => 用法:scalac
  • scalac -sourcepath '源文件名.scala' => 错误:找不到源文件'source'。
  • scalac -sourcepath the\ source\ filename.scala => 错误:找不到源文件'source\'。
  • scalac -sourcepath the^ source^ filename.scala => 错误:找不到源文件“源”
  • scalac the^ source^ filename.scala => 错误:找不到源文件'the'

我想我错过了一些明显的东西。