问题标签 [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.
scala - Scala Compiler Plugin:如何访问子类中覆盖方法的特定类型信息?
我正在开发一个 Scala 编译器插件,试图转换每个函数调用,比如
进入
但是,当函数调用是另一个函数的返回值时,我会遇到麻烦。这是我要转换的代码
在上面的示例中,编译器可以成功推断出 的结果new B
应该转换为A[Int]
,因为func1
in应该具有与inMyObject
相同的返回类型。func1
MyTrait[Int]
但是,当我使用编译器插件进行转换时会出现问题。
现在,newvalue
不提供任何额外的类型信息,而是编译器必须推断它。结果类型newvalue
是B[Nothing]
,这是编译器可以推断的最具体的类型。
然后当我尝试newvalue
作为func1
. func1
requires A[Int]
, whilenewvalue
是 type B[Nothing]
,无法匹配。
如果我能提前知道所需的返回类型,问题就可以解决func1
,因为我可以newvalue
用这个返回类型指定,如下所示
上面的代码可以编译成功。
我的问题是,在编写 Scala 编译器插件时,我怎么知道func1
in的返回类型,因为 的签名并没有告诉它的返回类型。MyObject
A[Int]
func1
我认为找出编译器如何从in的签名中获取inA[Int]
的返回类型也很有帮助。 func1
MyObject
func1
MyTrait[Int]
当MyTrait
和MyObject
被定义在两个不同的源文件中时,这个问题就变得更加困难了。
scala - 评估源而不返回值
Twitter util 库为如何在运行时评估 Scala 代码提供了一个很好的实用程序,例如:
但是是否可以评估不返回任何内容的代码(返回状态 true/false - 已编译/失败),然后开始使用在评估部分中定义的类,例如:
所以我对 {_MAGIC_METHOD_} 部分很好奇,是否可以使用一些库来做到这一点?Twitter实用程序可以吗?其他一些实用程序库?Scala 编译器(Scala 编译器 - http://mvnrepository.com/artifact/org.scala-lang/scala-compiler)?
提前感谢您的帮助和任何建议。
scala - 将标识函数映射到 Scala 集合的复杂性?
当我使用该方法将 Scala 预定义identity
函数应用于集合时map
,原始集合将原样返回。但是,编译器是否足够聪明,可以简单地将未更改的集合作为O(1)
操作返回?还是将恒等函数仍应用于原始集合中的每个元素以产生O(n)
操作?
scala - 密封特征中的方法在类文件中给出重复的字段名称和签名
当我添加它时process()
,IntList
它会给出一个运行时“ Duplicate field name&signature in class file Cons$3...
”。仅当在sealed trait
函数内部定义时才会发生这种情况。
scala - 如何在 Scala 中获取动态创建的类的完整类名
我有一种情况,我必须获取在 Scala 中动态生成的类的完全限定名称。这是我到目前为止所拥有的。
显然这只是一个玩具示例,但我只是不知道如何获得 Foo 的完全限定名称。我尝试将包声明粘贴到代码中,但在调用tb.compile
.
有谁知道如何获得完全限定的类名或(甚至更好)指定 Foo 编译的包?
谢谢
编辑
使用提出的解决方案后,我能够获得类名。然而,下一步是注册这个类以便稍后采取一些行动。具体来说,我正在尝试利用 Apache Spark 中的UDTRegistration来处理我自己的自定义UserDefinedType。当我手动创建所有类型时,此策略效果很好,但是,我想使用它们来扩展我可能不知道的其他类型。
在阅读完这篇文章之后,使用在运行时使用反射编译的代码似乎无法实现我想要做的事情。也许更好的解决方案是使用 Scala 宏,但我对那个领域很陌生。
scala - scalac 插件:如何在缺少 jar 的打字机阶段后使其工作
我目前正在尝试构建一个插件来访问 Scala 生成的 AST 以运行一些规则检查。到目前为止,它只漂亮地打印了 AST 以参与进来。AFAK,这个插件可能会在不同的阶段之后运行,但我尝试了这两个:
- namer:如果此插件在 namer 阶段之后运行,则无论配置如何都会调用它。即使由于缺少 jar 导致许多符号无法解析也很好。
- typer:如果缺少jar,则不会在分析单元上调用插件,除非我覆盖了reporter的hasErrors方法并将其设置为false。这似乎不是正确的方法。
我是否错误地认为我必须运行打字机阶段才能实现我的目标,因为将为我完成解决方案。如果我是对的,是否有 scalac 的配置可以帮助发出未解析类型的节点,而不是在编译单元级别停止编译?如果我错了,为什么我的插件看不到任何打印输出
那么演示文稿编译器会有所帮助吗?或者,也许使用插件的想法不是正确的。
这是用于调用的代码
scala - Scala 编译器为 Tuple[Int, _] 生成错误的方法签名
Scala 编译器将元组中的装箱/拆箱作为参数表现得很奇怪。
考虑代码:
因此,我得到的是 Object 而不是 Integer。我认为这与 tuple parameter being 有某种关系@specialized
,但无法解决如何避免/解决此问题。
它导致的问题 - 无法通过对方法签名的反射来重构方法参数(例如,在解析 json 时)。
即使有办法获得正确的类型scala-reflect
也无济于事,因为周围有很多 Java 库(如 Jersey)只使用 Java 反射。
UPD:好的,将Integer
(而不是Int
)放入Tuple
作品中。但是为什么不自动完成呢?
scala - 使用 Scala 2.12.1 时编译速度慢
我们最近从 Scala 版本2.11.7升级到2.12.1。升级后我们注意到编译时间增加了大约 10 分钟。恢复到旧版本可以减少相同代码的编译时间。
作为此版本的一部分,是否引入了任何性能回归?
谢谢沙市
scala - 使用 scala 2.12 进行动态编译 - 来自 sbt test
我想测试我编写的转换一些 scala 源代码的工具,我想检查转换后的代码是否从 sbt 测试编译(使用 scalatest)。
我想用我的源代码以编程方式调用一个字符串上的 scala 编译器(全部都在一个独立的文件中)。
自最初的问题以来,我取得了一些进展。此代码适用于我的 IDE (IntelliJ),但不适用于sbt test
会话
这是我的build.sbt
最初的错误是
我已在此答案之后的对象中build.sbt
和对象中添加了注释行。它在 IDE 中没有任何改变。Compilation
我现在在 sbt 测试中有这个错误(编译正确打印类路径):
java - Java Void 到 Scala 单元
我有一个 java 库方法需要一个类Void
作为参数。例如,在com.mongodb.async.client.MongoCollection
:
我正在从 scala 访问此方法。Scala 使用的类型Unit
等同于Void
(如果我错了,请纠正我)
如何将SingleResultCallback[Unit]
( 而不是SingleResultCallback[Void]
) 传递给此方法?编译器不允许这样做。不应该收拾这个吗?