/* * generated by Xtext 2.10.0 */ package hu.bme.mit.inf.dslreasoner.application.scoping import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage import org.eclipse.xtext.EcoreUtil2 import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport import org.eclipse.xtext.scoping.Scopes import org.eclipse.emf.ecore.EClass import org.eclipse.emf.ecore.EEnum import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPackageEntry /** * 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. */ class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigurationScopeProvider { private val language = ApplicationConfigurationPackage.eINSTANCE override getScope(EObject context, EReference reference) { val document = EcoreUtil2.getContainerOfType(context,ConfigurationScript) if(context instanceof MetamodelElement) { context.scopeForMetamodelElement(reference,document) } else if(context instanceof MetamodelSpecification) { context.scopeForMetamodelSpecification(reference,document) } else if(context instanceof AllPackageEntry){ context.scopeForAllPackageEntry(reference,document) } else { return super.getScope(context,reference) } } private def allEPackages(ConfigurationScript document) { return document.imports.filter(EPackageImport).map[it.importedPackage].filterNull } private def allEClassifiers(ConfigurationScript document) { document.allEPackages.map[EClassifiers].flatten } protected def scopeForMetamodelElement(MetamodelElement context, EReference reference, ConfigurationScript document) { if(reference === language.metamodelEntry_Package) { if(context.classifier !== null) { return Scopes.scopeFor(#[context.classifier.EPackage]) } else { return Scopes.scopeFor(document.allEPackages) } } if(reference === language.metamodelElement_Classifier) { if(context.package != null) { return Scopes.scopeFor(context.package.EClassifiers) } else { return Scopes.scopeFor(document.allEClassifiers) } } if (reference === language.metamodelElement_Feature) { val referredClassifier = context.classifier if(referredClassifier instanceof EClass) { return Scopes.scopeFor(referredClassifier.EAllStructuralFeatures) } else if(referredClassifier instanceof EEnum) { return Scopes.scopeFor(referredClassifier.ELiterals) } else { super.getScope(context,reference) } } } protected def scopeForMetamodelSpecification(MetamodelSpecification context, EReference reference, ConfigurationScript document) { if(reference === language.metamodelEntry_Package) { return Scopes.scopeFor(document.allEPackages) } else if(reference ===language.metamodelElement_Classifier) { return Scopes.scopeFor(document.allEClassifiers) } } protected def scopeForAllPackageEntry(AllPackageEntry context, EReference reference, ConfigurationScript document) { if(reference === language.metamodelEntry_Package) { return Scopes.scopeFor(document.allEPackages) } else if(reference === language.metamodelEntry_Package) { if(context.package === null) { return Scopes.scopeFor(document.allEClassifiers) } else { return Scopes.scopeFor(context.package.EClassifiers) } } } }