问题标签 [scala-macro-paradise]

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

scala - SBT 插件:如何将编译器插件添加为不向下游传播的依赖项?

我正在写一个 SBT 插件。我想使用 Circe JSON 库,但它需要 Scala 2.10 上的 Macro Paradise 编译器插件。

通常你添加编译器插件build.sbt和 SBT 插件到project/plugins.sbt.

现在,当您构建 SBT 插件时,其他插件成为依赖项,因此您将它们放入并将build.sbt它们传播到您使用 SBT 插件的项目。

当我将以下片段放入build.sbt我的 SBT 插件时:

Paradise 编译器插件是否会传播到下游项目?

0 投票
0 回答
249 浏览

scala - 使用 scala 宏生成导入语句

我有以下代码:

@mymacro是一个 scala 宏,用于检查它是否已被@imports注解。部分实现如下:

目前宏能够将整个val _1 = ...语句转换为import scala.collection.mutable.ListBuffer(没有 {} 括号!)但是当编译继续时,我不断收到not found: type ListBuffer编译错误。现在我想知道是否有可能以某种方式修复此错误,而不必在文件顶部定义导入语句。

我正在使用 Scala 2.10 宏天堂插件

0 投票
1 回答
204 浏览

eclipse - Eclipse:解决 Scala 中的隐式转换和宏注释的问题

我正在使用macroparadise 在我的项目中生成方法和案例类(宏本身是在与我使用它们的核心文件不同的项目中定义的)。

一切都按预期编译和运行,但 Eclipse 无法解析我的宏生成的变量和方法。但是,当我关闭并重新打开 Eclipse 时,它​​可以完美地识别所有内容;我可以将鼠标悬停在类和方法上并获取正确的信息。但是,只要我更改任何内容,甚至只是关闭并重新打开引用生成方法的文件,Eclipse 就会在所有生成的变量和方法下划线并告诉我“未找到:值 {name}”(其中 {name} 是 var 名称)。

更新
我已将行为隔离到以下情况:

  1. 我从一个文件中的带注释的对象 A 开始,以及在另一个文件中使用 A.hello 的对象 B。
  2. 我编译 A 的文件,将方法“hello”添加到对象 A。
  3. 一切正常,直到(!)我重新打开包含对象 A 的文件。

问题:当我打开一个文件时,Eclipse 会做什么?它是否尝试根据写入的文件而不是编译的文件重新索引一个类?
结束更新

Eclipse 如何解析变量?它是否正在查看我的目标/文件夹中的类文件?我的所有生成代码都有 *.class 文件,所以如果 Eclipse 正在查看这些文件,这些变量应该确实存在。

有没有人让 Eclipse 正确解决这些变量?我尝试了 IntelliJ IDEA,但 IDEA 无法使用隐式转换和宏来解决任何问题(我遵循了我在网上找到的指示,但没有运气)。

信息:
面向 Java 开发人员的 Eclipse IDE

版本:氧气发布 (4.7.0)内部版本
号:20170620-1800

Scala 插件
scala-ide.org
4.4.1.v-2_11-201605041057-92a3ed3
org.scala-ide.sdt.feature

编译插件:
macroparadise
org.scalamacros Paradise_2.11.8
version
2.1.0

0 投票
1 回答
544 浏览

scala - 新式(“内联”)宏需要 scala.meta

我刚刚更新到 scala meta 2.0.0-M1 和最新的 scala 2.12.3,现在宏不再编译。我所做的唯一更改是将元版本从 1.8.0 更改为 2.0.0-M1。

错误:新式(“内联”)宏需要 scala.meta

有人知道是否有快速解决此问题的方法吗?

我希望开始尝试一些语义改进。

0 投票
1 回答
221 浏览

scala - Scala 宏:生成的类无法使用未实现的成员进行编译

我的问题是我生成的类的成员没有被识别为已实现。这是为 Scala 2.10/2.11/2.12 构建的,默认为 2.11。使用宏天堂 2.10。

这样做的目的是将某些特征标记为可冻结,并为每个可冻结的方法生成一个实现类,这些方法将在访问数据时调用scala.util.Try其方法。get所有不可冻结的方法都用throw new IllegalStateException. 并且创建了一个自定义freeze方法,该方法创建了一个Frozen类的实例,该实例使用 trait 定义的方法填充了所需的数据。

我已经设置了一个注释宏以放置在特征上并生成一个带有内部类的伴随对象Frozen,如下所示:

当我尝试在 trait 上运行宏时发生以下错误JavaInfo

特质本身如下:

Frozen即使我在我正在构建的树中看到实现,也会收到错误,表明该类没有实现任何内容。

