Xtext CustomScopeProvider 添加候选人的问题
Xtext CustomScopeProvider Problems with adding candidates
我正在处理一个 xtext 项目,我必须在其中自定义 Scope Provider。我需要为范围添加一些可能的候选者。第一部分 (getServiceInputs()) 工作正常,但第二部分 (addAll(sub.GetSubRecipeParameters()) 没有。调试显示它们已从其原始源 (sub) 中删除,因此无法再次检索。当简单地注释掉 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());
我正在处理一个 xtext 项目,我必须在其中自定义 Scope Provider。我需要为范围添加一些可能的候选者。第一部分 (getServiceInputs()) 工作正常,但第二部分 (addAll(sub.GetSubRecipeParameters()) 没有。调试显示它们已从其原始源 (sub) 中删除,因此无法再次检索。当简单地注释掉 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());