问题标签 [scalameta]

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

scala - Scalameta 起重绳

我想注入一个方法“toCSV”来将一个类解析为 CSV 字符串。我的函数有两个参数:

  • 序列[字符串]:标题
  • Seq[Seq[Any]] : 字段

我的宏:

变量 Term 是一个 Seq[String] 并且 quasiquotes 语法只接受一个 Term。因此,发生以下错误:

你有解决方案吗 ?

预先感谢,

0 投票
1 回答
552 浏览

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

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

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

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

0 投票
1 回答
55 浏览

scala.js - 使用 scala.meta 在 scala.js 中更轻松地创建非原生 JS 特征实例

我创建了很多非本地 JS 特征实例作为 javascript 函数的参数

创建实例:

但是,在使用覆盖值等定义这些时有很多打字噪音。

最好只键入一个键值对列表并将其转换为经过类型检查的特征,这样您就不会意外添加特征中未定义的 val:

并将其转换为上述“新 ElementOpts”语法。我使用“lit”来暗示 javascript 文字对象。

Scalameta 能做到这一点吗?如果是这样,是否有类似的例子?或者这应该在某种预处理器中处理。

0 投票
0 回答
55 浏览

scalameta - 使用 scala-meta,如何推断类型

当在其他编译单元 A 中引用类型 T 时,我希望能够检测到类型 T 的完整类型名称。所以说 A 是

我觉得 scalameta 可能不是类型检测的最佳工具,是否有一种安全/简单的方法来检测所有类型?

0 投票
1 回答
121 浏览

scala - Scalameta 的语义 API

Scalameta 的教程中,它指出语义 API 可用于名称解析 ( println=> _root_.scala.Predef.println)。常见问题解答“如何使用语义 API?” scalafix的链接,但我找不到教程或具体示例。所以我还是不清楚。有人可以指出一些具体的例子或教程吗?

谢谢!

0 投票
1 回答
140 浏览

scala - 使用 Scalameta 获取引用的完全限定名称

我正在尝试编写一个简单的程序来遍历从给定方法开始的所有引用代码,使用scalameta.

我能够跟踪调用,但无法解析方法引用。

分析/src/main/scala/codelab/FindMe.scala

生成并加载语义数据库FindMe.scala并检查方法的用法someRecognizeableName

我可以看到db.names列表中的第一个调用:

但是,第二个,当我不调用该方法时,只需传递引用显示如下:

因此,当我尝试从 开始跟踪引用时,在第二种情况下main,我没有得到引用的完全限定名称。someRecognizeableName

问题:有没有办法从语义数据库中为该引用获取一个完全限定的名称?



重现上述内容的完整来源

运行说明:

分析/src/main/scala/codelab/FindMe.scala

分析器/src/main/scala/Main.scala

分析/构建.sbt

分析器/build.sbt

0 投票
2 回答
623 浏览

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

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

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

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

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

0 投票
1 回答
132 浏览

scala - Scala 表达式之间的区别

直到最近,我的理解是下面的两个 Scala 语句是可以互换的。

但我玩过 scala meta,查看了它们生成的 AST,

Nil在 AST 中找到中缀表达式的 a。进一步挖掘,我发现中缀选项允许类型参数:

在这种情况下,我不明白他们的目的是什么。它们什么时候有用?为什么它们被允许用于中缀操作而不是“应用选择”操作(expr.op(arg1, arg2,...))?

0 投票
1 回答
91 浏览

scala - 在编译时初始化工厂

我有一个工厂,它应该根据名称返回一个实现。

为了使对“getModule”方法的每次调用不创建实例,有一个映射,其中所有模块都必须在引导类中初始化。我想摆脱手动执行此操作的需要(所有类都有一个独特的功能)。

我想到的选项列表:

  • 反射(我们可以使用 Scala 反射 API 或任何第三方库)
    • 自动化过程。
    • 需要在启动时立即初始化。
    • 反思是一种痛苦。
  • 元编程(ScalaMeta)+反射
    • 宏只更改代码,稍后执行。

我们可以将初始化过程移到编译时间吗?

我知道编译器可以优化和替换代码,编译前的下一个片段

在编译编译器将该部分更改为 10 之后,我们可以使用一些指令或其他工具在编译时评估和执行一些代码并仅使用最终值吗?

0 投票
1 回答
126 浏览

scala - Scala Meta:对版本感到困惑

在本教程中,您可以找到 Scala-Meta 的 2 个版本。

我有点困惑,因为他们似乎指的是同一个项目:

有人可以指出其中的区别,以及何时使用其中的哪一个?

教程只提到,"3.7.2"但我得到了例外

ERROR: new-style ("inline") macros require scala.meta

在这里解释:new-style-inline-macros-require-scala-meta