从 Xtext dsl 导入 Java class
Importing Java class from Xtext dsl
我是 Xtext 新手。我在我的 dsl 中使用了这样的模型 class:
Model abc:
variable1
variable2
并像这样导入 class:
import a.b.c
我想做的是,当我说 import a.b.c (这是同一目录中的 java class )。编辑器必须识别此 a.b.c class 并将其作为模型引用,例如:
型号名称 = class名称
变量名 = class.
中的变量
我也写了一个不同的class,它获取模型class中变量的引用。因此,如果我在那个 class 中说 variable1 并且如果在所有模型中都没有名为 variable1 的变量,则会出现语法错误。当我在 dsl 中编写模型 class 时它可以工作,但是我无法使用我的导入 class.
感谢您的帮助。
这里可能是一个起点
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
}
}
我是 Xtext 新手。我在我的 dsl 中使用了这样的模型 class:
Model abc:
variable1
variable2
并像这样导入 class:
import a.b.c
我想做的是,当我说 import a.b.c (这是同一目录中的 java class )。编辑器必须识别此 a.b.c class 并将其作为模型引用,例如:
型号名称 = class名称
变量名 = class.
中的变量我也写了一个不同的class,它获取模型class中变量的引用。因此,如果我在那个 class 中说 variable1 并且如果在所有模型中都没有名为 variable1 的变量,则会出现语法错误。当我在 dsl 中编写模型 class 时它可以工作,但是我无法使用我的导入 class.
感谢您的帮助。
这里可能是一个起点
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
}
}