首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xtext:如何对AST的外部变化作出反应

Xtext:如何对AST的外部变化作出反应
EN

Stack Overflow用户
提问于 2022-02-04 13:20:35
回答 1查看 98关注 0票数 0

我们目前正在测试语言服务器与EMFCloud.ModelServer实例之间的连接。我们能够在Model工作区中保存/编辑语义模型,如下面的回答所述。基本上,Language使用*.abcl文件处理我们的自定义语言,当用户保存文件中的更改时,Language对didSave操作作出反应,并将AST (EMF模型)保存在Model (使用XMI)中的文件*.abc (foo.abcl转换为-> foo.abc)中。AST (EMF模型)现在可用于其他EMF模型编辑器(即Theia树编辑器),例如,我们可以以不同的方式重命名节点或更改属性。

我们目前正在努力实现的是语言服务器对其他编辑器在我们的AST (*.abc文件)上所做的更改做出反应。为此,Language将订阅Model上的事件,并最终收到一个"fullUpdate“事件,指示AST已更改。

我们的问题是现在如何进行。我们可以考虑以下工作流:

  1. Model将新模型发送给语言服务器(通过订阅机制)
  2. 语言服务器用新模型替换AST
  3. 序列化新AST并将其缓存到文档中?
  4. 此时,*.abcl文件(由编辑器打开)与内部AST 不同步。
    • 也许语言服务器将序列化(文本表示)转发给编辑器?
    • 也许语言服务器覆盖了工作区中的*.abcl文件?

如能提供一些指导,我们将不胜感激。

编辑:还发布了一个关于日蚀论坛的问题

EN

回答 1

Stack Overflow用户

发布于 2022-03-23 13:19:35

在对语言服务器的内部结构进行研究和测试之后,我发现了语言服务器在外部通过另一个编辑器(即树编辑器)更新/更改语义模型(AST)时的反应方式。以下是可能的工作流程:

  1. Model通过发送一个新的完整模型实例向Language通知外部更改(即完全模型更新)。请参阅订阅法
  2. Language读取内部语义模型(AST)的副本。
  3. 语言服务器用新的完整模型实例替换语义模型副本的内容。
  4. Language将新的完整模型实例序列化(从EMF转换为文本表示)到String对象。
  5. 语言服务器将收到的更新通知语言服务器客户端,并询问更改是否被接受。
    • 如果用户接受更改,
      1. 将模型序列化(String)发送到客户端,以替换文本表示的当前内容(工作区/applyEdit LSP方法)。"null“作为版本值发送,因此客户端决定新版本。
      2. 客户端接收更改,并以文本表示的新状态自动向服务器发送"didChange“通知。此请求将触发Language中的内部构建,从而更新实际语义模型(AST)
      3. 此时,客户机+ AST +模型将同步。

代码语言:javascript
复制
- user rejects the changes 
    1. At this point the client + AST will still be in sync
    2. The model in the Model Server will not be in sync with the client + AST
    3. Text editor will show different information as other editors
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70987069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档