2016-09-07 8 views
0

에 액세스 할 수 있습니다 : 상호 참조가 아주 잘 작동Xtext : 이것은 내 문법 다른 파일 작업에 대한 상호 참조,하지만 난 EObject를

A: field=[B] 
B: C | D 

모두 C/D는 같은 파일에 앉아 때 또한 C/D가 다른 파일에있을 때 (가져 오기 사용).

모델 (EObject, AST의 루트)을 입력으로 가져 와서 C/D EObject를 추출하는 것이 내 문제입니다. C/D는 같은 파일에 앉아 때

, 내가 C를 얻기 위해 같은 것을 할 수 있습니다/D EObjects : 그러나

A a = ... 
if (a.getField() instanceof C) 
{ 
C c = (C)a.getField(); 
//do something with c 
} 
else if (a.getField() instanceof D) 
{ 
D d = (D)a.getField(); 
//do something with d 
} 

, C/D가 다른 파일에 앉아, 교차 - 참조 작동 있지만 위의 작동하지 않습니다. a.getField() null이 아니지만 C 인스턴스가 아니며 D 인스턴스가 없습니다.

모델 제공 (다른 많은 모델 가져 오기), 다른 모델에있는 C/D에 어떻게 액세스 할 수 있습니까?

XtextResourceSetProvider rsp = (XtextResourceSetProvider)IResourceServiceProvider.Registry.INSTANCE.getResourceServiceProvider(uri).get(IResourceSetProvider.class);  

XtextResourceSet rs = (XtextResourceSet) rsp.get(project); 

Resource r = rs.getResource(uri, true); 
+0

당신이 "어디"입니다 더 많은 컨텍스트를 GIV 수 있습니다 당신이 무엇을하고 있는지 overcomplicated 같습니다

UPDATE는

이 자원을 얻기 위해 내 코드입니다 이러는거야? –

+0

xtext를 사용하는 새로운 플러그인을 작성하고 있습니다. 이 플러그인에는 파일 위치를 가져 와서 해당 EObject 모델을 반환하는 메서드가 있습니다. 그런 다음 원래 질문에 설명 된이 플러그인에 다른 방법이 있습니다. –

+0

당신은 반드시'org.eclipse.xtext.ui.resource.IResourceSetProvider.get (IProject) org.eclipse.xtext.ui.resource.IResourceSetProvider.get (IProject)'를 사용하여 리소스 세트를 가져오고 절대로 StandaloneSetup을 호출하지 않습니까? 이클립스 컨텍스트에서 –

답변

0

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IWorkspaceRoot root = workspace.getRoot(); 

IFile file = root.getFile(new Path(inputFilePath)); 
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true); 
IProject project = file.getProject(); 

XtextResourceSetProvider rsp = (XtextResourceSetProvider) IResourceServiceProvider.Registry.INSTANCE 
    .getResourceServiceProvider(uri) 
    .get(IResourceSetProvider.class); 
XtextResourceSet rs = (XtextResourceSet) rsp.get(project); 

Resource r = rs.getResource(uri, true); 
Model m = (Model) r.getContents().get(0); 
+0

감사! 이제 작동합니다. –

+0

크리스챤, 정확히 같은 질문이지만 이번엔 다른 이클립스를 사용하지 않고 플러그인을 실행하고 싶습니다. 이 설명을 https://typefox.io/how-and-why-use-xtext-without-the-ide 보았지만 인젝터를 사용하여 리소스 세트를 얻습니다. 이 경우 작동하도록 귀하의 답변을 어떻게 사용할 수 있습니까? –

+0

독립 실행 형 리소스 세트에 모든 리소스를 수동으로 추가해야합니다. –