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

scala - Scala Compiler Plugin:如何访问子类中覆盖方法的特定类型信息?

我正在开发一个 Scala 编译器插件,试图转换每个函数调用,比如

进入

但是,当函数调用是另一个函数的返回值时,我会遇到麻烦。这是我要转换的代码

在上面的示例中,编译器可以成功推断出 的结果new B应该转换为A[Int],因为func1in应该具有与inMyObject相同的返回类型。func1MyTrait[Int]

但是,当我使用编译器插件进行转换时会出现问题。

现在,newvalue不提供任何额外的类型信息,而是编译器必须推断它。结果类型newvalueB[Nothing],这是编译器可以推断的最具体的类型。

然后当我尝试newvalue作为func1. func1requires A[Int], whilenewvalue是 type B[Nothing],无法匹配。

如果我能提前知道所需的返回类型,问题就可以解决func1,因为我可以newvalue用这个返回类型指定,如下所示

上面的代码可以编译成功。

我的问题是,在编写 Scala 编译器插件时,我怎么知道func1in的返回类型,因为 的签名并没有告诉它的返回类型。MyObjectA[Int]func1

我认为找出编译器如何从in的签名中获取inA[Int]的返回类型也很有帮助。 func1MyObjectfunc1MyTrait[Int]

MyTraitMyObject被定义在两个不同的源文件中时,这个问题就变得更加困难了。

0 投票
0 回答
50 浏览

scala - 评估源而不返回值

Twitter util 库为如何在运行时评估 Scala 代码提供了一个很好的实用程序,例如:

但是是否可以评估不返回任何内容的代码(返回状态 true/false - 已编译/失败),然后开始使用在评估部分中定义的类,例如:

所以我对 {_MAGIC_METHOD_} 部分很好奇,是否可以使用一些库来做到这一点?Twitter实用程序可以吗?其他一些实用程序库?Scala 编译器(Scala 编译器 - http://mvnrepository.com/artifact/org.scala-lang/scala-compiler)?

提前感谢您的帮助和任何建议。

0 投票
4 回答
561 浏览

scala - 将标识函数映射到 Scala 集合的复杂性?

当我使用该方法将 Scala 预定义identity函数应用于集合时map,原始集合将原样返回。但是,编译器是否足够聪明,可以简单地将未更改的集合作为O(1)操作返回?还是将恒等函数仍应用于原始集合中的每个元素以产生O(n)操作?

0 投票
1 回答
708 浏览

scala - 密封特征中的方法在类文件中给出重复的字段名称和签名

当我添加它时process()IntList它会给出一个运行时“ Duplicate field name&signature in class file Cons$3...”。仅当在sealed trait函数内部定义时才会发生这种情况。

0 投票
1 回答
620 浏览

scala - 如何在 Scala 中获取动态创建的类的完整类名

我有一种情况,我必须获取在 Scala 中动态生成的类的完全限定名称。这是我到目前为止所拥有的。

显然这只是一个玩具示例,但我只是不知道如何获得 Foo 的完全限定名称。我尝试将包声明粘贴到代码中,但在调用tb.compile.

有谁知道如何获得完全限定的类名或(甚至更好)指定 Foo 编译的包?

谢谢

编辑

使用提出的解决方案后,我能够获得类名。然而,下一步是注册这个类以便稍后采取一些行动。具体来说,我正在尝试利用 Apache Spark 中的UDTRegistration来处理我自己的自定义UserDefinedType。当我手动创建所有类型时,此策略效果很好,但是,我想使用它们来扩展我可能不知道的其他类型。

在阅读完这篇文章之后,使用在运行时使用反射编译的代码似乎无法实现我想要做的事情。也许更好的解决方案是使用 Scala 宏,但我对那个领域很陌生。

0 投票
0 回答
79 浏览

scala - scalac 插件:如何在缺少 jar 的打字机阶段后使其工作

我目前正在尝试构建一个插件来访问 Scala 生成的 AST 以运行一些规则检查。到目前为止,它只漂亮地打印了 AST 以参与进来。AFAK,这个插件可能会在不同的阶段之后运行,但我尝试了这两个:

  • namer:如果此插件在 namer 阶段之后运行,则无论配置如何都会调用它。即使由于缺少 jar 导致许多符号无法解析也很好。
  • typer:如果缺少jar,则不会在分析单元上调用插件,除非我覆盖了reporter的hasErrors方法并将其设置为false。这似乎不是正确的方法。

我是否错误地认为我必须运行打字机阶段才能实现我的目标,因为将为我完成解决方案。如果我是对的,是否有 scalac 的配置可以帮助发出未解析类型的节点,而不是在编译单元级别停止编译?如果我错了,为什么我的插件看不到任何打印输出

那么演示文稿编译器会有所帮助吗?或者,也许使用插件的想法不是正确的。

这是用于调用的代码

0 投票
0 回答
56 浏览

scala - Scala 编译器为 Tuple[Int, _] 生成错误的方法签名

Scala 编译器将元组中的装箱/拆箱作为参数表现得很奇怪。

考虑代码:

因此,我得到的是 Object 而不是 Integer。我认为这与 tuple parameter being 有某种关系@specialized,但无法解决如何避免/解决此问题。

它导致的问题 - 无法通过对方法签名的反射来重构方法参数(例如,在解析 json 时)。

即使有办法获得正确的类型scala-reflect也无济于事,因为周围有很多 Java 库(如 Jersey)只使用 Java 反射。

UPD:好的,将Integer(而不是Int)放入Tuple作品中。但是为什么不自动完成呢?

0 投票
0 回答
264 浏览

scala - 使用 Scala 2.12.1 时编译速度慢

我们最近从 Scala 版本2.11.7升级到2.12.1。升级后我们注意到编译时间增加了大约 10 分钟。恢复到旧版本可以减少相同代码的编译时间。

作为此版本的一部分,是否引入了任何性能回归?

谢谢沙市

0 投票
2 回答
633 浏览

scala - 使用 scala 2.12 进行动态编译 - 来自 sbt test

我想测试我编写的转换一些 scala 源代码的工具,我想检查转换后的代码是否从 sbt 测试编译(使用 scalatest)。

我想用我的源代码以编程方式调用一个字符串上的 scala 编译器(全部都在一个独立的文件中)。

自最初的问题以来,我取得了一些进展。此代码适用于我的 IDE (IntelliJ),但不适用于sbt test会话

这是我的build.sbt

最初的错误是

我已在此答案之后的对象中build.sbt和对象中添加了注释行。它在 IDE 中没有任何改变。Compilation

我现在在 sbt 测试中有这个错误(编译正确打印类路径):

0 投票
3 回答
1994 浏览

java - Java Void 到 Scala 单元

我有一个 java 库方法需要一个类Void作为参数。例如,在com.mongodb.async.client.MongoCollection

我正在从 scala 访问此方法。Scala 使用的类型Unit等同于Void(如果我错了,请纠正我)

如何将SingleResultCallback[Unit]( 而不是SingleResultCallback[Void]) 传递给此方法?编译器不允许这样做。不应该收拾这个吗?