问题标签 [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 投票
1 回答
94 浏览

scala - 在 Scala 中获取“超级”调用所引用的符号

我正在为refchecks阶段编写一个 Scala 编译器插件。

给定调用点的符号,如何访问“超级”调用所指的符号?

例如,在

知道调用点的符号super.m(),我想获得 trait 的符号A

0 投票
1 回答
46 浏览

scala - Why do my bytes appear to get corrupted when I try to write them from inside if statements or pattern matches

I'm playing with Pickled Scala signatures, writing bytes to a PickleBuffer and reading them back out with ShowPickled.

I can write and read back an Int as expected by using

PB.myBuf.writeByte(2)

giving the '2' (a reference to an entry number in this case) in

1(MyRecord) 2 40[case] 5.

But if I but that same code inside a conditional like:

if (ExtModClassRef.position==0) PB.myBuf.writeByte(2),

or

ExtModClassRef.position match {case 0 => PB.myBuf.writeByte(2)},

then the bytes that I read back are garbled:

0,4: CLASSsym 4: 1(MyRecordmodels\00\00...

instead of how the first few entries should be:

0,4: CLASSsym 4: 1(MyRecord) 2 40[case] 5 1,10: TYPEname 8: MyRecord 2,20: EXTMODCLASSref 1: 3(models) 3,23: TERMname 6: models

I'm puzzled as to how the if and match keywords could have any effect on what bytes are written.

And perhaps someone can suggest a fix or a workaround?

Thank you, Julian

0 投票
1 回答
10240 浏览

scala - “未找到编译器镜像中的 scala.runtime”,但在使用 -Xbootclasspath/p:scala-library.jar 启动时工作

我正在尝试运行打包为 JAR(包括依赖项)的 Scala 应用程序,但这会失败,直到使用该-Xbootclasspath/p选项添加 Scala 库。

调用失败:

在应用程序完成了一些预期的输出后,控制台显示:

线程“主”scala.reflect.internal.MissingRequirementError 中的异常:未找到编译器镜像中的对象 scala.runtime。在 scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16) 在 scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors .scala:48) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61) 在 scala.reflect.internal。在 scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175) 在 scala.reflect.internal.Definitions$DefinitionsClass 的 Mirrors$RootsBase.getPackage(Mirrors.scala:172)。

工作调用:

奇怪的是,它的application-assembly-1.0.jar构建是为了包含所有依赖项,包括 Scala 库。当提取 JAR 文件时,可以验证scala.runtime包中的类文件是否已包含在内。

JAR 文件的创建

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.1")被添加到project/plugins.sbtassembly调用了目标。一个大约 25MB 的 JAR 文件结果。

使用 proguard 构建 JAR 显示了与在程序集的 JAR 文件中看到的相同的运行时行为。

触发 MissingRequirementError 的应用程序代码

一些应用程序代码可以正常工作,并且只要new Run执行以下片段,就会触发前面描述的异常。

其中scala-libraryscala-compilerscala-reflect被定义为 中的依赖项build.sbt

对于古玩/背景信息

该应用程序的目的是帮助 Java 和 Scala 程序的本地化。上面代码片段的任务是从 Scala 文件中获取 AST,以便在其中找到方法调用。

问题

  • 鉴于 Scala 库包含在 JAR 文件中,为什么需要使用 调用 JAR -Xbootclasspath/p:scala-library.jar
  • 为什么应用程序的其他部分运行得很好,即使scala.runtime后来报告为丢失?
0 投票
2 回答
7369 浏览

scala - 如何找到 scala 编译器标志/选项的描述?

如何找到最新 scalac 版本的所有标志?谷歌搜索几个小时后,我发现只有过时的 文档。(例如,他们甚至没有提到“-feature”标志)。

有没有办法从 scalac 或其他任何东西中获取带有描述的编译器标志列表?

0 投票
1 回答
2441 浏览

scala - 解决 SBT 中 Scala 宏和编译器框架的依赖关系

我正在尝试编写一个框架以使编写 Scala 编译器插件更容易,我正在做的是在 Scala quasiquotes 之上编写一个框架。所以我的项目依赖于宏天堂的宏以及 scala-compiler 和 scala-reflect 库。

我按照此处提到的说明编写了一个 SBT 构建脚本:https ://github.com/scalamacros/sbt-example-paradise/blob/master/project/Build.scala

并使用 scalaVersion 2.11.0-SNAPSHOT, 2.10.3-SNAPSHOT, 2.10.3-RC1, 2.10.2 编译我的项目,但它们都不起作用。这是我的 sbt 构建脚本:

使用 scalaVersion 2.10-3-RC1,我收到以下错误:

使用 scalaVersion 2.11.0-SNAPSHOT,我收到以下错误:

在使用 2.10.3-SNAPSHOT 版本时,我得到了以下信息:

而且 2.10.2 版根本无法解决 scala-library、scala-reflect 和 2.10.2 的依赖关系(如 2.10.3-RC1)!

我的问题是,是否有可能混合编译器 API 和宏 API 并使它们在 SBT 下工作,如果是的话,我的构建脚本到底有什么问题?

0 投票
2 回答
349 浏览

scala - Scala:编译器可以有效地优化常量吗?

让我们考虑以下几点:

这太冗长了,与 Java 的静态(最终)变量相比似乎并不优雅,尤其是因为常量的定义和用法相距太远,无法立即理解代码。我想要的是这样的:

问题是,Scala 编译器是否足够聪明,不会为每个 Foo 实例实例化 BUFFER_SIZE 以浪费时间和空间?还是应该选择第一个?

0 投票
1 回答
1321 浏览

java - scala - 获取符号的类/源文件名和位置

因为 scala 类名可能与源文件名不匹配。

如何在 jar 中找到 scala 类型所属的 .class 文件。

在 scala.reflect.api.Symbols.Symbol 类型中,有一个值叫做 associatedFile,但是它总是返回 null

如何以编程方式获取类文件名?

更详细:如果我得到二进制/源 jar,例如 scala-library.jar,scala-library-src.jar。如何判断源 jar 中的哪个源文件来自二进制 jar 中的类。

Scala 演示编译器可以告诉这个信息吗?

0 投票
1 回答
949 浏览

scala - scala运行时反映有时会抛出异常

当我在其他类中Reflects调用方法时,我定义了一个对象caseFields

有时此方法会引发以下异常

和其他奇怪的例外。

这种方法有什么问题

0 投票
2 回答
3184 浏览

scala - 如何以编程方式调用 Scala 编译器?

我希望我的 Scala 代码将 Scala 类作为输入,编译并执行该类。如何以编程方式调用 Scala 编译器?我将使用最新的 Scala 版本,即 2.10。

0 投票
3 回答
1091 浏览

scala - Scala 编译器如何在 trait 中定义 final val?

我经常使用无私的特征模式,并且我需要在特征中使用“昂贵的”常量:我希望在我的所有应用程序中拥有这些值的单个实例,这可能需要计算几个步骤。

然而,无私的特质模式导致了以下设计:

  • 一个特质 MyStuff
  • 一个对象 MyStuff 扩展了 MyStuff

显然,将常量放在对象中并在 trait 中使用它们会产生循环依赖。然而,将它们放在 trait 上,使得所有扩展 trait 的类都可以覆盖它们,因此它们肯定不是应用程序范围的单例。

Scala 编译器是否“足够聪明”以使特征中的最终 val 变为“旧的 java public static final”?