Xtext CustomScopeProvider Проблемы с добавлением кандидатов

Я работаю над проектом xtext, где мне нужно настроить поставщика области. Мне нужно добавить несколько возможных кандидатов для области. Первая часть (getServiceInputs()) работает нормально, но для второй (addAll(sub.GetSubRecipeParameters()) нет. Отладка показала, что они удаляются из исходного источника (sub) и поэтому не могут быть получены снова. При простом комментировании из строки addAll параметры SubRecipeParameters остаются в подразделе. Действительно не знаю, как это решить, уже пробовал некоторые обходные пути. У кого-нибудь есть идея?

      public class AutomationServiceDslScopeProvider extends AbstractAutomationServiceDslScopeProvider {

    @Override
    public IScope getScope(EObject context, EReference reference) {
        if (context instanceof ServiceInvocationParameter
                && reference == AutomationServiceDslPackage.Literals.LITERAL) {
                ServiceInvocation serviceCall = (ServiceInvocation) invocationParameter.eContainer();
                ServiceDefinition calledService = serviceCall.getService();
                List<ServiceParameterDefinition> candidates= calledService.getServiceInputs();
                final EObject rootContainer = EcoreUtil.getRootContainer(context);
                List<SubRecipeDefinition> subs = EcoreUtil2.getAllContentsOfType(rootContainer, SubRecipeDefinition.class);
                for(SubRecipeDefinition sub:subs) {
                    for(RecipeStep step:sub.getRecipeSteps()) {
                        if(step.getName()==serviceCall.getName()) {
                            candidates.addAll(sub.getSubRecipeParameters());
                            }
                    }
                    
                    
                }
                
                return Scopes.scopeFor(candidates);

Спасибо за любую помощь!!

1 ответ

Это нормальное поведение EMF, если вы перемещаете элементы из одного EListк другому. Решение состоит в том, чтобы создать новый список, например new ArrayList<>()а также добавить входы туда

      List<ServiceParameterDefinition> candidates = new ArrayList<>();
candidates.addAll(calledService.getServiceInputs());
Другие вопросы по тегам