问题标签 [semanticdb]

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

scala - Scalameta 的语义 API

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

谢谢!

0 投票
0 回答
164 浏览

scala - ScalaMeta、ScalaFix 和 SemanticDB 之间的关系

我有以下信息:

  • Scalameta:能够从源文件生成 AST


  • SemanticDB:包含来自已解析源文件的符号信息

  • ScalaFix:基于 ScalaMeta 和 SemanticDB,因此它具有访问符号信息和遍历 AST 的能力。

使用 ScalaMeta 加载源文件非常简单,如下所示:

从上面的代码片段可以看出,ScalaMeta 将源文件解析为 type Source

现在考虑下面的代码片段,其中 ScalaFix 使用类型树SemanticDocument

检查上面的两个代码片段表明 ScalaMeta 可以将 Scala 源解析为 type Source。ScalaFix 似乎将其解析为implicit SemanticDocument. SemanticDocumenthas 字段由 ScalaMeta 实现,tree它生成一个可遍历的 AST 数据结构,就像将源文件解析为 type 所产生的一样Source。这显示了 ScalaMeta 和 ScalaFix 之间的关系。但是,我担心的是我需要加载 Scala 源代码并在其上使用 ScalaFix 来访问symbol.info,但ScalaFix文档没有显示如何执行此操作。

当我尝试SemanticDocument在第一个代码片段中加载源文件时,而不是Source

我得到一个错误no parameters found for parameter parse in parse[SemanticDocument]。另请注意,尝试symbol.info 在第一个代码片段中使用也会产生有关隐式类型的错误。第二个代码片段不是这种情况,因为加载的doc参数是implicit parameter of type SemanticDocument.

那么 ScalaFix 是如何加载源文件的SemanticDocument呢?

0 投票
1 回答
70 浏览

scala - 使用 ScalaFix 从 Scala 源文件中获取 SemanticDocument

将 Scala 源文件解析为SemanticDocumentusing的步骤是什么ScalaFix

0 投票
1 回答
380 浏览

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

如果我有以下类型

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

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

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

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

例如如下代码:

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

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

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

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

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

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

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

0 投票
0 回答
13 浏览

scala - 如何为 SemanticDB 使用 Scala 绑定?

scalameta 网站在这里说“semanticdb 库包含与 SemanticDB protobuf 模式的 ScalaPB 绑定。使用这个库,可以将 SemanticDB 实体建模为 Scala 案例类,并将它们序列化/反序列化为字节和流。”

伟大的。那么我该怎么做呢?

我尝试过浏览 scaladocs,但我永远找不到外部 API 或我应该使用的任何顶级对象。如果这只是我对如何使用 scaladocs 的不熟悉,请原谅我,但我几乎可以找到关于如何实际使用 SemanticDB 工具的零文档)。

(我的目标是获取与调用图相关的信息,例如 IDE 中的“转到”,但以编程方式完成)