aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend
blob: 97cda4a49bdc184ccff7d1de20e5619ff69c0ec9 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * 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
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternElement
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPatternEntry
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport

/**
 * 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 if(context instanceof PatternElement) {
			context.scopeForPatternElement(reference,document)
		} else if(context instanceof PatternSpecification) {
			context.scopeForPatternSpecification(reference,document)
		} else if(context instanceof AllPatternEntry) {
			context.scopeForAllPatternEntry(reference,document)
		} else {
			return super.getScope(context,reference)
		}
	}
	
	private def allEPackages(ConfigurationScript document) {
		return document.imports.filter(EPackageImport).map[it.importedPackage].filterNull
	}
	private def allViatraPackages(ConfigurationScript document) {
		val res = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull
		//println('''All packages: «res.map[packageName].toList»''')
		return  res
	}
	private def allEClassifiers(ConfigurationScript document) {
		document.allEPackages.map[EClassifiers].flatten
	}
	private def allPatterns(ConfigurationScript document) {
		val res = document.allViatraPackages.map[patterns].flatten
		//println('''All patterns: «res.map[name].toList»''')
		return res
	}

	protected def scopeForMetamodelElement(MetamodelElement 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(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)
		}
	}
	
	//////////
	
	protected def scopeForPatternElement(PatternElement context, EReference reference, ConfigurationScript document) {
		if(reference === language.patternEntry_Package) {
			return Scopes.scopeFor(document.allViatraPackages)
		} else if(reference === language.patternElement_Pattern) {
			if(context.package !== null) {
				return Scopes.scopeFor(context.package.patterns)
			} else {
				return Scopes.scopeFor(document.allPatterns)
			}
		} else {
			super.getScope(context,reference)
		}
	}
	
	protected def scopeForPatternSpecification(PatternSpecification context, EReference reference, ConfigurationScript document) {
		if(reference === language.patternEntry_Package) {
			return Scopes.scopeFor(document.allViatraPackages)
		} else if(reference ===language.patternElement_Pattern) {
			return Scopes.scopeFor(document.allPatterns)
		} else {
			return super.getScope(context,reference)
		}
	}
	
	protected def scopeForAllPatternEntry(AllPatternEntry context, EReference reference, ConfigurationScript document) {
		if(reference === language.patternEntry_Package) {
			return Scopes.scopeFor(document.allViatraPackages)
		} else if(reference === language.patternElement_Pattern) {
			if(context.package === null) {
				return Scopes.scopeFor(document.allPatterns)
			} else {
				return Scopes.scopeFor(context.package.patterns)
			}
		} else {
			return super.getScope(context,reference)
		}
	}
}