aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend
blob: 4daf9831c6b58e1ca2453f50c3e23272ebee30b5 (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
154
/*
 * generated by Xtext 2.10.0
 */
package hu.bme.mit.inf.dslreasoner.application.scoping

import com.google.inject.Inject
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CftImport
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelEntry
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ReliabilityObjectiveFunction
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport
import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.CftModel
import org.eclipse.emf.ecore.EClass
import org.eclipse.emf.ecore.EEnum
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.scoping.Scopes

import static hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage.Literals.*

/**
 * 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 {

	@Inject IQualifiedNameConverter qualifiedNameConverter

	override getScope(EObject context, EReference reference) {
		val document = EcoreUtil2.getContainerOfType(context, ConfigurationScript)
		switch (reference) {
			case METAMODEL_ENTRY__PACKAGE:
				getEPackageScope(document)
			case METAMODEL_ELEMENT__CLASSIFIER:
				getEClassifierScope(context, document)
			case METAMODEL_ELEMENT__FEATURE:
				getEStructuralFeatureScope(context, reference, document)
			case PATTERN_ENTRY__PACKAGE:
				getViatraPackageScope(context, reference, document)
			case PATTERN_ELEMENT__PATTERN:
				getViatraPatternScope(context, document)
			case RELIABILITY_OBJECTIVE_FUNCTION__PACKAGE:
				getCftPackageScope(context, reference, document)
			case RELIABILITY_OBJECTIVE_FUNCTION__TRANSFORMATION:
				getCftTransformationScope(context, document)
			default:
				super.getScope(context, reference)
		}
	}

	private def getAllEPackages(ConfigurationScript document) {
		document.imports.filter(EPackageImport).map[importedPackage].filterNull
	}

	private def getAllViatraPackages(ConfigurationScript document) {
		document.imports.filter(ViatraImport).map[importedViatra].filterNull
	}

	private def getAllEClassifiers(ConfigurationScript document) {
		document.allEPackages.map[EClassifiers].flatten
	}

	private def getAllPatterns(ConfigurationScript document) {
		document.allViatraPackages.map[patterns].flatten
	}

	private def getAllCftPackages(ConfigurationScript document) {
		document.imports.filter(CftImport).map[importedCft].filterNull
	}

	private def getAllCftTransformations(ConfigurationScript document) {
		document.allCftPackages.map[transformationDefinitions].flatten
	}

	private def getEPackageScope(ConfigurationScript document) {
		Scopes.scopeFor(document.allEPackages)
	}

	private def getEClassifierScope(EObject context, ConfigurationScript document) {
		val classifiers = switch (context) {
			MetamodelEntry case context.package !== null:
				context.package.EClassifiers
			default:
				document.allEClassifiers
		}
		Scopes.scopeFor(classifiers)
	}

	private def getEStructuralFeatureScope(EObject context, EReference reference, ConfigurationScript document) {
		val referredClassifier = if (context instanceof MetamodelElement) {
				context.classifier
			} else {
				null
			}
		switch (referredClassifier) {
			EClass:
				Scopes.scopeFor(referredClassifier.EAllStructuralFeatures)
			EEnum:
				Scopes.scopeFor(referredClassifier.ELiterals)
			default:
				super.getScope(context, reference)
		}
	}

	private def getViatraPackageScope(EObject context, EReference reference, ConfigurationScript document) {
		val patternModelNameConverter = [ PatternModel patternModel |
			toQualifiedNameOrNull(patternModel.packageName)
		]
		Scopes.scopeFor(document.allViatraPackages, patternModelNameConverter, super.getScope(context, reference))
	}

	private def getViatraPatternScope(EObject context, ConfigurationScript document) {
		val patterns = switch (context) {
			PatternEntry case context.package !== null:
				context.package.patterns
			default:
				document.allPatterns
		}
		Scopes.scopeFor(patterns)
	}

	private def getCftPackageScope(EObject context, EReference reference, ConfigurationScript document) {
		val cftModelNameConverter = [ CftModel cftModel |
			toQualifiedNameOrNull(cftModel.packageName)
		]
		Scopes.scopeFor(document.allCftPackages, cftModelNameConverter, super.getScope(context, reference))
	}

	private def getCftTransformationScope(EObject context, ConfigurationScript document) {
		val transformations = switch (context) {
			ReliabilityObjectiveFunction case context.package !== null:
				context.package.transformationDefinitions
			default:
				document.allCftTransformations
		}
		Scopes.scopeFor(transformations)
	}
	
	private def toQualifiedNameOrNull(String packageName) {
		if (packageName === null) {
			null
		} else {
			qualifiedNameConverter.toQualifiedName(packageName)
		}	
	}
}