M3 的自定义 Rascal 位置协议

Custom Rascal location protocols for M3

Java 特定的 M3 具有这些漂亮的位置协议,如 java+methodjava+enumjava+variable 等等。据我所知,这些漂亮的位置用作 "real" 位置的别名,例如 |project://example-project/src/HelloWorld.java|(0,1,<2,3>,<4,5>),指的是该文件中的特定代码段。

我想为我自己的 CSS 特定 M3 创建那些漂亮的位置。所以它们应该看起来像 css+declarationcss+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也是可以的。这基本上向查找注册表添加了一个查找映射,首先按方案索引,然后按权限索引,最后按路径名索引。