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
에서210IResourceDescriptions
이IContainer
... 그리고 더 많은 다른 것들에서 (복수형에 유의) 얻을. 불행하게도, 그들은 원하는 행동을 달성하기 위해해야 할 일에 대한 일관된 그림에 더하지 않습니다. 나는 해결책을 마련했습니다 스벤의 제안에 따라 :
편집. 누구든지 관심이 있다면 - this gist에 코드를 게시했습니다.