aboutsummaryrefslogtreecommitdiffstats
path: root/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeResult.xtend
blob: 7ba907243633e42d1cd31ddd01b4011d0dfb87e3 (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
package hu.bme.mit.inf.dslreasoner.viatra2logic

import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference
import java.util.Map
import org.eclipse.viatra.query.runtime.matchers.psystem.PBody
import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter
import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
import org.eclipse.xtend.lib.annotations.Data
import org.eclipse.xtext.xbase.lib.Functions.Function0
import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory
import org.eclipse.emf.ecore.util.EcoreUtil
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.PrimitiveTypeReference

@Data class Viatra2LogicTypeResult{
	Map<Pair<PQuery,PParameter>,Function0<TypeReference>> typesInParameters
	Map<Pair<PBody,PVariable>,Function0<TypeReference>> typesInBodies;
	
	def addType(PBody body, PVariable variable, TypeReference typeConstructor) {
		typesInBodies.put(body->variable,typeConstructor.createTypeConstructor)
	}
	def addType(PQuery query, PParameter variable, TypeReference typeConstructor) {
		typesInParameters.put(query->variable,typeConstructor.createTypeConstructor)
	}
	def getType(PBody body, PVariable variable) {
		return (body->variable).lookup(typesInBodies).apply
	}
	def getType(PQuery query, PParameter variable) {
		return (query->variable).lookup(typesInParameters).apply
	}
	
	def containsSolution(PBody body, PVariable variable) {
		return typesInBodies.containsKey(body->variable)
	}
	def containsSolution(PParameter variable) {
		return typesInParameters.containsKey(variable)
	}
	
	def dispatch Function0<TypeReference> createTypeConstructor(ComplexTypeReference ref) {
		return [LogiclanguageFactory.eINSTANCE.createComplexTypeReference=>[it.referred = ref.referred]]
	}
	def dispatch Function0<TypeReference> createTypeConstructor(PrimitiveTypeReference ref) {
		return [EcoreUtil.copy(ref)]
	}
}