有问题的代码在这里:https ://github.com/chipsenkbeil/scala-debugger/blob/AddFreezableMacroSupport/scala-debugger-macros/src/main/scala/org/scaladebugger/macros/freeze/FreezableMacro.scala

您可以通过检查该分支并运行来测试失败sbt scalaDebuggerApi/compile,这将为 Scala 2.11 编译宏项目,然后是 API 本身。

0 投票
1 回答
3375 浏览

scala-ide - 在 scala ide 上设置正确的 scala 版本

我正在尝试在 scala IDE 上开发一个项目,但我在 scala IDE 上遇到了构建问题。
在 sbt 上,项目构建良好。我使用了 eclipse sbt 插件并在 scala IDE 上导入了项目。存在构建错误,这使得 ide 几乎无用。
错误之一是Compiler plugin paradise_2.12.1-2.1.0.jar is cross-compiled with incompatible version for this project: 2.12.1 vs 2.12.2
我认为 scala 次要版本是兼容的,尽管我看到某些实验模块存在异常。宏天堂插件是那些例外之一吗?
我该如何解决?我可以告诉 scala IDE 使用 2.12.1 吗?sbt eclipse 插件不应该解决这个问题吗?我应该报告错误(向哪个项目)?
我正在处理的项目将 scala 版本定义为“2.12.1”,但我不想更改它。我正在使用 scala ide 版本 4.6.1。

0 投票
0 回答
85 浏览

scala - 吸血鬼方法、类型提供程序宏和缺少 runtime.VolatileObjectRef

我正在尝试编写一个使用此要点中描述的吸血鬼方法技巧的类型提供程序宏;这是我的实现的最小模型:

这是一个愚蠢的例子,真正的实现试图使用这个技巧来创建派生类型类实例的捆绑,这些实例无需反射调用即可访问。真实版本和这个版本都存在的问题是,如果我在函数中使用它们,它们可以正常工作,但如果我尝试在 aclassobject定义的根目录使用它们,它们会使编译器崩溃:

任何解决此问题的帮助都将非常受欢迎,谢谢。

0 投票
1 回答
552 浏览

scala - Scala 宏:根据文件内容生成代码

我想根据一些文件生成 scala 类。文件的放置无关紧要(它可以是资源文件夹或文件可以放在我的 scala 源文件附近)。

执行 scala 宏时如何读取它们?(我使用 StaticAnnotation 的内联 def apply(defn: Any): Any 方法)

当我尝试使用资源时,找不到它们(我想找不到这些资源,因为它是编译时间并且项目尚未编译)我想阅读放置在我的 scala 源附近的文件,但是如何执行宏时我得到源文件路径?

0 投票
0 回答
74 浏览

scala - 使用编译器插件/宏递归包装方法调用

大纲

我有一个看起来像这样的 API:

ExternalApi实际上在我的库外部,所以不要修改它)有一系列调用,我想用MyApi.process调用自动包装,metadata参数派生自最终类型的T.

为了说明,要包装的调用可以有任何形式,包括嵌套调用和其他 AST 子树类型(例如Blocks)中的调用,例如:

由于编译器插件“免费”递归地处理 AST 中的匹配结构,因此我决定使用它们。

但是,由于我需要匹配特定的类型签名,因此插件遵循该typer阶段。

这是 的代码PluginComponent

这似乎可以正确解析标识符以及类型,输出例如:

不幸的是,我在编译过程中遇到错误,开始于:

问题

看起来我在用类型定义搞砸了,但它是什么?

具体来说:

在上述要求的限制下,如何正确地用一个调用来包装每个ExternalApi.createX调用?MyApi.process


笔记

  1. 鉴于所需的样板数量,我已经建立了一个完整的示例项目。它在这里可用
  2. 答案不必定义编译器插件。如果您能够使用宏覆盖所有相关调用,那也很好。
  3. 最初包装的调用类似于: def process[T <: TypeConstructor[_ <: SpecialElement] : TypeTag](l: T): T,这里的设置实际上是一种解决方法。因此,如果您能够生成这种类型的包装调用,即包含运行时的调用TypeTag[T],那也很好
0 投票
2 回答
623 浏览

scala - Scala 宏自动生成流畅的构建器

我正在与如下所示的外部 Java API 交互:

基本上,Java API 公开了一堆.setXXXX返回void和设置某些东西的方法。我无法控制这些外部 POJO。

因此,我想编写一个流利的buildScala 宏来检查对象并.withXXXX()为每个 void setXXXX()返回的方法创建一个构建器模式类型方法this

这可能吗?我知道我无法使用宏生成新的顶级对象,def因此我对其他具有类似人体工程学的建议持开放态度。