解析 Xtext 资源时初始化(瞬态)EAttribute
Initializing a (transient) EAttribute while parsing an Xtext resource
假设我有一个简单的 Xtext 规则
Hello: "Hello" name=STRING "!";
但是除了 name
EAttribute 之外,我的(以前存在的)EClass Hello
还有一个类型为 EString
的 EAttribute source
(或枚举类型,但现在让我们假设 EString
)。
该字段不应在 DSL 本身中表示(因此,它在某种程度上是 transient)。相反,我希望在 Xtext 解析器读取和实例化对象时将此字段设置为 "Xtext"
。 (我有其他方法可以创建 Hello
的实例,并为其设置其他值)。
是否可以在我的 Hello:
规则中添加一些内容来自动设置 source
的值?还是我必须在某处拦截解析器?
我在 Xtext 语法中发现了一些关于 "actions" 的注释,我想,也许是
Hello: { current.source = "Xtext" } "Hello" name=STRING "!";
可以解决问题,但似乎不允许执行此类操作...
我找到了一种方法,通过子类化 org.eclipse.xtext.parser.DefaultEcoreElementFactory
和 Guice-Injecting 它作为我的语言的 org.eclipse.xtext.parser.IAstFactory
。
我覆盖 create() 并执行
EObject obj = super.create(...);
if(obj instanceof Hello)
((Hello)obj).setSource("Xtext");
return obj;
我不知道这是否正确,但它确实有效。
假设我有一个简单的 Xtext 规则
Hello: "Hello" name=STRING "!";
但是除了 name
EAttribute 之外,我的(以前存在的)EClass Hello
还有一个类型为 EString
的 EAttribute source
(或枚举类型,但现在让我们假设 EString
)。
该字段不应在 DSL 本身中表示(因此,它在某种程度上是 transient)。相反,我希望在 Xtext 解析器读取和实例化对象时将此字段设置为 "Xtext"
。 (我有其他方法可以创建 Hello
的实例,并为其设置其他值)。
是否可以在我的 Hello:
规则中添加一些内容来自动设置 source
的值?还是我必须在某处拦截解析器?
我在 Xtext 语法中发现了一些关于 "actions" 的注释,我想,也许是
Hello: { current.source = "Xtext" } "Hello" name=STRING "!";
可以解决问题,但似乎不允许执行此类操作...
我找到了一种方法,通过子类化 org.eclipse.xtext.parser.DefaultEcoreElementFactory
和 Guice-Injecting 它作为我的语言的 org.eclipse.xtext.parser.IAstFactory
。
我覆盖 create() 并执行
EObject obj = super.create(...);
if(obj instanceof Hello)
((Hello)obj).setSource("Xtext");
return obj;
我不知道这是否正确,但它确实有效。