2016-07-25 4 views
0

Я новичок в Xtext. Я использую класс модели в моем DSL так:Импорт Java-класса из Xtext dsl

Model abc: 
variable1 
variable2 

и импорт класса так:

import a.b.c 

То, что я хочу сделать, это, когда я говорю, импорт а (который является классом Java в тот же каталог). Редактор должен признать этот класс A.B.C и передать его в качестве модели, как:

ModelName = Classname

имена переменных = переменных в классе.

Я также написал другой класс, который получает ссылки на переменные в классе модели. Итак, если я скажу variable1 в этом классе и если нет переменной с именем variable1 во всех моделях, будет синтаксическая ошибка. Он работает, когда я пишу класс модели в dsl, но я не мог этого сделать с использованием моего класса импорта.

Спасибо за любую помощь.

+0

SRY я не могу следовать за вами. Можете ли вы дать больше контекста. EG - грамматика и полная модель –

ответ

0

здесь может стать отправной точкой

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 
    } 

} 
Смежные вопросы