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) {
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)
} else {
return super.getScope(context,reference)
}
}
protected def scopeForAllPackageEntry(AllPackageEntry context, EReference reference, ConfigurationScript document) {
if(reference === language.metamodelEntry_Package) {
return Scopes.scopeFor(document.allEPackages)
} else if(reference === language.metamodelElement_Classifier) {
if(context.package === null) {
return Scopes.scopeFor(document.allEClassifiers)
} else {
return Scopes.scopeFor(context.package.EClassifiers)
}
} else {
return super.getScope(context,reference)
}
}
}
|