diff options
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.xtend | 138 |
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 | */ | ||
4 | package hu.bme.mit.inf.dslreasoner.faulttree.components.scoping | ||
5 | |||
6 | import com.google.common.collect.Lists | ||
7 | import com.google.inject.Inject | ||
8 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.ComponentDefinition | ||
9 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.ComponentInstance | ||
10 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.EventReference | ||
11 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.LookupDefinition | ||
12 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.MappingDefinition | ||
13 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.TransformationDefinition | ||
14 | import hu.bme.mit.inf.dslreasoner.faulttree.components.cftLanguage.Variable | ||
15 | import org.eclipse.emf.common.notify.Notifier | ||
16 | import org.eclipse.emf.ecore.EObject | ||
17 | import org.eclipse.emf.ecore.EReference | ||
18 | import org.eclipse.xtext.EcoreUtil2 | ||
19 | import org.eclipse.xtext.resource.EObjectDescription | ||
20 | import org.eclipse.xtext.resource.IResourceDescriptions | ||
21 | import org.eclipse.xtext.resource.IResourceDescriptionsProvider | ||
22 | import org.eclipse.xtext.scoping.IScope | ||
23 | import org.eclipse.xtext.scoping.Scopes | ||
24 | import org.eclipse.xtext.scoping.impl.SimpleScope | ||
25 | |||
26 | import 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 | */ | ||
34 | class 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 | } | ||