Xtext CustomScopeProvider 添加候选项的问题

问题描述

我正在处理一个 xtext 项目,我必须在其中自定义范围提供程序。我需要为范围添加一些可能的候选者。第一部分 (getServiceInputs()) 工作正常,但第二部分 (addAll(sub.GetSubRecipeParameters()) 不行。调试显示它们已从其原始源(子)中删除,因此无法再次检索。当简单评论时在 addAll 行中,SubRecipeParameters 保留在 sub 中。真的不知道如何解决这个问题,已经尝试了一些变通方法。有人有想法吗?

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

感谢您的帮助!!

解决方法

如果将元素从一个 EList 移动到另一个,这是正常的 EMF 行为。解决方案是创建一个新列表,例如new ArrayList<>() 并在那里添加输入

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...