问题标签 [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 回答
168 浏览

scala - 如何使用 scalameta 解析和转换 sbt 项目中的所有源代码文件?

我想使用 scalameta 从基于 SBT 的 Scala 项目中解析所有源代码文件并对其进行转换。正如文档所述(https://scalameta.org/docs/trees/guide.html#from-programs-with-multiple-top-level-statements),我可以使用 scalameta 解析 SBT 文件,但如何获取相应的源项目的代码文件?我是否必须手动过滤 src/main/scala 文件夹中的所有 .scala 文件?

0 投票
1 回答
380 浏览

scala - 如果 decltp​​e 为空,如何使用 scalameta 获取变量的类型?

如果我有以下类型

在 Scalameta 中,可能会发生这样的变量 decltype 设置None为:

我仍然想知道xScala 推断出的变量的确切类型,而无需自己检查赋值表达式的类型。我知道我可以得到 10 是一个 Int 文字的信息,但是对于更复杂的表达式,为该类型提供一些辅助函数可能会有所帮助。scalameta 中是否有任何函数可以为您提供推断类型?

0 投票
1 回答
105 浏览

scala - How to replace all specific Term.Name expressions in an AST recursively with scalameta?

I would like to replace ALL occurences of specific Term.Name instances in the AST. Something like:

However, to achieve this, I will have to check for all different types of statements etc. and check inside these statements for the term. Is there any easier way with scalameta to replace all occurrences of a specific term?

0 投票
1 回答
244 浏览

scala - 如何将一个或多个 SemanticRules 与 scalafix 一起使用,类似于 scalameta 的 Transformer?

在教程https://scalacenter.github.io/scalafix/docs/developers/tutorial.html中,我看到了如何SemanticRule为 scalafix 实现 a。我想直接在我从磁盘读取的 Scala 文件的源代码中调用它并转换文件。

在 scalameta 中,我可以执行以下操作:

我想对 scalafix 做同样的事情,但使用SemanticRule. 如果我读到这个:https : //scalacenter.github.io/scalafix/docs/developers/tutorial.html#run-the-rule-from-source-code 它只向我展示了如何使用文件启动 scalafix 程序Scala 规则文件的路径,但这不是我想要的。

0 投票
1 回答
243 浏览

scala - 如何在scala中合并多个导入?

假设我有一个图书馆 a.com。每次在每个文件中,我都需要导入很多包,例如

我不想每次都在另一个项目的每个文件中编写这些代码。

另外,如果我想更改a.coma.net,我必须更改每个文件。

有没有办法防止这种情况发生?

0 投票
1 回答
711 浏览

scala - 在 scala 2 或 3 中,是否可以在运行时调试隐式解析过程?

在 Scala 语言中,隐式解析通常在编译时完成,有时会引发混淆错误信息,此类错误的一个著名示例是当无形 Generic 引发错误信息时,例如:

(详见https://books.underscore.io/shapeless-guide/shapeless-guide.html

解决这个问题的方法是在运行时运行隐式解析算法(内部应该是图查询算法),这至少有两个好处:

  • 调试工具可用于逐步重现解决过程,因此即使错误信息和文档不完整,也很容易发现错误。

  • 在许多情况下,类型信息可能无法在编译时确定(例如,类型取决于控制流)。如果隐式转换不能延迟到运行阶段,定义隐式转换的许多好处将无效。

所以我的问题是,Scala 2.x 或 Dotty 中是否存在此功能?还是在路线图上?

非常感谢您的意见。

0 投票
2 回答
536 浏览

scala - Scala条件编译

我正在编写一个 Scala 程序,我希望它可以与两个版本的大型库一起使用。

这个大库的第 2 版对 API 进行了非常小的改动(只有一个类构造函数签名有一个额外的参数)。

我真的不想分支我的代码。因为那时我需要维护两个分支,明天需要维护 3,4,.. 分支以进行微小的 API 更改:(

理想情况下,我们应该在 Scala 中有一个简单的预处理器,但这个想法很久以前就被 Scala 社区拒绝了。

我真的无法理解的一件事是:Scalameta在这种情况下可以帮助模拟预处理器吗?即有条件地解析两个源文件 - 比如说 - 在编译时已知的环境变量?

如果不是,您将如何解决这个现实生活中的问题?

0 投票
1 回答
141 浏览

scala - 是否可以使用宏来修改生成的结构化类型实例调用代码?

例如如下代码:

我用反编译器查看字节码,并注意到编译生成一个 java 接口“Test.Class”作为伪代码:

和一个实现'Test.Class'的类'Test$$anon$1',伪代码为:

然后编译器将变量“c”初始化为:

然后调用成员'f1'作为正常调用:

但它使用反射调用'f2':

在这里,由于匿名类'Test$$anon$1'的定义在同一范围内可见,是否可以使用宏更改生成的代码以调用'f2'作为普通字段避免反射?

我只想更改同一范围内的调用代码,不想跨范围更改反射代码,例如将结构类型实例作为函数调用中的参数。所以我觉得理论上是可以的。但我不熟悉 scala 宏,建议和代码示例表示赞赏。谢谢!

0 投票
1 回答
125 浏览

scala - scala.meta parent of parent of Defn.Object

Let it be the following hierarchy:

I parse the scala file containing the X and

I want to know if its parent or grandparent is Z.

I can check for parent as follows: Given that x: Defn.Object is the X class I parsed,

will give Y.

Question: Any idea how I can get the parent of the parent of X (which is Z in the above example) ?

Loading Y (the same way I loaded X) and finding it's parent doesn't seem like a good idea, since the above is part of a scan procedure where among all files under src/main/scala I'm trying to find all classes which extend Z and implement run, so I don't see an easy and performant way to create a graph with all intermediate classes so as to load them in the right order and check for their parents.

0 投票
1 回答
77 浏览

scala - Scalafix:解析对象应用方法

我有一个定义了一些应用方法的对象,然后使用它

使用 scalafix/scalameta 时,我无法找到获取实际apply方法句柄的方法(在我的情况下,我正在尝试检查参数名称和类型以查找 scalafix 规则)

当我匹配并打印解析的 SymbolInformation 时,我得到了对该对象的引用。所以这

印刷

但我希望它能够解决确切的apply方法。

(Scalafix 版本 0.9.20)