- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从给定的 Scala 项目中提取所有方法的调用图,这些方法是项目自身源代码的一部分。
据我了解,演示编译器并没有启用它,它需要一直向下到实际的编译器(或编译器插件?)。
您能否建议完整的代码,它可以安全地适用于大多数 scala 项目,但那些使用最古怪的动态语言功能的项目?对于调用图,我的意思是包含 class/trait + method
的有向(可能是循环)图边 A -> B 表示 A 可以调用 B 的顶点。
应避免调用或从库调用或“标记”为项目自身源之外的调用。
编辑:
请参阅我的宏天堂衍生原型(prototype)解决方案,基于@dk14 的领导,作为下面的答案。托管在 github 上,地址为 https://github.com/matanster/sbt-example-paradise .
最佳答案
这是工作原型(prototype),它将必要的基础数据打印到控制台作为概念证明。 http://goo.gl/oeshdx .
这是如何工作的
我已经在 macro paradise 的顶部样板中改编了来自 @dk14 的概念.
Macro paradise允许您定义一个注释,将您的宏应用于源代码中的任何注释对象。从那里您可以访问编译器为源代码生成的 AST,并且可以使用 scala 反射 API 来探索 AST 元素的类型信息。 Quasiquotes(词源来自haskell或其他东西)用于匹配相关元素的AST。
更多关于准报价
通常需要注意的重要一点是,quasiquotes 在 AST 上工作,但它们是一个乍一看很奇怪的 api,而不是 AST 的直接表示(!)。 AST 由天堂的宏注释为您挑选,然后准引号是探索手头的 AST 的工具:您使用准引号匹配、切片和切 block 抽象语法树。
关于 quasiquotes 的实际需要注意的是,有固定的 quasiquote 模板用于匹配每种类型的 scala AST - 用于 scala 类定义的模板,用于 scala 方法定义的模板等。These tempaltes are all provided here ,使得将手头的 AST 与其有趣的成分匹配和解构变得非常简单。虽然这些模板乍一看可能令人望而生畏,但它们大多只是模仿 scala 语法的模板,您可以自由更改 $
将它们中的变量名称添加到更符合您口味的名称中。
我仍然需要进一步磨练我使用的准引用匹配,这些匹配目前并不完美。但是,我的代码似乎在许多情况下都能产生所需的结果,并且将匹配精度提高到 95% 可能是可行的。
样本输出
found class B
class B has method doB
found object DefaultExpander
object DefaultExpander has method foo
object DefaultExpander has method apply
which calls Console on object scala of type package scala
which calls foo on object DefaultExpander.this of type object DefaultExpander
which calls <init> on object new A of type class A
which calls doA on object a of type class A
which calls <init> on object new B of type class B
which calls doB on object b of type class B
which calls mkString on object tags.map[String, Seq[String]](((tag: logTag) => "[".+(Util.getObjectName(tag)).+("]")))(collection.this.Seq.canBuildFrom[String]) of type trait Seq
which calls map on object tags of type trait Seq
which calls $plus on object "[".+(Util.getObjectName(tag)) of type class String
which calls $plus on object "[" of type class String
which calls getObjectName on object Util of type object Util
which calls canBuildFrom on object collection.this.Seq of type object Seq
which calls Seq on object collection.this of type package collection
.
.
.
很容易看出调用者和被调用者如何从这些数据中关联起来,以及如何过滤或标记项目源之外的调用目标。这就是 scala 2.11 的全部内容。使用此代码,需要为每个源文件中的每个类/对象/等添加注释。
关于scala - 提取 Scala 项目的完整调用图(困难的一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785439/
tuple :: (Integer a,Fractional b) => (a,b,String) tuple = (18,5.55,"Charana") 所以这是给我的错误 ‘Integer’ is
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我已经习惯了python和django,但我最近开始学习java。由于工作原因我没有太多时间,所以错过了很多类(class),现在我有点困惑,我必须做作业。 编辑 该程序应该根据每个运动员在自行车和比
这是一个困难的问题,但对专业人士来说很容易。 我在 mysql 中有以下字段:产品名称、mycost、sellprice 和 stock。因为我需要知道每种产品对我的商店的投资有多少,所以我创建了以下
我有 3 个表,其中已包含以下行: TBL_TESTER_LIST id tester_type tester_name 1 LMX LMX-01 2 LMX
我想只使用 GridBagLayout 来布局组件,如图所示。 我已经尝试了几个约束,但它永远不会以预期的结果结束,所以我想知道仅使用 GridBagLayout 是否真的可行。难点在于C1、C2、C
我遇到了以下代码没有结果的问题。但是,如果我取消注释掉指定的行,并注释掉它起作用的 bind_param 行,但这不是破坏了 mysqli 的目的吗?我的 var_dump 给了我的字符串(1)“1”
这个问题在这里已经有了答案: a good python to exe compiler? [closed] (3 个答案) 关闭 9 年前。 有了我之前问题的一些有用答案(见下文),我决定再试一次
我正在使用 Hadoop 分析 GSOD 数据 (ftp://ftp.ncdc.noaa.gov/pub/data/gsod/)。我选择了 5 年来执行我的实验 (2005 - 2009)。我配置了一
我在我的 macOS 应用程序的设置面板中使用 NSGridView。我是这样设置的: class GeneralViewController: RootViewController { pr
我正在尝试使用以下代码在 PHP 中自动安装 WordPress 发行版: $base_dir = '/home/username/wordpress_location'; chdir($base_d
在 Node.js 中将图像转换为 Base64 字符串时,我遇到了一个非常令人困惑的问题 这是我的示例代码: app.get('/image', (req, res) => { ServerAP
我在尝试运行我的应用程序时遇到一些错误,这里是 logcat java.lang.RuntimeException: Unable to instantiate activity Componen
基本上,我正在努力创建一个管理团队和球员的 Java 程序。 根据我的理解,我会有一个团队和一个玩家类。在团队类中会有 get 和 set 方法,以及某种形式的集合来正确存储球员,例如数组列表?然后在
我仍在尝试找出 JavaSwing 中的 BorderLayout,这真的很令人沮丧。 我希望能够将一个 Pane 拆分为 3 个包含的子面板,但我不完全确定如何包含它。 这是我的游戏类,它包含面板
下面的表设计(完整的模式见下文)还有很多需要改进的地方,并且已经造成了许多困难,但是我无法找出如何最好地将它们规范化。这些表格的目的是: ICD9-提供CICD9和CDESC组合的主查找。每个组合在I
这是我的表格: AB元组表 C 表,其中包含 A.id 和 B.id 的条目 D 表,其中包含带有 C.id 的条目和一个 bool 字段“open” 我想计算 D 表中“open”= true 且具
我在 YouTube 上跟踪了一个相当旧的教程,在视频中他以这种方式使用了 mysql_result: return (mysql_result($result,0) == 1) ? true : f
我正在尝试创建一个左侧面板的页面。该面板有一个页眉、一个内容区域和一个页脚。主面板包装器 div 应该是页面高度的 100%。页眉和页脚没有指定的高度,因为我只希望它们足够大以容纳其文本和填充,而我希
我有 TreeView ,我想在其中显示用户通过 file_dialog.getOpenFileNames() 选择的文件; file_dialog 是 QFileDialog。我确实创建了模型类:
我是一名优秀的程序员,十分优秀!