2012-04-25 2 views
3

내 DSL에서 상호 참조를 얻으려고합니다. 다음은 문법의 버전을 박탈 (표준 예를 들어, DSL의 수정 된 버전)입니다 : 나는 표준 name = ID 패턴을 사용하지 않는 때문에사용자 지정 터미널 규칙을 사용하는 Xtext 상호 참조

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 

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

Releases: 
    releases+=Release* 
; 

terminal VERSION : ('0'..'9')+'.'('0'..'9')+('.'('0'..'9'|'x')+)?; 

Release: 
    'release' version = VERSION ('extends' parent = [Release|VERSION])? 
    ; 

, 내가 만드는 방법에 대한 this blog post을 따라 내 IQualifiedNameProvider 자신 :

SO에 대한 다른 답변에서
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider { 
    QualifiedName qualifiedName(Release e) { 
     Package p = (Package) e.eContainer(); 
     return QualifiedName.create(p.getName(), e.getVersion()); 
    } 
} 

, 나는 내 자신의 범위 제공자 구현해야한다는 수집 :

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 
    IScope scope_Release_parent(Release release, EReference ref) { 
     Releases releases = (Releases) release.eContainer(); 
     return Scopes.scopeFor(releases.getReleases()); 
    } 
} 

를 I했습니다 생성 된 편집기를 실행하는 경우 I는 다음과 같습니다 파일을 생성

public class MyDslRuntimeModule extends 
     org.xtext.example.mydsl.AbstractMyDslRuntimeModule { 
    @Override 
    public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() { 
     return MyDslQNP.class; 
    } 

    @Override 
    public Class<? extends IScopeProvider> bindIScopeProvider() { 
     return MyDslScopeProvider.class; 
    } 

} 

: LSO는 런타임 모듈이 바인딩

release 1.2.3 
release 1.2.2 extends 1.2.3 

문제는 (1) 에디터가 자동으로 완성되지 것입니다 (2) 편집기가 오류 메시지 Couldn't resolve reference to Release '1.2.3'을 표시합니다.

무엇이 누락 되었습니까?

답변

1

Scopes.scopeFor는 정적 메서드이므로 구성된 IQualifiedNameProvider를 사용하지 않습니다. 명시 적으로 Scopes.scopeFor (Iterable을, 기능, IScope)를 사용하여 그것을 전달해야

그러나 귀하의 경우에 당신은 자격을 갖춘 이름을 가진 지역 요소 이후의 모든 범위 제공자의 특별한 처리가 필요하지 않습니다 공급자가 자동으로 범위에 배치됩니다.

+0

좋아, 그래서 범위 제공자를 제거하면 자동 완성 작품을 만들지 만, 여전히 참조를 해결하기 위해 실패합니다. – JesperE

2

귀하의 QualifiedNameProvider는 허위로 인증 된 이름을 생성하는 것처럼 보입니다. 릴리스 1.2.2의 이름은 룩업이 [릴리스] [1] [2] [2]를 검색 할 두 개의 세그먼트 [릴리스] [1.2.2]를가집니다.

과 같이 적절한 자격을 갖춘 이름을 만들려고하십시오

QualifiedName qualifiedName(Release e) { 
    Package p = (Package) e.eContainer(); 
    QualifiedName release = getConverter().toQualifiedName(e.getVersion()); 
    return QualifiedName.create(pack.getName()).append(releaseSuffix);   
} 
관련 문제