aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend
blob: 4eef53d77c45f8ab2ab10492fd907a365c7d231f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * 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)
			}
		}
	}
}