eclipse - Xtext链接服务和派生状态

标签 eclipse xtext emf eclipse-emf-ecore ecore

我有这个语法:

Feature returns ecore::EStructuralFeature:
{Feature} name=ID ':' (fp_many?='*')? eType=[ecore::EClassifier];

还有 EClass:

Class returns ecore::EClass:
{EClassClass}
name=ID (interface?=':Api')?
(BEGIN
(eStructuralFeatures+=Feature)*
(eOperations+=Operation)*
END)?;

我的目标是为文本 Ecore mm 提供一个 DSL,具有类似于 YAML 的语法,因此我需要根据其 EType 将功能对象转换为 EAttribute 或 EReference。

我尝试将 afterModelLinked 挂接到 LazyLinker 中,如下所示:

Queue<Feature> ftrs = Queues.newArrayDeque(features);
Feature f = null;
while ((f = ftrs.poll()) != null) {
    if (f.getEType() == null)
     continue;
    if (f.getEType() instanceof EDataType) {
    createEAttribute(eClazz, f);
    } else if (f.getEType() instanceof EClass) {
    createEReference(eClazz, f);
    }
    eClazz.getEStructuralFeatures().remove(f);
}

此代码确实将功能转换为适当的类型,但我在验证服务中收到错误,这里是堆栈跟踪:

org.eclipse.emf.common.util.WrappedException: java.lang.NullPointerException
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:233)
at org.eclipse.xtext.resource.persistence.StorageAwareResource.getEObject(StorageAwareResource.java:124)
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:192)
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:151)
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:137)
at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:528)
at org.eclipse.xtext.validation.ResourceValidatorImpl.resolveProxies(ResourceValidatorImpl.java:163)
at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:75)
at org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:91)
at org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:1)
at org.eclipse.xtext.util.concurrent.CancelableUnitOfWork.exec(CancelableUnitOfWork.java:26)
at org.eclipse.xtext.resource.OutdatedStateManager.exec(OutdatedStateManager.java:121)
at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.internalReadOnly(XtextDocument.java:520)
at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.readOnly(XtextDocument.java:492)
at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:133)
at org.eclipse.xtext.ui.editor.validation.ValidationJob.createIssues(ValidationJob.java:86)
at org.eclipse.xtext.ui.editor.validation.ValidationJob.run(ValidationJob.java:67)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: java.lang.NullPointerException
at org.eclipse.xtext.linking.impl.ImportedNamesAdapter.find(ImportedNamesAdapter.java:34)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.getImportedNamesAdapter(DefaultLinkingService.java:95)
at com.eacg.dsl.faml.linker.FamlLinkingService.getImportedNamesAdapter(FamlLinkingService.java:53)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:86)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:90)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:80)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:58)
at com.eacg.dsl.faml.linker.FamlLinkingService.getScope(FamlLinkingService.java:47)
at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:119)
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:250)
at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:225)

调试时,我发现它仍在上下文中使用对象Feature,即使我在创建映射时已将其删除。

我的问题是这样的:如何安全地替换对象Feature而不破坏我的模型。我还尝试实现 IDerivedStateComputer 但遇到了一些错误。

最佳答案

我认为这里的根本问题是 EMF 是一种基于图形的格式;类可以是其他类的特征、操作的参数等。一般来说,这个关系图可以包含循环、循环和结。因此,任何试图就地修改内容的操作都会很棘手,需要成熟的图遍历算法来确保您不会更改尚未处理的内容所依赖的内容。

另一种方法是让模型以其 native 形式加载和链接,然后将其转换为单次传递。就是这样xcore实现事物;等效的声明是:

XClass:
{XClass}
(annotations+=XAnnotation)*
((abstract?='abstract'? 'class') | interface?= 'interface') name = ID
('<' typeParameters+=XTypeParameter (',' typeParameters+=XTypeParameter)* '>')?
('extends' superTypes+=XGenericType (',' superTypes+=XGenericType)*)?
('wraps' instanceType=JvmTypeReference) ?
'{'
   (members+=XMember)*
'}'

;

注意所有的 X,它们是本地模型类。然后,就只有一个函数:

protected EClass getEClass(final XClass xClass)

关于eclipse - Xtext链接服务和派生状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992045/

相关文章:

linux - 为 Lucid Lynx 安装 Eclipse CDT 失败

eclipse-plugin - 有没有人在 IViewPart 中完全实现了 XText 编辑器

abstract-syntax-tree - xtext:AST、元模型和解析树之间的关系

parsing - Xtext 可以用于解析通用编程语言吗?

java - 在 EMF Compare 计算的 ADD Diff 中检索 "match of value"

eclipse - 如何在 Eclipse 中获取类型(接口(interface)/类/枚举)中的方法计数?

java - eclipse(运行64位jdk)上是否有替代jad和jadclipse的反编译工具?

java - 设置知道 EObject 及其 EAttribute 的值

Java公历转特定格式

java - 在 Eclipse 上设置 EMF Compare 并编译