xtextscopingcustom-scope

Xtext CustomScopeProvider Problems with adding candidates


I am working on an xtext Project where I have to customize the Scope Provider. I need to add up some possible candidates for the scope. The first part (getServiceInputs()) works fine but for the second one (addAll(sub.GetSubRecipeParameters()) not. Debugging showed that they get removed from its original source (sub) and can therefore not be retrieved again. When simply commenting out the addAll line the SubRecipeParameters remain in sub. Really dont know how to solve that, tried already some work arounds. Anyone with an Idea?

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);

Thanks for any help!!


Solution

  • This is normal EMF behaviour if you move elements from one EList to another one. The solution is to create a new list e.g. new ArrayList<>() and also add the inputs there

    List<ServiceParameterDefinition> candidates = new ArrayList<>();
    candidates.addAll(calledService.getServiceInputs());