aboutsummaryrefslogtreecommitdiffstats
path: root/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend')
-rw-r--r--Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend138
1 files changed, 138 insertions, 0 deletions
diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend
new file mode 100644
index 00000000..ab708087
--- /dev/null
+++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.components/src/hu/bme/mit/inf/dslreasoner/faulttree/components/scoping/CftLanguageScopeProvider.xtend
@@ -0,0 +1,138 @@
1/*
2 * generated by Xtext 2.16.0
3 */
4package hu.bme.mit.inf.dslreasoner.faulttree.components.scoping
5
6import com.google.common.collect.Lists
7import com.google.inject.Inject
8import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.ComponentDefinition
9import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.ComponentInstance
10import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.EventReference
11import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.LookupDefinition
12import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.MappingDefinition
13import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.TransformationDefinition
14import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.Variable
15import org.eclipse.emf.common.notify.Notifier
16import org.eclipse.emf.ecore.EObject
17import org.eclipse.emf.ecore.EReference
18import org.eclipse.xtext.EcoreUtil2
19import org.eclipse.xtext.resource.EObjectDescription
20import org.eclipse.xtext.resource.IResourceDescriptions
21import org.eclipse.xtext.resource.IResourceDescriptionsProvider
22import org.eclipse.xtext.scoping.IScope
23import org.eclipse.xtext.scoping.Scopes
24import org.eclipse.xtext.scoping.impl.SimpleScope
25
26import static hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.CftLanguagePackage.Literals.*
27
28/**
29 * This class contains custom scoping description.
30 *
31 * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
32 * on how and when to use it.
33 */
34class CftLanguageScopeProvider extends AbstractCftLanguageScopeProvider {
35 public static val SINGLETON_VARIABLE_PREFIX = "_"
36
37 @Inject IResourceDescriptionsProvider resourceDescriptionsProvider
38 @Inject CftLanguageImportedNamespaceAwareLocalScopeProvider importedNamespaceProvider
39
40 override getScope(EObject context, EReference reference) {
41 switch (reference) {
42 case LOOKUP_DEFINITION__MAPPING:
43 getRuleDefinitionsScope(context, reference)
44 case LOOKUP_DEFINITION__ARGUMENTS:
45 getMappingParametersScope(context)
46 case EVENT_REFERENCE__COMPONENT:
47 getComponentInstancesScope(context)
48 case EVENT_REFERENCE__EVENT:
49 getEventDeclarationsScope(context)
50 default:
51 super.getScope(context, reference)
52 }
53 }
54
55 protected def getRuleDefinitionsScope(EObject context, EReference referece) {
56 val transformationDefinition = EcoreUtil2.getContainerOfType(context, TransformationDefinition)
57 if (transformationDefinition === null) {
58 return IScope.NULLSCOPE
59 }
60 val resourceDescriptions = getResourceDescriptions(transformationDefinition)
61 val mappingDefinitionDescriptions = toMappingDefinitionDescriptions(resourceDescriptions,
62 transformationDefinition.mappingDefinitions)
63 val ruleDefinitionsScope = new SimpleScope(IScope.NULLSCOPE, mappingDefinitionDescriptions)
64 importedNamespaceProvider.createImportNormalizedScope(ruleDefinitionsScope, context, referece)
65 }
66
67 protected def toMappingDefinitionDescriptions(IResourceDescriptions resourceDescriptions,
68 Iterable<? extends MappingDefinition> ruleDefinitions) {
69 val mappingDefinitionDescriptions = Lists.newArrayListWithExpectedSize(ruleDefinitions.size)
70 for (ruleDefinition : ruleDefinitions) {
71 val pattern = ruleDefinition?.pattern
72 if (pattern !== null) {
73 val patternName = resourceDescriptions.getExportedObjectsByObject(pattern).head?.qualifiedName
74 if (patternName !== null) {
75 mappingDefinitionDescriptions += EObjectDescription.create(patternName, ruleDefinition)
76 }
77 }
78
79 }
80 mappingDefinitionDescriptions
81 }
82
83 private def getResourceDescriptions(Notifier notifier) {
84 val resourceSet = EcoreUtil2.getResourceSet(notifier)
85 if (resourceSet === null) {
86 new IResourceDescriptions.NullImpl
87 } else {
88 resourceDescriptionsProvider.getResourceDescriptions(resourceSet)
89 }
90 }
91
92 protected def getMappingParametersScope(EObject context) {
93 val mappingDefinition = EcoreUtil2.getContainerOfType(context, MappingDefinition)
94 if (mappingDefinition === null) {
95 return IScope.NULLSCOPE
96 }
97 val variables = mappingDefinition.parameters.filter [
98 !name.startsWith(SINGLETON_VARIABLE_PREFIX)
99 ]
100 Scopes.scopeFor(variables)
101 }
102
103 protected def getComponentInstancesScope(EObject context) {
104 val mappingDefinition = EcoreUtil2.getContainerOfType(context, MappingDefinition)
105 if (mappingDefinition === null) {
106 return IScope.NULLSCOPE
107 }
108 val componentInstances = <Variable>newArrayList
109 componentInstances.addAll(mappingDefinition.lookupDefinitions)
110 if (mappingDefinition.componentInstance !== null) {
111 componentInstances += mappingDefinition.componentInstance
112 }
113 Scopes.scopeFor(componentInstances)
114 }
115
116 protected def getEventDeclarationsScope(EObject context) {
117 val variable = EcoreUtil2.getContainerOfType(context, EventReference)?.component
118 val events = switch (variable) {
119 ComponentInstance:
120 variable.componentType?.allEventDeclarations
121 LookupDefinition:
122 variable.mapping?.componentInstance?.componentType?.allEventDeclarations
123 default:
124 null
125 }
126 if (events === null) {
127 return IScope.NULLSCOPE
128 }
129 Scopes.scopeFor(events)
130 }
131
132 private def getAllEventDeclarations(ComponentDefinition componentDefinition) {
133 val eventDeclarations = newArrayList
134 eventDeclarations.addAll(componentDefinition.inputEvents)
135 eventDeclarations.addAll(componentDefinition.eventDefinitions)
136 eventDeclarations
137 }
138}