aboutsummaryrefslogtreecommitdiffstats
path: root/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2020-12-02 19:23:15 +0100
committerLibravatar Kristóf Marussy <marussy@mit.bme.hu>2020-12-02 19:23:15 +0100
commit52241f46c3793b94ff0b7e8ada361881e1474b97 (patch)
tree6d484ba1fc345e42f401b9db8554746d232877db /Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src
parentMerge branch 'master' of github.com:viatra/VIATRA-Generator (diff)
downloadVIATRA-Generator-52241f46c3793b94ff0b7e8ada361881e1474b97.tar.gz
VIATRA-Generator-52241f46c3793b94ff0b7e8ada361881e1474b97.tar.zst
VIATRA-Generator-52241f46c3793b94ff0b7e8ada361881e1474b97.zip
Fix VQL validator breakage after Execute Application Configuration
Diffstat (limited to 'Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src')
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend19
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend11
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend322
3 files changed, 177 insertions, 175 deletions
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend
index b8c52af4..37fb81ae 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend
+++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Constraint2Logic.xtend
@@ -1,5 +1,4 @@
1package hu.bme.mit.inf.dslreasoner.viatra2logic 1package hu.bme.mit.inf.dslreasoner.viatra2logic
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 2import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace 3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
5import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder 4import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder
@@ -17,27 +16,27 @@ import org.eclipse.emf.ecore.EStructuralFeature
17import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey 16import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey
18import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey 17import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey
19import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey 18import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey
19import org.eclipse.viatra.query.runtime.matchers.aggregators.DoubleSumOperator
20import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator
21import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator.Extreme
22import org.eclipse.viatra.query.runtime.matchers.aggregators.IntegerSumOperator
23import org.eclipse.viatra.query.runtime.matchers.aggregators.LongSumOperator
20import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint 24import org.eclipse.viatra.query.runtime.matchers.psystem.PConstraint
21import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable 25import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
26import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint
22import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality 27import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality
23import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter 28import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter
29import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation
24import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality 30import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality
25import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall 31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint
26import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure 34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure
27import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue 35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.ConstantValue
28import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall 36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall
29import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint 37import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint
30 38
31import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* 39import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.TypeFilterConstraint
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint
34import org.eclipse.viatra.query.runtime.matchers.aggregators.DoubleSumOperator
35import org.eclipse.viatra.query.runtime.matchers.aggregators.IntegerSumOperator
36import org.eclipse.viatra.query.runtime.matchers.aggregators.LongSumOperator
37import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator
38import org.eclipse.viatra.query.runtime.matchers.aggregators.ExtremumOperator.Extreme
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter
40import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation
41 40
42class Constraint2Logic { 41class Constraint2Logic {
43 val extension LogicProblemBuilder builder = new LogicProblemBuilder 42 val extension LogicProblemBuilder builder = new LogicProblemBuilder
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend
index 74e03f71..2f7febd0 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend
+++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2Logic.xtend
@@ -1,5 +1,6 @@
1package hu.bme.mit.inf.dslreasoner.viatra2logic 1package hu.bme.mit.inf.dslreasoner.viatra2logic
2 2
3import com.google.inject.Injector
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace 5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
5import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder 6import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder
@@ -50,7 +51,7 @@ class Viatra2LogicConfiguration {
50 public var normalize = true 51 public var normalize = true
51} 52}
52 53
53class Viatra2Logic { 54class Viatra2Logic {
54 val extension LogicProblemBuilder builder = new LogicProblemBuilder 55 val extension LogicProblemBuilder builder = new LogicProblemBuilder
55 val extension Viatra2LogicAnnotationsFactory factory = Viatra2LogicAnnotationsFactory.eINSTANCE 56 val extension Viatra2LogicAnnotationsFactory factory = Viatra2LogicAnnotationsFactory.eINSTANCE
56 val normalizer = new PBodyNormalizer(EMFQueryMetaContext.DEFAULT) 57 val normalizer = new PBodyNormalizer(EMFQueryMetaContext.DEFAULT)
@@ -59,12 +60,16 @@ class Viatra2Logic {
59 val Ecore2Logic ecore2Logic 60 val Ecore2Logic ecore2Logic
60 Constraint2Logic constraint2Logic 61 Constraint2Logic constraint2Logic
61 62
62 new(Ecore2Logic ecore2Logic) { 63 new(Ecore2Logic ecore2Logic, Injector injector) {
63 this.ecore2Logic = ecore2Logic 64 this.ecore2Logic = ecore2Logic
64 this.typeInferer = new Viatra2LogicTypeInferer(ecore2Logic) 65 this.typeInferer = new Viatra2LogicTypeInferer(ecore2Logic, injector)
65 this.constraint2Logic = new Constraint2Logic(ecore2Logic) 66 this.constraint2Logic = new Constraint2Logic(ecore2Logic)
66 } 67 }
67 68
69 new(Ecore2Logic ecore2Logic) {
70 this(ecore2Logic, null)
71 }
72
68 def TracedOutput<LogicProblem,Viatra2LogicTrace> transformQueries( 73 def TracedOutput<LogicProblem,Viatra2LogicTrace> transformQueries(
69 ViatraQuerySetDescriptor queries, 74 ViatraQuerySetDescriptor queries,
70 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, 75 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace,
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend
index b8a6b9c1..1a96bf07 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend
+++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/src/hu/bme/mit/inf/dslreasoner/viatra2logic/Viatra2LogicTypeInferer.xtend
@@ -1,5 +1,6 @@
1package hu.bme.mit.inf.dslreasoner.viatra2logic 1package hu.bme.mit.inf.dslreasoner.viatra2logic
2 2
3import com.google.inject.Injector
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace 5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
5import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder 6import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder
@@ -18,7 +19,6 @@ import java.util.Set
18import org.eclipse.emf.ecore.EEnum 19import org.eclipse.emf.ecore.EEnum
19import org.eclipse.emf.ecore.EcorePackage 20import org.eclipse.emf.ecore.EcorePackage
20import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup 21import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup
21import org.eclipse.viatra.query.patternlanguage.emf.specification.XBaseEvaluator
22import org.eclipse.viatra.query.runtime.emf.EMFQueryMetaContext 22import org.eclipse.viatra.query.runtime.emf.EMFQueryMetaContext
23import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey 23import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey
24import org.eclipse.viatra.query.runtime.emf.types.EClassUnscopedTransitiveInstancesKey 24import org.eclipse.viatra.query.runtime.emf.types.EClassUnscopedTransitiveInstancesKey
@@ -26,7 +26,6 @@ import org.eclipse.viatra.query.runtime.emf.types.EDataTypeInSlotsKey
26import org.eclipse.viatra.query.runtime.matchers.context.IInputKey 26import org.eclipse.viatra.query.runtime.matchers.context.IInputKey
27import org.eclipse.viatra.query.runtime.matchers.context.common.JavaTransitiveInstancesKey 27import org.eclipse.viatra.query.runtime.matchers.context.common.JavaTransitiveInstancesKey
28import org.eclipse.viatra.query.runtime.matchers.planning.helpers.TypeHelper 28import org.eclipse.viatra.query.runtime.matchers.planning.helpers.TypeHelper
29import org.eclipse.viatra.query.runtime.matchers.psystem.IExpressionEvaluator
30import org.eclipse.viatra.query.runtime.matchers.psystem.PBody 29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody
31import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable 30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint 31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.AggregatorConstraint
@@ -40,285 +39,275 @@ import org.eclipse.xtext.xbase.typesystem.IBatchTypeResolver
40import org.eclipse.xtext.xbase.typesystem.references.UnknownTypeReference 39import org.eclipse.xtext.xbase.typesystem.references.UnknownTypeReference
41 40
42import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* 41import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
43import org.eclipse.xtext.xbase.typesystem.references.InnerTypeReference
44 42
45class Viatra2LogicTypeInferer{ 43class Viatra2LogicTypeInferer {
46 val Ecore2Logic ecore2Logic 44 val Ecore2Logic ecore2Logic
47 val extension LogicProblemBuilder builder = new LogicProblemBuilder 45 val extension LogicProblemBuilder builder = new LogicProblemBuilder
48 /**Typeresolver uses the same resolver as EMFPatternLanguageStandaloneSetup.*/ 46 /**Typeresolver uses the same resolver as EMFPatternLanguageStandaloneSetup.*/
49 val IBatchTypeResolver typeResolver = 47 val IBatchTypeResolver typeResolver
50 (new EMFPatternLanguageStandaloneSetup).createInjector.getInstance(IBatchTypeResolver)
51 val expressionExtractor = new XExpressionExtractor 48 val expressionExtractor = new XExpressionExtractor
52 49
53 new(Ecore2Logic ecore2Logic) { 50 new(Ecore2Logic ecore2Logic, Injector injector) {
54 this.ecore2Logic = ecore2Logic 51 this.ecore2Logic = ecore2Logic
52 val selectedInjector = injector ?:
53 new EMFPatternLanguageStandaloneSetup().createStandaloneInjectorWithSeparateModules
54 this.typeResolver = selectedInjector.getInstance(IBatchTypeResolver)
55 }
56
57 new(Ecore2Logic ecore2Logic) {
58 this(ecore2Logic, null)
55 } 59 }
56 60
57 def Viatra2LogicTypeResult inferTypes(List<PQuery> pQueries, TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace) { 61 def Viatra2LogicTypeResult inferTypes(List<PQuery> pQueries,
58 val Viatra2LogicTypeResult result = new Viatra2LogicTypeResult(new HashMap,new HashMap); 62 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace) {
59 for(query : pQueries) { 63 val Viatra2LogicTypeResult result = new Viatra2LogicTypeResult(new HashMap, new HashMap);
60 for(body: query.lookup(viatra2LogicTrace.query2Disjunction).bodies) { 64 for (query : pQueries) {
61 for(variable : body.uniqueVariables) { 65 for (body : query.lookup(viatra2LogicTrace.query2Disjunction).bodies) {
62 getOrMakeTypeDecision(result,variable,body,ecore2LogicTrace,viatra2LogicTrace,emptySet) 66 for (variable : body.uniqueVariables) {
67 getOrMakeTypeDecision(result, variable, body, ecore2LogicTrace, viatra2LogicTrace, emptySet)
63 } 68 }
64 } 69 }
65 for(parameter: query.parameters) { 70 for (parameter : query.parameters) {
66 getOrMakeTypeDecision(result,query,parameter,ecore2LogicTrace,viatra2LogicTrace,emptySet) 71 getOrMakeTypeDecision(result, query, parameter, ecore2LogicTrace, viatra2LogicTrace, emptySet)
67 } 72 }
68 } 73 }
69 return result 74 return result
70 } 75 }
71 76
72 private def TypeReference getOrMakeTypeDecision( 77 private def TypeReference getOrMakeTypeDecision(Viatra2LogicTypeResult result, PVariable variable, PBody body,
73 Viatra2LogicTypeResult result, 78 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace,
74 PVariable variable, PBody body, 79 Set<? extends PParameter> checkedInDecisionMaking) {
75 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, 80 if (result.containsSolution(body, variable)) {
76 Viatra2LogicTrace viatra2LogicTrace, 81 return result.getType(body, variable)
77 Set<? extends PParameter> checkedInDecisionMaking)
78 {
79 if(result.containsSolution(body,variable)) {
80 return result.getType(body,variable)
81 } else { 82 } else {
82 val inferredTypesByViatra = TypeHelper::inferUnaryTypesFor(body.uniqueVariables, body.constraints, EMFQueryMetaContext.DEFAULT) 83 val inferredTypesByViatra = TypeHelper::inferUnaryTypesFor(body.uniqueVariables, body.constraints,
84 EMFQueryMetaContext.DEFAULT)
83 val constraintsForVariable = variable.lookup(inferredTypesByViatra) 85 val constraintsForVariable = variable.lookup(inferredTypesByViatra)
84 86
85 val typeConstraintsDerivedByTypeHelper = constraintsForVariable.map[transformTypeReference(ecore2LogicTrace)] 87 val typeConstraintsDerivedByTypeHelper = constraintsForVariable.map [
88 transformTypeReference(ecore2LogicTrace)
89 ]
86 val typesFromEval = variable.getTypesFromEval(typeResolver) 90 val typesFromEval = variable.getTypesFromEval(typeResolver)
87 val typesFromAggregatorResult = variable.getTypeFromPassivePatternCallConstraintResult( 91 val typesFromAggregatorResult = variable.
88 result, 92 getTypeFromPassivePatternCallConstraintResult(result, ecore2LogicTrace, viatra2LogicTrace,
89 ecore2LogicTrace,
90 viatra2LogicTrace,
91 checkedInDecisionMaking)
92
93 val typesFromPositiveReasoning = (typeConstraintsDerivedByTypeHelper + typesFromEval + typesFromAggregatorResult).filterNull
94
95 val types = if(!typesFromPositiveReasoning.empty) {
96 typesFromPositiveReasoning
97 } else {
98 variable.getTypeFromPassivePatternCallConstraints(
99 result,
100 ecore2LogicTrace,
101 viatra2LogicTrace,
102 checkedInDecisionMaking) 93 checkedInDecisionMaking)
103 } 94
104 95 val typesFromPositiveReasoning = (typeConstraintsDerivedByTypeHelper + typesFromEval +
96 typesFromAggregatorResult).filterNull
97
98 val types = if (!typesFromPositiveReasoning.empty) {
99 typesFromPositiveReasoning
100 } else {
101 variable.getTypeFromPassivePatternCallConstraints(result, ecore2LogicTrace, viatra2LogicTrace,
102 checkedInDecisionMaking)
103 }
104
105 val commonSubtype = this.calculateCommonSubtype(types) 105 val commonSubtype = this.calculateCommonSubtype(types)
106 106
107 result.addType(body,variable,commonSubtype) 107 result.addType(body, variable, commonSubtype)
108 return commonSubtype 108 return commonSubtype
109 } 109 }
110 } 110 }
111 111
112 private def TypeReference getOrMakeTypeDecision( 112 private def TypeReference getOrMakeTypeDecision(Viatra2LogicTypeResult result, PQuery query, PParameter parameter,
113 Viatra2LogicTypeResult result, 113 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, Viatra2LogicTrace viatra2LogicTrace,
114 PQuery query, 114 Set<? extends PParameter> checkedInDecisionMaking) {
115 PParameter parameter, 115 if (checkedInDecisionMaking.contains(parameter)) {
116 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace,
117 Viatra2LogicTrace viatra2LogicTrace,
118 Set<? extends PParameter> checkedInDecisionMaking)
119 {
120 if(checkedInDecisionMaking.contains(parameter)) {
121 return null 116 return null
122 } 117 }
123 if(result.containsSolution(parameter)) { 118 if (result.containsSolution(parameter)) {
124 return result.getType(query, parameter) 119 return result.getType(query, parameter)
125 } 120 }
126 121
127 var TypeReference typeReference; 122 var TypeReference typeReference;
128 123
129 if(parameter.declaredUnaryType !== null) { 124 if (parameter.declaredUnaryType !== null) {
130 val key = parameter.declaredUnaryType 125 val key = parameter.declaredUnaryType
131 typeReference = key.transformTypeReference(ecore2LogicTrace) 126 typeReference = key.transformTypeReference(ecore2LogicTrace)
132 } else { 127 } else {
133 val bodies = query.lookup(viatra2LogicTrace.query2Disjunction).bodies 128 val bodies = query.lookup(viatra2LogicTrace.query2Disjunction).bodies
134 val newChecked = new HashSet(checkedInDecisionMaking) => [add(parameter)] 129 val newChecked = new HashSet(checkedInDecisionMaking) => [add(parameter)]
135 val Iterable<TypeReference> variableTypes = bodies.map[body| 130 val Iterable<TypeReference> variableTypes = bodies.map [ body |
136 val symbolicParameter = body.symbolicParameters.filter[patternParameter === parameter].head 131 val symbolicParameter = body.symbolicParameters.filter[patternParameter === parameter].head
137 val variable = symbolicParameter.parameterVariable 132 val variable = symbolicParameter.parameterVariable
138 getOrMakeTypeDecision(result,variable,body,ecore2LogicTrace,viatra2LogicTrace,newChecked) 133 getOrMakeTypeDecision(result, variable, body, ecore2LogicTrace, viatra2LogicTrace, newChecked)
139 ] 134 ]
140 typeReference = calculateCommonSupertype(variableTypes) 135 typeReference = calculateCommonSupertype(variableTypes)
141 } 136 }
142 result.addType(query,parameter,typeReference) 137 result.addType(query, parameter, typeReference)
143 return typeReference 138 return typeReference
144 } 139 }
145 140
146 private def Iterable<? extends TypeReference> getTypesFromEval(PVariable v, IBatchTypeResolver typeResolver) { 141 private def Iterable<? extends TypeReference> getTypesFromEval(PVariable v, IBatchTypeResolver typeResolver) {
147 val constraints = v.getReferringConstraintsOfType( 142 val constraints = v.getReferringConstraintsOfType(
148 typeof(ExpressionEvaluation) 143 typeof(ExpressionEvaluation)
149 ).filter[ 144 ).filter [
150 it.outputVariable === v 145 it.outputVariable === v
151 ] 146 ]
152 val res = constraints.map[getTypeFromEval] 147 val res = constraints.map[getTypeFromEval]
153 return res 148 return res
154 } 149 }
155 150
156 def TypeReference getTypeFromEval(ExpressionEvaluation evaluation) { 151 def TypeReference getTypeFromEval(ExpressionEvaluation evaluation) {
157 val XExpression expression = expressionExtractor.extractExpression(evaluation.evaluator) 152 val XExpression expression = expressionExtractor.extractExpression(evaluation.evaluator)
158 val returnType = typeResolver.resolveTypes(expression).getReturnType(expression); 153 val returnType = typeResolver.resolveTypes(expression).getReturnType(expression);
159 if(returnType === null || returnType instanceof UnknownTypeReference) { 154 if (returnType === null || returnType instanceof UnknownTypeReference) {
160 return null 155 return null
161 } else { 156 } else {
162 val javaIdentifier = returnType.wrapperTypeIfPrimitive.javaIdentifier 157 val javaIdentifier = returnType.wrapperTypeIfPrimitive.javaIdentifier
163 if(javaIdentifier == Boolean.name) { 158 if (javaIdentifier == Boolean.name) {
164 return LogicBool 159 return LogicBool
165 } else if(javaIdentifier == Integer.name || javaIdentifier == Short.name) { 160 } else if (javaIdentifier == Integer.name || javaIdentifier == Short.name) {
166 return LogicInt 161 return LogicInt
167 } else if(javaIdentifier == Double.name || javaIdentifier == Float.name){ 162 } else if (javaIdentifier == Double.name || javaIdentifier == Float.name) {
168 return LogicReal 163 return LogicReal
169 } else if(javaIdentifier == String.name) { 164 } else if (javaIdentifier == String.name) {
170 return LogicString 165 return LogicString
171 } else { 166 } else {
172 throw new UnsupportedOperationException('''Unsupported eval type: "«javaIdentifier»"!''') 167 throw new UnsupportedOperationException('''Unsupported eval type: "«javaIdentifier»"!''')
173 } 168 }
174 } 169 }
175 } 170 }
176 171
177 private def getTypeFromPassivePatternCallConstraintResult( 172 private def getTypeFromPassivePatternCallConstraintResult(
178 PVariable v, 173 PVariable v,
179 Viatra2LogicTypeResult result, 174 Viatra2LogicTypeResult result,
180 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, 175 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace,
181 Viatra2LogicTrace viatra2LogicTrace, 176 Viatra2LogicTrace viatra2LogicTrace,
182 Set<? extends PParameter> checkedInDecisionMaking 177 Set<? extends PParameter> checkedInDecisionMaking
183 ) { 178 ) {
184 val referringConstraints = v.referringConstraints 179 val referringConstraints = v.referringConstraints
185 180
186 val referringCountMatcherTargeting = referringConstraints 181 val referringCountMatcherTargeting = referringConstraints.filter(PatternMatchCounter).filter [
187 .filter(PatternMatchCounter) 182 it.resultVariable === v
188 .filter[it.resultVariable === v] 183 ].map[builder.LogicInt]
189 .map[builder.LogicInt] 184 val referringAggregatorConstraintsTargeting = referringConstraints.filter(AggregatorConstraint).filter [
190 val referringAggregatorConstraintsTargeting = referringConstraints 185 it.resultVariable === v
191 .filter(AggregatorConstraint) 186 ].map [ // get the type of the referred column
192 .filter[it.resultVariable === v] 187 getOrMakeTypeDecision(result, it.referredQuery, it.referredQuery.parameters.get(aggregatedColumn),
193 .map[ // get the type of the referred column 188 ecore2LogicTrace, viatra2LogicTrace, checkedInDecisionMaking)
194 getOrMakeTypeDecision( 189 ]
195 result, 190
196 it.referredQuery,
197 it.referredQuery.parameters.get(aggregatedColumn),
198 ecore2LogicTrace,
199 viatra2LogicTrace,
200 checkedInDecisionMaking)]
201
202 return referringCountMatcherTargeting + referringAggregatorConstraintsTargeting 191 return referringCountMatcherTargeting + referringAggregatorConstraintsTargeting
203 } 192 }
204 193
205 private def getTypeFromPassivePatternCallConstraints( 194 private def getTypeFromPassivePatternCallConstraints(
206 PVariable v, 195 PVariable v,
207 Viatra2LogicTypeResult result, 196 Viatra2LogicTypeResult result,
208 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace, 197 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace,
209 Viatra2LogicTrace viatra2LogicTrace, 198 Viatra2LogicTrace viatra2LogicTrace,
210 Set<? extends PParameter> checkedInDecisionMaking 199 Set<? extends PParameter> checkedInDecisionMaking
211 ) { 200 ) {
212 val referringConstraints = v.referringConstraints 201 val referringConstraints = v.referringConstraints
213 if(referringConstraints.size === 1) { 202 if (referringConstraints.size === 1) {
214 val onlyConstraint = referringConstraints.head 203 val onlyConstraint = referringConstraints.head
215 204
216 if(onlyConstraint instanceof PatternCallBasedDeferred) { 205 if (onlyConstraint instanceof PatternCallBasedDeferred) {
217 val indexOfVariable = v.lookup(onlyConstraint.actualParametersTuple.invertIndex) 206 val indexOfVariable = v.lookup(onlyConstraint.actualParametersTuple.invertIndex)
218 val parameter = onlyConstraint.referredQuery.parameters.get(indexOfVariable) 207 val parameter = onlyConstraint.referredQuery.parameters.get(indexOfVariable)
219 val res = getOrMakeTypeDecision(result, onlyConstraint.referredQuery, parameter, ecore2LogicTrace,viatra2LogicTrace,checkedInDecisionMaking) 208 val res = getOrMakeTypeDecision(result, onlyConstraint.referredQuery, parameter, ecore2LogicTrace,
209 viatra2LogicTrace, checkedInDecisionMaking)
220 return #[res] 210 return #[res]
221 } else { 211 } else {
222 throw new IllegalArgumentException('''A non-PatternCallBasedDeferred type constraint is referring to the variable "«v.name»"!''') 212 throw new IllegalArgumentException('''A non-PatternCallBasedDeferred type constraint is referring to the variable "«v.name»"!''')
223 } 213 }
224 } else { 214 } else {
225 throw new IllegalArgumentException('''Multiple («referringConstraints.size», «FOR c:referringConstraints SEPARATOR ", "»«c»«ENDFOR») constraints are referring to variable "«v.name»", but no type is inferred!''') 215 throw new IllegalArgumentException('''Multiple («referringConstraints.size», «FOR c : referringConstraints SEPARATOR ", "»«c»«ENDFOR») constraints are referring to variable "«v.name»", but no type is inferred!''')
226 } 216 }
227 } 217 }
228 218
229 def TypeReference calculateCommonSubtype(Iterable<TypeReference> types) { 219 def TypeReference calculateCommonSubtype(Iterable<TypeReference> types) {
230 val primitiveTypeReferences = types.filter(PrimitiveTypeReference) 220 val primitiveTypeReferences = types.filter(PrimitiveTypeReference)
231 val complexTypeReferences = types.filter(ComplexTypeReference) 221 val complexTypeReferences = types.filter(ComplexTypeReference)
232 if(complexTypeReferences.isEmpty) { 222 if (complexTypeReferences.isEmpty) {
233 // If there is an int type, ... 223 // If there is an int type, ...
234 if(primitiveTypeReferences.exists[it instanceof IntTypeReference]) { 224 if (primitiveTypeReferences.exists[it instanceof IntTypeReference]) {
235 // ... and all types are either real or int, then return int! 225 // ... and all types are either real or int, then return int!
236 if(primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) { 226 if (primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) {
237 return primitiveTypeReferences.filter(IntTypeReference).head 227 return primitiveTypeReferences.filter(IntTypeReference).head
238 } 228 } // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types.
239 // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types. 229 else
240 else throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') 230 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''')
241 } 231 }
242 // If there is no Real, then the types should be homogenious 232 // If there is no Real, then the types should be homogenious
243 val head = primitiveTypeReferences.head 233 val head = primitiveTypeReferences.head
244 if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { 234 if (primitiveTypeReferences.exists[it.eClass !== head.eClass]) {
245 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') 235 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''')
246 } 236 }
247 return head 237 return head
248 } else if(primitiveTypeReferences.isEmpty) { 238 } else if (primitiveTypeReferences.isEmpty) {
249 val complexTypes = complexTypeReferences.map[it.referred].toSet 239 val complexTypes = complexTypeReferences.map[it.referred].toSet
250 if(complexTypes.size === 1) { 240 if (complexTypes.size === 1) {
251 return builder.toTypeReference(complexTypes.head) 241 return builder.toTypeReference(complexTypes.head)
252 } 242 }
253 // Collect possible subtypes 243 // Collect possible subtypes
254 val subtypeSets = complexTypes.map[it.transitiveClosureStar[it.subtypes].toSet] 244 val subtypeSets = complexTypes.map[it.transitiveClosureStar[it.subtypes].toSet]
255 val commonTypeSet = new HashSet(subtypeSets.head) 245 val commonTypeSet = new HashSet(subtypeSets.head)
256 val otherSets = subtypeSets.tail 246 val otherSets = subtypeSets.tail
257 for(otherSet : otherSets) { 247 for (otherSet : otherSets) {
258 commonTypeSet.retainAll(otherSet) 248 commonTypeSet.retainAll(otherSet)
259 } 249 }
260 if(commonTypeSet.empty) { 250 if (commonTypeSet.empty) {
261 throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') 251 throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''')
262 } 252 }
263 253
264
265 return calculateCommonComplexSupertype(commonTypeSet) 254 return calculateCommonComplexSupertype(commonTypeSet)
266 255
267 } else { 256 } else {
268 throw new IllegalArgumentException(''' 257 throw new IllegalArgumentException('''
269 Inconsistent types, mixing primitive and complex types: 258 Inconsistent types, mixing primitive and complex types:
270 «primitiveTypeReferences.map[eClass.name].toSet.toList» 259 «primitiveTypeReferences.map[eClass.name].toSet.toList»
271 and 260 and
272 «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') 261 «complexTypeReferences.map[it.referred].toSet.map[name].toList»''')
273 262
274 } 263 }
275 } 264 }
276 265
277
278 def TypeReference calculateCommonSupertype(Iterable<TypeReference> types) { 266 def TypeReference calculateCommonSupertype(Iterable<TypeReference> types) {
279 val primitiveTypeReferences = types.filter(PrimitiveTypeReference) 267 val primitiveTypeReferences = types.filter(PrimitiveTypeReference)
280 val complexTypeReferences = types.filter(ComplexTypeReference) 268 val complexTypeReferences = types.filter(ComplexTypeReference)
281 if(complexTypeReferences.isEmpty) { 269 if (complexTypeReferences.isEmpty) {
282 // If there is a real type, ... 270 // If there is a real type, ...
283 if(primitiveTypeReferences.exists[it instanceof RealTypeReference]) { 271 if (primitiveTypeReferences.exists[it instanceof RealTypeReference]) {
284 // ... and all types are either real or int, then return real! 272 // ... and all types are either real or int, then return real!
285 if(primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) { 273 if (primitiveTypeReferences.forall[it instanceof RealTypeReference || it instanceof IntTypeReference]) {
286 return primitiveTypeReferences.filter(RealTypeReference).head 274 return primitiveTypeReferences.filter(RealTypeReference).head
287 } 275 } // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types.
288 // Otherwise, the types are inconsistent, because they mixing numeric and non-numeric types. 276 else
289 else throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') 277 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''')
290 } 278 }
291 // If there is no Real, then the types should be homogenious 279 // If there is no Real, then the types should be homogenious
292 val head = primitiveTypeReferences.head 280 val head = primitiveTypeReferences.head
293 if(primitiveTypeReferences.exists[it.eClass !== head.eClass]) { 281 if (primitiveTypeReferences.exists[it.eClass !== head.eClass]) {
294 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''') 282 throw new IllegalArgumentException('''Inconsistent types: «primitiveTypeReferences.map[eClass.name].toSet.toList»''')
295 } 283 }
296 return head 284 return head
297 } else if(primitiveTypeReferences.isEmpty) { 285 } else if (primitiveTypeReferences.isEmpty) {
298 val complexTypes = complexTypeReferences.map[it.referred].toSet 286 val complexTypes = complexTypeReferences.map[it.referred].toSet
299 return calculateCommonComplexSupertype(complexTypes) 287 return calculateCommonComplexSupertype(complexTypes)
300 288
301 } else { 289 } else {
302 throw new IllegalArgumentException(''' 290 throw new IllegalArgumentException('''
303 Inconsistent types, mixing primitive and complex types: 291 Inconsistent types, mixing primitive and complex types:
304 «primitiveTypeReferences.map[eClass.name].toSet.toList» 292 «primitiveTypeReferences.map[eClass.name].toSet.toList»
305 and 293 and
306 «complexTypeReferences.map[it.referred].toSet.map[name].toList»''') 294 «complexTypeReferences.map[it.referred].toSet.map[name].toList»''')
307 295
308 } 296 }
309 } 297 }
298
310 def TypeReference calculateCommonComplexSupertype(Set<Type> complexTypes) { 299 def TypeReference calculateCommonComplexSupertype(Set<Type> complexTypes) {
311 if(complexTypes.size === 1) { 300 if (complexTypes.size === 1) {
312 return builder.toTypeReference(complexTypes.head) 301 return builder.toTypeReference(complexTypes.head)
313 } 302 }
314 // Collect possible supertypes 303 // Collect possible supertypes
315 val supertypeSets = complexTypes.map[it.transitiveClosureStar[it.supertypes].toSet] 304 val supertypeSets = complexTypes.map[it.transitiveClosureStar[it.supertypes].toSet]
316 val commonTypeSet = new HashSet(supertypeSets.head) 305 val commonTypeSet = new HashSet(supertypeSets.head)
317 val otherSets = supertypeSets.tail 306 val otherSets = supertypeSets.tail
318 for(otherSet : otherSets) { 307 for (otherSet : otherSets) {
319 commonTypeSet.retainAll(otherSet) 308 commonTypeSet.retainAll(otherSet)
320 } 309 }
321 if(commonTypeSet.empty) { 310 if (commonTypeSet.empty) {
322 throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''') 311 throw new IllegalArgumentException('''Inconsistent types: «complexTypes.map[name].toList»''')
323 } 312 }
324 // Remove type that already have covered 313 // Remove type that already have covered
@@ -326,40 +315,44 @@ class Viatra2LogicTypeInferer{
326 commonTypeSet.removeAll(coveredTypes) 315 commonTypeSet.removeAll(coveredTypes)
327 return builder.toTypeReference(commonTypeSet.head) 316 return builder.toTypeReference(commonTypeSet.head)
328 } 317 }
329 318
330 /** 319 /**
331 * Transforms a Viatra type reference to a logic type. 320 * Transforms a Viatra type reference to a logic type.
332 */ 321 */
333 def dispatch TypeReference transformTypeReference(EDataTypeInSlotsKey k,TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) { 322 def dispatch TypeReference transformTypeReference(EDataTypeInSlotsKey k,
334 val w = k.wrappedKey 323 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) {
335 if(w == EcorePackage.Literals.EINT || w == EcorePackage.Literals.ESHORT || w == EcorePackage.Literals.ELONG) { 324 val w = k.wrappedKey
325 if (w == EcorePackage.Literals.EINT || w == EcorePackage.Literals.ESHORT || w == EcorePackage.Literals.ELONG) {
336 return builder.LogicInt 326 return builder.LogicInt
337 } else if(w == EcorePackage.Literals.EDOUBLE || w == EcorePackage.Literals.EFLOAT) { 327 } else if (w == EcorePackage.Literals.EDOUBLE || w == EcorePackage.Literals.EFLOAT) {
338 return builder.LogicReal 328 return builder.LogicReal
339 } else if(w == EcorePackage.Literals.EBOOLEAN) { 329 } else if (w == EcorePackage.Literals.EBOOLEAN) {
340 return builder.LogicBool 330 return builder.LogicBool
341 } else if(w == EcorePackage.Literals.ESTRING) { 331 } else if (w == EcorePackage.Literals.ESTRING) {
342 return builder.LogicString 332 return builder.LogicString
343 } else if(w instanceof EEnum) { 333 } else if (w instanceof EEnum) {
344 val c = this.ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,w) 334 val c = this.ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace, w)
345 return builder.toTypeReference(c); 335 return builder.toTypeReference(c);
346 } else throw new UnsupportedOperationException('''Unknown reference type «w.class.name»''') 336 } else
337 throw new UnsupportedOperationException('''Unknown reference type «w.class.name»''')
347 } 338 }
348 def dispatch TypeReference transformTypeReference(JavaTransitiveInstancesKey k,TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) { 339
340 def dispatch TypeReference transformTypeReference(JavaTransitiveInstancesKey k,
341 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) {
349 val c = k.wrapperInstanceClass 342 val c = k.wrapperInstanceClass
350 if(c == Integer || c == Long || c == Short) { 343 if (c == Integer || c == Long || c == Short) {
351 return LogicInt 344 return LogicInt
352 } else if(c == Float || c == Double) { 345 } else if (c == Float || c == Double) {
353 return LogicReal 346 return LogicReal
354 } else if(c == Boolean) { 347 } else if (c == Boolean) {
355 return LogicBool 348 return LogicBool
356 } else if(c == String) { 349 } else if (c == String) {
357 return LogicString 350 return LogicString
358 } else if(c.superclass == Enum){ 351 } else if (c.superclass == Enum) {
359 val enums = ecore2Logic.allEnumsInScope(ecore2LogicTrace.trace) 352 val enums = ecore2Logic.allEnumsInScope(ecore2LogicTrace.trace)
360 for(enum : enums) { 353 for (enum : enums) {
361 if(c == enum.instanceClass) { 354 if (c == enum.instanceClass) {
362 return builder.toTypeReference(ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace,enum)) 355 return builder.toTypeReference(ecore2Logic.TypeofEEnum(ecore2LogicTrace.trace, enum))
363 } 356 }
364 } 357 }
365 throw new IllegalArgumentException('''Enum type «c.simpleName» is not mapped to logic!''') 358 throw new IllegalArgumentException('''Enum type «c.simpleName» is not mapped to logic!''')
@@ -367,26 +360,31 @@ class Viatra2LogicTypeInferer{
367 return null 360 return null
368 } 361 }
369 } 362 }
370 def dispatch TypeReference transformTypeReference(EClassTransitiveInstancesKey k,TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) { 363
364 def dispatch TypeReference transformTypeReference(EClassTransitiveInstancesKey k,
365 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) {
371 val c = k.wrappedKey 366 val c = k.wrappedKey
372 367
373 if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { 368 if (this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) {
374 return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) 369 return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace, k.wrappedKey))
375 } else { 370 } else {
376 return null 371 return null
377 } 372 }
378 } 373 }
379 def dispatch TypeReference transformTypeReference(EClassUnscopedTransitiveInstancesKey k, TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) { 374
375 def dispatch TypeReference transformTypeReference(EClassUnscopedTransitiveInstancesKey k,
376 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) {
380 val c = k.wrappedKey 377 val c = k.wrappedKey
381 378
382 if(this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) { 379 if (this.ecore2Logic.allClassesInScope(ecore2LogicTrace.trace).toList.contains(c)) {
383 return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace,k.wrappedKey)) 380 return builder.toTypeReference(this.ecore2Logic.TypeofEClass(ecore2LogicTrace.trace, k.wrappedKey))
384 } else { 381 } else {
385 return null 382 return null
386 } 383 }
387 } 384 }
388 385
389 def dispatch TypeReference transformTypeReference(IInputKey k,TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) { 386 def dispatch TypeReference transformTypeReference(IInputKey k,
387 TracedOutput<LogicProblem, Ecore2Logic_Trace> ecore2LogicTrace) {
390 throw new IllegalArgumentException('''Unsupported type: «k.class.simpleName»''') 388 throw new IllegalArgumentException('''Unsupported type: «k.class.simpleName»''')
391 } 389 }
392} \ No newline at end of file 390}