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 и не экземпляр Д.

Давая модель (которая импортирует многие другие модели), как я могу получить доступ к 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);

person John Benedetto    schedule 07.09.2016    source источник
comment
Можете ли вы дать больше контекста того, где вы это делаете?   -  person Christian Dietrich    schedule 07.09.2016
comment
Я пишу новый плагин, который использует xtext. Этот плагин имеет метод, который получает местоположение файла и возвращает соответствующую модель EObject. Тогда у меня есть еще один метод в этом плагине, который описан в исходном вопросе.   -  person John Benedetto    schedule 08.09.2016
comment
Вы уверены, что используете org.eclipse.xtext.ui.resource.IResourceSetProvider.get(IProject)org.eclipse.xtext.ui.resource.IResourceSetProvider.get(IProject) для получения набора ресурсов и никогда не вызываете StandaloneSetup в контексте eclipse?   -  person Christian Dietrich    schedule 08.09.2016
comment
Добавил мой код для набора ресурсов в исходный вопрос. Все в порядке?   -  person John Benedetto    schedule 08.09.2016
comment
да, это выглядит нормально и должно работать. Можете ли вы поделиться полным образцом проекта, который я могу проверить и запустить?   -  person Christian Dietrich    schedule 08.09.2016
comment
filedropper.com/exampledsl После загрузки zip и импорта папок сгенерируйте грамматику, запустите eclipse и импортируйте папку MyDSLExamples. После этого перейдите в ExampleDSL\ExampleDSL\MySamplePlugin\src\mysampleplugin\handlers\SampleHandler. В строке 25 может быть либо /MyDSLExamples/examples/importAnotherFile.mydsl, либо /MyDSLExamples/examples/NoImports.mydsl. Попробуйте отладить MySamplePlugin как приложение eclipse, а затем нажмите Sample Menu->Sample Command->OK. Теперь iterateModel в классе Main будет работать для NoImports, но не будет работать для importAnotherFile. Большое спасибо.   -  person John Benedetto    schedule 08.09.2016


Ответы (1)


выглядит слишком сложным, что вы делаете

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);
person Christian Dietrich    schedule 08.09.2016
comment
Кристиан, точно такой же вопрос, но на этот раз я хочу запустить свой плагин, не запуская еще одно затмение. Я видел это объяснение typefox.io/how-and-why- use-xtext-without-ide, но они используют инжектор для получения набора ресурсов. Как я могу использовать ваш ответ, чтобы он работал в этом случае? - person John Benedetto; 11.09.2016
comment
В автономном режиме вам необходимо добавить все ресурсы в набор ресурсов вручную. - person Christian Dietrich; 11.09.2016