【问题标题】:Importing Java class from Xtext dsl从 Xtext dsl 导入 Java 类
【发布时间】:2016-07-26 02:18:57
【问题描述】:

我是 Xtext 的新手。我在我的 dsl 中使用了一个模型类:

Model abc:
 variable1
 variable2

然后像这样导入类:

import a.b.c

我想要做的是,当我说 import a.b.c (这是同一目录中的 java 类)时。编辑器必须识别这个 a.b.c 类并将其作为模型引用,例如:

模型名 = 类名

变量名 = 类中的变量。

我也写了一个不同的类,它获取模型类中变量的引用。因此,如果我在该类中说 variable1 并且如果所有模型中都没有名为 variable1 的变量,则会出现语法错误。当我在 dsl 中编写模型类时它可以工作,但是我无法使用我的导入类来做到这一点。

感谢您的帮助。

【问题讨论】:

  • 对不起,我无法关注你。您能否提供更多上下文。 EG 一个语法和一个完整的模型

标签: java dsl xtext


【解决方案1】:

这里可能是一个起点

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types

Model:
    imports=XImportSection?
    elements+=Element*
    ;

Element:
    "element" "{"
        "modelname" "=" type=JvmTypeReference
        "variable" "names" "=" memberReferences+=MemberReference ("," memberReferences+=MemberReference)*
    "}"
;

MemberReference:
    member=[types::JvmField|ID]
;

以及范围提供者的后续改编

package org.xtext.example.mydsl.scoping

import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.EcoreUtil2
import org.xtext.example.mydsl.myDsl.Element
import org.xtext.example.mydsl.myDsl.MyDslPackage
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.Scopes
import org.eclipse.xtext.common.types.JvmDeclaredType
import org.eclipse.xtext.naming.QualifiedName

class MyDslScopeProvider extends AbstractMyDslScopeProvider {

    override getScope(EObject context, EReference reference) {
        if (reference == MyDslPackage.Literals.MEMBER_REFERENCE__MEMBER) {
            val element = EcoreUtil2.getContainerOfType(context, Element)
            if (element != null)  {
                val type = element.type.type
                if (type instanceof JvmDeclaredType) {
                    return Scopes.scopeFor(type.declaredFields, [QualifiedName.create(simpleName)], IScope.NULLSCOPE)
                }
            }
            return IScope.NULLSCOPE
        }
        super.getScope(context, reference)
    }

}

提案提供者

class MyDslProposalProvider extends AbstractMyDslProposalProvider {

    override protected isKeywordWorthyToPropose(Keyword keyword) {
        true
    }

}

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2013-03-05
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多