/* * generated by Xtext 2.25.0 */ package org.eclipse.viatra.solver.language.scoping; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; import org.eclipse.viatra.solver.language.model.problem.ExistentialQuantifier; import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; import org.eclipse.viatra.solver.language.model.problem.Problem; import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; import org.eclipse.viatra.solver.language.model.problem.Statement; import org.eclipse.viatra.solver.language.model.problem.Variable; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import com.google.common.collect.ImmutableList; /** * This class contains custom scoping description. * * See * https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping * on how and when to use it. */ public class ProblemScopeProvider extends AbstractProblemScopeProvider { @Override public IScope getScope(EObject context, EReference reference) { IScope scope = super.getScope(context, reference); if (reference == ProblemPackage.Literals.ATOM__ARGUMENTS) { return getVariableScope(context, scope); } else if (EcoreUtil2.isAssignableFrom(reference.getEReferenceType(), ProblemPackage.Literals.REFERENCE_DECLARATION)) { Problem problem = EcoreUtil2.getContainerOfType(context, Problem.class); if (problem == null) { return scope; } ImmutableList.Builder builder = ImmutableList.builder(); for (Statement statement : problem.getStatements()) { if (statement instanceof ClassDeclaration) { ClassDeclaration classDeclaration = (ClassDeclaration) statement; builder.addAll(classDeclaration.getReferenceDeclarations()); } } return Scopes.scopeFor(builder.build(), scope); } return scope; } protected IScope getVariableScope(EObject context, IScope delegateScope) { List variables = new ArrayList<>(); EObject currentContext = context; while (currentContext != null && !(currentContext instanceof PredicateDefinition)) { if (currentContext instanceof ExistentialQuantifier) { ExistentialQuantifier quantifier = (ExistentialQuantifier) currentContext; variables.addAll(quantifier.getImplicitVariables()); } currentContext = currentContext.eContainer(); } if (currentContext instanceof PredicateDefinition) { PredicateDefinition definition = (PredicateDefinition) currentContext; variables.addAll(definition.getParameters()); } return Scopes.scopeFor(variables); } }