2016-04-22 17 views
2

Java特定的M3有這些漂亮的定位協議,如java+method,java+enum,java+variable等等。據我瞭解,這些漂亮的位置作爲「真實」位置的別名,如|project://example-project/src/HelloWorld.java|(0,1,<2,3>,<4,5>),指的是該文件中特定的一段代碼。M3的定製Rascal定位協議

我想爲我自己的CSS特定M3創建那些漂亮的位置。所以他們應該看起來像css+declarationcss+ruleset。我已經擁有了我現在直接傳遞給M3核心的實際「真實」位置。但是這看起來非常混亂,你不能將這些位置分開。

那麼如何將我的「真實」位置連接到這些漂亮的位置,以便它們實際在Rascal終端內運行?有人可以告訴我要達到這個目標所需的步驟嗎?或者也許給我一個例子?我已經看到了Java特定M3的實現,但我似乎無法擺脫困境。

回答

1

偉大的問題。要註冊的位置,使得它們在REPL並在IDE解析來打開文件和這樣的你與「名稱服務器」

import analysis::m3::Registry; 
registerProject(|project://myProject|, myM3Model); // side-effect alert! 

該代碼將使用@declarations表從M3的模型來註冊它們它應該將您的邏輯位置映射到您的物理位置。

它確實是像這樣:

void registerProject(loc project, M3 model) { 
    rel[str scheme, loc name, loc src] perScheme 
     = {<name.scheme, name, src> | <name, src> <- [email protected]}; 

    for (str scheme <- perScheme<scheme>) 
     registerLocations(scheme, project.authority, (name : src | <name, src> <- perScheme[scheme])); 
} 

從這個代碼,您還可以瞭解到,調用registerLocations直接也是可能的。這基本上將查找映射添加到查找註冊表中,首先由方案索引,然後通過權威,最後通過路徑名稱。