我对Xtext和Scopes有一个非常具体的问题。 我的语言需要命令敏感范围,我不知道如何做到这一点,尤其是每次发生某些更改时都不需要解析每个符号。
让我举个例子: 我们有三个文件,每个文件都会导出一些符号并删除一些符号。
File1中:
http.post(url,data).then(function(result) {
$scope.data = result.data;
print($("#printarea").html());
});
文件2:
Add symbol A, B, C
文件3:
Imports A, B, C from File1
Removes B, C
Adds D
为了使事情进一步复杂化,文件的顺序由每个文件中的版本号给出,导入是隐式的。
我已经看过Xtext Documentation,但是当谈到全局范围时,我发现文档不是很有帮助。是否有一些我可以看一下的起点?
提前感谢任何提示或提示:)
答案 0 :(得分:1)
默认的全局范围将使所有文件中的符号对同一项目中的所有其他文件可见。一种可能的解决方案是保持原样,并在链接阶段实现自定义行为:子类DefaultLinkingService并覆盖getLinkedObjects(...)
。使用范围获取给定名称的所有已声明符号的列表。然后,您可以根据文件的顺序敏感语义选择其中一个符号。
如果您需要有关包含声明符号的文件的其他信息,可以将其放入IEObjectDescription的用户数据:子类DefaultResourceDescriptionStrategy,覆盖createEObjectDescriptions(...)
,然后使用{{1使用任意String→String映射创建描述。可以在链接服务和其他服务中读取这些映射,而无需解析相应的EObject。
这种基于链接的方法的缺点是您必须自定义内容辅助提议提供程序,以便根据文件语义过滤掉符号。默认提案提供程序将提供它在范围中找到的所有符号。