有没有办法添加具有特定行和列的2个位置?
类似的东西:
|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>) + |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>);
结果:
|project://MyProject/src/MyClass.java|(962,66,<39,2>,<40,55>)
我目前正在与AST合作,我希望有一个块的选择,但我无法找到我是如何尝试添加每个语句的位置但是赢得了&#39;工作。
答案 0 :(得分:1)
有趣的观察。根据需要添加位置目前不是作为内置操作提供的(但我们可能会考虑添加它)。
暂且不说:地址添加和字符串支持:
rascal>|project://MyProject/src| + "MyClass.java";
loc: |project://MyProject/src/MyClass.java|
如果你看the description of Locations,你会发现所有的成分都可以自己建立。例如,这样做:
loc add(loc s, loc r) {
res = s;
res.end = r.end;
res.length = s.length + r.length;
return res;
}
这会给你:
rascal>add(|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>), |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>));
loc: |project://MyProject/src/MyClass.java|(962,63,<39,2>,<40,55>)
上述解决方案在处理这些位置重叠的情况下不尽如人意(但我不想过多地混淆解决方案)。
希望这有帮助。
答案 1 :(得分:1)
在保罗的回答的基础上,这也处理了典型的情况,那里有一个&#34;差距&#34; (可能是空白)在第二个位置和第一个位置之间:
loc add(loc s, loc r) {
res = s;
res.end = r.end;
adjust = 0;
if (s.offset + s.length < r.offset) {
adjust = r.offset - (s.offset+s.length);
}
res.length = s.length + r.length + adjust;
return res;
}
你必须要小心这一点 - 有一些案例和可能的错误条件,这是无法处理的(例如,位置重叠,以错误顺序传入的位置,实际上是位置来自不同的文件)。它应该只处理&#34;合并&#34;但是,两个相邻结构的位置。