如何在 Theia 中为基于 LSP 的编辑器实现 Xtext-XMI 交叉引用? [英] How to implement the Xtext-XMI cross reference for LSP based editor in Theia?

查看:29
本文介绍了如何在 Theia 中为基于 LSP 的编辑器实现 Xtext-XMI 交叉引用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 Theia 中为我们的一个 DSL 创建一个基于 LSP 的编辑器,从这个 DSL,我们需要根据 FullQualifiedName 交叉引用在单独的 XMI 文件中定义的模型.

我能够为 eclipse 插件实现这个,但无法为基于 theia 的编辑器实现它.如果有任何现有示例在 thiea 中实现此功能,那就太好了.

解决方案

解决方案 -

假设我们已经在 EMF 中定义了一个模型,我们可以使用基于 XMI 的编辑器或基于文本的 Xtext 编辑器对其进行编辑.在基于 LSP 的设置中,从基于 Xtext 的编辑器中交叉引用 XMI 文件中定义的模型,请按照以下步骤操作 -

1.创建一个新的项目来定义链接.

2.创建一个Runtime Module类来配置运行时依赖

 包io.typefox.xtextxmi.xtree.treeintegration导入 org.eclipse.xtext.resource.generic.AbstractGenericResourceRuntimeModule导入 org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider类 TreeRuntimeModule 扩展 AbstractGenericResourceRuntimeModule {覆盖受保护的 getFileExtensions() {'树'}覆盖受保护的 getLanguageName() {'io.typefox.xtextxmi.tree.Tree'}覆盖 bindIQualifiedNameProvider() {DefaultDeclarativeQualifiedNameProvider}//在这里绑定额外的服务}

3.为激活创建独立设置

import com.google.inject.Inject导入 org.eclipse.xtext.resource.FileExtensionProvider导入 org.eclipse.xtext.ISetup导入 org.eclipse.xtext.resource.IResourceServiceProvider导入 com.google.inject.Guice导入 io.typefox.xtextxmi.tree.TreePackage导入 org.eclipse.emf.ecore.resource.Resource导入 com.google.inject.Injector导入 org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl类 TreeStandaloneSetup 实现 ISetup {@注入私有文件扩展提供程序文件扩展提供程序;@注入私有 IResourceServiceProvider resourceServiceProvider;@注入私有 IResourceServiceProvider.Registry 注册表;覆盖 createInjectorAndDoEMFRegistration() {val 注入器 = Guice.createInjector(new TreeRuntimeModule)injector.injectMembers(this);for (String fileExt : fileExtensionProvider.getFileExtensions())registry.getExtensionToFactoryMap().put(fileExt, resourceServiceProvider)Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(tree", new XMIResourceFactoryImpl)//下面将 EPackage 隐式注册到注册表中TreePackage.eINSTANCE.eClass()回油器}}

3.定义一个 ISetup 文件来注册 TreeStandaloneSetup ,文件夹结构应该是这样的:src->META-INF->services->org.eclipse.xtext.ISetup

在 ISetup 文件中为独立安装程序类的完全限定名称添加一个条目-io.typefox.xtextxmi.xtree.treeintegration.TreeStandaloneSetup

4.确保将此项目添加到.ide"的类路径中;project ,如果它是基于 maven/gradle 的,那么只需将它添加到 .ide 项目的 pom.xml/build.gradle.

注意 - 我使用了 中给出的示例链接 &为基于 Eclipse Theia 的 LSP 编辑器扩展它.

I am working on creating a LSP based editor in Theia for one of our DSL, from this DSL we need to cross reference model defined in separate XMI file on the basis of FullQualifiedName.

I am able to implement this for eclipse plugin but unable to implement it for theia based editor. If there is any existing sample that is implementing this functionality in thiea then it would be great.

解决方案

Solution -

Suppose we have defined a model in EMF which we can edit either using XMI based editor or text based Xtext editor .In a LSP based setup to cross refer the models defined in XMI file from Xtext based editor follow below steps -

1.Create a new project for defining the linkage.

2.Create a Runtime Module class to configure the runtime dependency

    package io.typefox.xtextxmi.xtree.treeintegration
import org.eclipse.xtext.resource.generic.AbstractGenericResourceRuntimeModule
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider

class TreeRuntimeModule extends AbstractGenericResourceRuntimeModule {
    
    override protected getFileExtensions() {
        'tree'
    }
    
    override protected getLanguageName() {
        'io.typefox.xtextxmi.tree.Tree'
    }
    
    override bindIQualifiedNameProvider() {
        DefaultDeclarativeQualifiedNameProvider
    }
    
    // bind additional services here
}

3.Create a Standalone Setup for activation

import com.google.inject.Inject
import org.eclipse.xtext.resource.FileExtensionProvider
import org.eclipse.xtext.ISetup
import org.eclipse.xtext.resource.IResourceServiceProvider

import com.google.inject.Guice
import io.typefox.xtextxmi.tree.TreePackage
import org.eclipse.emf.ecore.resource.Resource
import com.google.inject.Injector
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl

class TreeStandaloneSetup implements ISetup {
 
    @Inject
    private FileExtensionProvider fileExtensionProvider;

    @Inject
    private IResourceServiceProvider resourceServiceProvider;

    @Inject
    private IResourceServiceProvider.Registry registry;

    

    
    override  createInjectorAndDoEMFRegistration() {
        
    
        
        val injector = Guice.createInjector(new TreeRuntimeModule)
        injector.injectMembers(this);
        for (String fileExt : fileExtensionProvider.getFileExtensions())
            registry.getExtensionToFactoryMap().put(fileExt, resourceServiceProvider)

        
        Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("tree", new XMIResourceFactoryImpl)
        
        // the following implicitly registers the EPackage to the registry
        TreePackage.eINSTANCE.eClass()
        
        

         return injector
    }

}

3.Define a ISetup file to register the TreeStandaloneSetup , folder structure should look like this: src->META-INF->services->org.eclipse.xtext.ISetup

Add a entry for full qualified name of Standalone setup class in the ISetup file- io.typefox.xtextxmi.xtree.treeintegration.TreeStandaloneSetup

4.Make sure to add this project to the classpath of ".ide" project , if it is maven/gradle based then simply add it to pom.xml/build.gradle of .ide project.

Note - I have used the sample given in Link & extended it for Eclipse Theia based LSP editor.

这篇关于如何在 Theia 中为基于 LSP 的编辑器实现 Xtext-XMI 交叉引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