2016-11-24 12 views
1

XText의 다른 파일에있는 개체 중 일부를 범위에 추가하려고합니다. 내가 필요한 것을 설명하기 위해, 나는이 장난감 문법이 있습니다XText의 간단한 가져 오기 명령

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

Model: 
    (imports += Import)* 
    (classes += ClassDef)*; 

Import: 
    'import' filename += STRING;  

ClassDef: 
    'class' name=ID ('extends' extends=[ClassDef])?; 

내가 단지 지정된 클래스 이전에 정의 된 클래스 및 확장 할 수 있도록하려는 말할 수 있습니다 만 같은 첫 글자로 시작하는 것들 클래스가 정의되고있다.

권장되는 방법은 scoping입니다. 나는이 같은 가져온 파일에서 클래스 선언에 액세스 할 수 있도록하려면

package org.xtext.example.mydsl.scoping 
import .... 

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 
    override getScope(EObject context, EReference reference){ 
     if(reference == MyDslPackage.Literals.CLASS_DEF__EXTENDS){ 
      if(! (context instanceof ClassDef)) {return IScope.NULLSCOPE } 
      val root = (context as ClassDef).getRootContainer 
      val classes = root.getAllContentsOfType(ClassDef) 
      val before = classes.subList(0, classes.indexOf(context)) 
      val fstLetter = (context as ClassDef).name.charAt(0) 
      val haveSame1stLetter = before.filter[name.charAt(0) == fstLetter]   
      return Scopes::scopeFor(haveSame1stLetter) 
     } 
    } 
} 

: 여기에 하나의 파일 내에서 않는 범위 업체이다

// --- c --- 
class Xlib 
class Xextend extends Xlib 

// --- main.mydsl --- 
import "lib.mydsl" 
class A 
class Xmain extends Xlib 

좀 충돌하는 제안을 발견했습니다 importURI 것을 사용하고 있습니다 만, 저에게는 효과가없는 것 같아서, 지금은 일을하고있는 구식 인 것처럼 보입니다. ,

  • IGlobalScopeProvider의 인스턴스를 만들 QualifiedName와의 String 표현 사이 IResourceDescription
  • 변환의 일환으로
  • 수출 요소 :

    문서는 상호 자원 참조를 아마 필요가 있다고 언급

  • 내 자신을 구현하고 바인딩합니다. IDefaultResourceDescriptionStrategy
  • IContainer.Manager에서210 IResourceDescriptionsIContainer

... 그리고 더 많은 다른 것들에서 (복수형에 유의) 얻을. 불행하게도, 그들은 원하는 행동을 달성하기 위해해야 ​​할 일에 대한 일관된 그림에 더하지 않습니다. 나는 해결책을 마련했습니다 스벤의 제안에 따라 :


편집. 누구든지 관심이 있다면 - this gist에 코드를 게시했습니다.

답변