M3 的自定义 Rascal 位置协议
Custom Rascal location protocols for M3
Java 特定的 M3 具有这些漂亮的位置协议,如 java+method
、java+enum
、java+variable
等等。据我所知,这些漂亮的位置用作 "real" 位置的别名,例如 |project://example-project/src/HelloWorld.java|(0,1,<2,3>,<4,5>)
,指的是该文件中的特定代码段。
我想为我自己的 CSS 特定 M3 创建那些漂亮的位置。所以它们应该看起来像 css+declaration
或 css+ruleset
。我已经有了实际的 "real" 位置,我现在直接将它们传递给 M3 核心。但这看起来真的很乱,你无法区分这些位置。
那么如何 link 我的 "real" 位置到这些漂亮的位置,以便它们在 Rascal 终端中实际运行?有人可以告诉我实现这一目标所需的步骤吗?或者给我举个例子?我已经查看了 Java 特定 M3 的实现,但我似乎无法理解它。
好问题。要注册位置以便它们在 REPL 和 IDE 中解析以打开文件等,您必须使用 "name server"
注册它们
import analysis::m3::Registry;
registerProject(|project://myProject|, myM3Model); // side-effect alert!
此代码将使用 M3 模型中的 @declarations
table,它将您的逻辑位置映射到物理位置。
它是这样的:
void registerProject(loc project, M3 model) {
rel[str scheme, loc name, loc src] perScheme
= {<name.scheme, name, src> | <name, src> <- model@declarations};
for (str scheme <- perScheme<scheme>)
registerLocations(scheme, project.authority, (name : src | <name, src> <- perScheme[scheme]));
}
从这段代码中你还可以了解到,直接调用registerLocations
也是可以的。这基本上向查找注册表添加了一个查找映射,首先按方案索引,然后按权限索引,最后按路径名索引。
Java 特定的 M3 具有这些漂亮的位置协议,如 java+method
、java+enum
、java+variable
等等。据我所知,这些漂亮的位置用作 "real" 位置的别名,例如 |project://example-project/src/HelloWorld.java|(0,1,<2,3>,<4,5>)
,指的是该文件中的特定代码段。
我想为我自己的 CSS 特定 M3 创建那些漂亮的位置。所以它们应该看起来像 css+declaration
或 css+ruleset
。我已经有了实际的 "real" 位置,我现在直接将它们传递给 M3 核心。但这看起来真的很乱,你无法区分这些位置。
那么如何 link 我的 "real" 位置到这些漂亮的位置,以便它们在 Rascal 终端中实际运行?有人可以告诉我实现这一目标所需的步骤吗?或者给我举个例子?我已经查看了 Java 特定 M3 的实现,但我似乎无法理解它。
好问题。要注册位置以便它们在 REPL 和 IDE 中解析以打开文件等,您必须使用 "name server"
注册它们import analysis::m3::Registry;
registerProject(|project://myProject|, myM3Model); // side-effect alert!
此代码将使用 M3 模型中的 @declarations
table,它将您的逻辑位置映射到物理位置。
它是这样的:
void registerProject(loc project, M3 model) {
rel[str scheme, loc name, loc src] perScheme
= {<name.scheme, name, src> | <name, src> <- model@declarations};
for (str scheme <- perScheme<scheme>)
registerLocations(scheme, project.authority, (name : src | <name, src> <- perScheme[scheme]));
}
从这段代码中你还可以了解到,直接调用registerLocations
也是可以的。这基本上向查找注册表添加了一个查找映射,首先按方案索引,然后按权限索引,最后按路径名索引。