- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 Java M3 模型中提取有关类型声明的一些事实。从一组 M3 文件中,我尝试使用理解,例如
> [type(m) | m <- models];
虽然我得到:未声明的变量:类型
然后我只是尝试从方法中获取事实,使用:
> [methods(m) | m <- models];
正如文档所解释的。尽管如此,我得到了类似的东西:
|std:///lang/java/m3/Core.rsc|(8877,1,<186,52>,<186,53>): NoSuchAnnotation("declarations")
那么,在 M3 模型上导航的正确方法是什么?如何获取有关 M3 模型的类和接口(interface)的信息?
我使用 createM3FromProjectJars 函数构建了 M3 文件。
最佳答案
好问题;目前有关这方面的文献还很少。最好的示例代码在这里:http://tutor.rascal-mpl.org/Recipes/Recipes.html#/Recipes/Metrics/MeasuringJava/MeasuringJava.html
M3模型的源代码可以在这里解释很多:
例如后者包含以下定义:
anno rel[loc from, loc to] M3@extends; // classes extending classes and interfaces extending interfaces
anno rel[loc from, loc to] M3@implements; // classes implementing interfaces
anno rel[loc from, loc to] M3@methodInvocation; // methods calling each other (including constructors)
anno rel[loc from, loc to] M3@fieldAccess; // code using data (like fields)
anno rel[loc from, loc to] M3@typeDependency; // using a type literal in some code (types of variables, annotations)
anno rel[loc from, loc to] M3@methodOverrides; // which method override which other methods
anno rel[loc declaration, loc annotation] M3@annotations;
前者包含这些:
anno rel[loc name, loc src] M3@declarations; // maps declarations to where they are declared. contains any kind of data or type or code declaration (classes, fields, methods, variables, etc. etc.)
anno rel[loc name, TypeSymbol typ] M3@types; // assigns types to declared source code artifacts
anno rel[loc src, loc name] M3@uses; // maps source locations of usages to the respective declarations
anno rel[loc from, loc to] M3@containment; // what is logically contained in what else (not necessarily physically, but usually also)
anno list[Message] M3@messages; // error messages and warnings produced while constructing a single m3 model
anno rel[str simpleName, loc qualifiedName] M3@names; // convenience mapping from logical names to end-user readable (GUI) names, and vice versa
anno rel[loc definition, loc comments] M3@documentation; // comments and javadoc attached to declared things
anno rel[loc definition, Modifier modifier] M3@modifiers; // modifiers associated with declared things
这些定义准确地记录了 Java M3 的模型。如果直接从 jar 文件生成 M3 模型,我不知道会存在多少此类信息。从 Eclipse 源项目中,所有这些表都已填充。
要实现您的查询,您可以:
[ m@types | m <- models]
;生成一个列表[rel[loc name, TypeSymboltyp]] { *m@types | m <- models}
;所有模型中所有类型表的 rel[loc name, TypeSymboltyp] 并集{ t | m <- models, t <- m@types}
;与之前的定义不同关于rascal - 从 M3 模型中提取事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40865558/
Rascal 会做尾调用优化吗?特别是,如果我使用尾递归而不是那些内置循环构造编写代码,我是否期望效率降低? 最佳答案 是的,您应该期待当前实现的效率损失。 我们确实希望编译器(现在正在编写)将来进行
我在标准库文档中没有看到。谷歌搜索给出了 HitTest 门的“Rascal Unit travel pet sterilization and wellness Clinic pricing [si
我想知道是否有在 Rascal 中创建饼图的选项。这可以通过制作单独的饼图切片来完成,但 ellipse() 方法没有角度选项。以前有一个 Wedge() 方法,但已从库中删除。 最佳答案 简短的回答
我正在尝试创建一种递归查找 For 循环的方法。我需要先初始化返回值(一个元组),但我该怎么做呢? 我试过: tuple[list[Expression],Statement] = []; 另外,如果
Rascal 中的命名约定是什么?似乎模块(而不是中间路径)倾向于大写,变量名也是如此。这有什么不同吗?惯例是什么以及其背后的基本原理是什么? 最佳答案 我们正在努力达成以下公约: 函数、变量名、构造
所以我已经使用 Rascal 一段时间了,但我想知道是否可以在不使用 println 和终端的情况下支持调试? 就像 Visual Studio 中的 C# 一样,单步执行代码、进入函数等等。 对我来
我正在尝试用 Rascal 编写一段我认为非常简单的代码:测试列表 A 是否包含列表 B。 从一些非常基本的代码开始创建字符串列表 public list[str] makeStringList(in
我可以从 Rascal 调用 Java 函数吗?我想编写 RASCAL 分析器,但想通过调用 java 函数访问 CFG 节点。这在 Rascal 中可能吗?简单地说,我可以包装现有的 java 应用
我真的很希望能够从 REPL 外部运行一些 Rascal 的程序(例如,作为脚本的一部分,或从另一个程序调用)。我使用 Rascal 的目的是在一个更大的框架中进行中间阶段,所以我想知道从另一个程序集
我真的很希望能够从 REPL 外部运行一些 Rascal 的程序(例如,作为脚本的一部分,或从另一个程序调用)。我使用 Rascal 的目的是在一个更大的框架中进行中间阶段,所以我想知道从另一个程序集
如果我想启动模块内的所有测试,我只需编写: > import Example; > :test 并且所有测试 bool 函数都运行。但是,我想使用 Rascal .jar 来启动它们以实现 CI 目的
我希望它像在 Haskell 中一样返回 [1,2,3,4,5]。 最佳答案 简短回答:左边的索引是包含性的,右边的索引是设计的。 长答案:短答案的原因是列表是零索引的,我们注意到每个人都必须写(或忘
要将项目名称作为字符串获取,我可以使用: loc project = |project://Test/|; str name = project.authority; 是否有类似的东西可用于类或方法?
我发现有时我必须明确地为模式变量指定类型,否则 Rascal 将无法按预期工作。控制台中的以下 session 说明了一切: rascal>data foo = bar(int); ok rascal
我有以下 Rascal 模块: module foo import IO; import ParseTree; extend lang::std::Layout; lexical CHAR = [ab
我的网络服务器收到以下字符串:"|project://Detector/src/exporter.rsc|(1762,28,,)"使用 toLocation()将其转换为位置的函数将导致 MalFor
我正在研究使用 Rascal 计算 java 方法的圈复杂度。 一种方法是: 从方法 获取 AST 在这棵树上使用访问模式 检查以下所有将 CC 加一的关键字:case , catch , do ,
如何检查我的变量是否有注释? 我知道可以使用关键字 has 对属性完成此操作。 是否有类似的方法可以对注释执行此操作? 最佳答案 有两种方法可以做到这一点。我已在下面给出的代码中显示了这两个内容。 r
这似乎有点像一个微不足道的问题,但我坚持使用我自己的岛语法解析文件 EOF 结尾。顺便说一句,我正在使用新的 VScode 扩展。 我主要使用基本食谱中的示例,并具有具有以下布局规则的简单语法: la
是否可以使用列表理解或类似的东西将这样的访问重写为单行? list[str] nodeNames = []; visit (ast) { case someNode(str name): {
我是一名优秀的程序员,十分优秀!