aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend')
-rw-r--r--Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend99
1 files changed, 86 insertions, 13 deletions
diff --git a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend
index 6533ad36..4d7b50e8 100644
--- a/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend
+++ b/Solvers/Alloy-Solver/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal.xtend
@@ -1,26 +1,88 @@
1package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder 1package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder
2 2
3import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSMultiplicity
4import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureBody
3import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureDeclaration 5import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureDeclaration
6import hu.bme.mit.inf.dslreasoner.alloyLanguage.AlloyLanguageFactory
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement 7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type 8import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition 9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
8import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem 10import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
11import java.util.Collection
9import java.util.HashMap 12import java.util.HashMap
13import java.util.LinkedList
14import java.util.List
10import java.util.Map 15import java.util.Map
11import java.util.Collection
12 16
13class Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapperTrace { 17class Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapperTrace {
14 val Map<TypeDeclaration,ALSSignatureDeclaration> newElementTypes = new HashMap 18 public var ALSSignatureDeclaration objectSupperClass;
15 val Map<Type,ALSSignatureDeclaration> definedElementTypes = new HashMap 19 public val Map<Type, ALSSignatureDeclaration> type2ALSType = new HashMap;
16 var ALSSignatureDeclaration undefinedSupertype 20 public val Map<DefinedElement, ALSSignatureDeclaration> definedElement2Declaration = new HashMap
17 var ALSSignatureDeclaration definedSupertype 21 public val Map<Type, List<ALSSignatureDeclaration>> typeSelection = new HashMap
18} 22}
19 23
20class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapper{ 24class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapper{
25 private val extension AlloyLanguageFactory factory = AlloyLanguageFactory.eINSTANCE
26 private val Logic2AlloyLanguageMapper_Support support = new Logic2AlloyLanguageMapper_Support;
27
28 new() {
29 LogicproblemPackage.eINSTANCE.class
30 }
21 31
22 override transformTypes(Collection<Type> types, Collection<DefinedElement> elements, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) { 32 override transformTypes(Collection<Type> types, Collection<DefinedElement> elements, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) {
23 throw new UnsupportedOperationException("TODO: auto-generated method stub") 33 if(types.exists[hasDefinedSupertype]) {
34 throw new UnsupportedOperationException('''Defined supertype is not supported by this type mapping!''')
35 } else {
36
37 val typeTrace = new Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal
38 trace.typeMapperTrace = typeTrace
39
40 // 1. A global type for Objects is created
41 val objectSig = createALSSignatureDeclaration => [it.name = support.toID(#["util","Object"])]
42 val objectBody = createALSSignatureBody => [
43 it.declarations += objectSig
44 it.abstract = true
45 ]
46 typeTrace.objectSupperClass = objectSig
47 trace.specification.signatureBodies += objectBody
48
49 // 2. Each type is mapped to a unique sig
50 for(type : types) {
51 val sig = createALSSignatureDeclaration => [it.name = support.toIDMultiple("type",type.name)]
52 val body = createALSSignatureBody => [it.declarations += sig]
53 body.abstract = type.isIsAbstract || (type instanceof TypeDefinition)
54
55 trace.specification.signatureBodies += body
56 typeTrace.type2ALSType.put(type,sig)
57
58 if(type instanceof TypeDefinition) {
59 val elementContainer = createALSSignatureBody => [it.multiplicity = ALSMultiplicity::ONE it.supertype = sig]
60 for(element : type.elements) {
61 val signature = createALSSignatureDeclaration => [it.name = support.toIDMultiple("element",element.name)]
62 elementContainer.declarations += signature
63
64 }
65 trace.specification.signatureBodies += elementContainer
66 }
67
68 typeTrace.typeSelection.put(type,new LinkedList()=>[add(sig)])
69 }
70
71 // 6. Each inheritance is modeled by extend keyword
72 for(type : types) {
73 if(type.supertypes.size == 1) {
74 val alsType = typeTrace.type2ALSType.get(type.supertypes.head)
75 (type.eContainer as ALSSignatureBody).supertype = alsType
76 } else if(type.supertypes.size > 1){
77 val alsMainType = typeTrace.type2ALSType.get(type.supertypes.head)
78 (type.eContainer as ALSSignatureBody).supertype = alsMainType
79 for(otherType : type.supertypes.filter[it != alsMainType]) {
80 typeTrace.typeSelection.get(otherType).add(typeTrace.type2ALSType.get(otherType))
81 }
82 }
83 }
84
85 }
24 } 86 }
25 87
26 private def boolean hasDefinedSupertype(Type type) { 88 private def boolean hasDefinedSupertype(Type type) {
@@ -30,21 +92,32 @@ class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements L
30 if(type.supertypes.empty) return false 92 if(type.supertypes.empty) return false
31 else return type.supertypes.exists[it.hasDefinedSupertype] 93 else return type.supertypes.exists[it.hasDefinedSupertype]
32 } 94 }
33 } 95 }
96
97 def getTypeTrace(Logic2AlloyLanguageMapperTrace trace) {
98 val res = trace.typeMapperTrace
99 if(res instanceof Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal) {
100 return res
101 } else {
102 throw new IllegalArgumentException('''
103 Expected type mapping trace: «Logic2AlloyLanguageMapper_TypeMapperTrace_FilteredTypes.name»,
104 but found «res.class.name»''')
105 }
106 }
34 107
35 override transformTypeReference(Type referred, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) { 108 override transformTypeReference(Type referred, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) {
36 throw new UnsupportedOperationException("TODO: auto-generated method stub") 109 trace.typeTrace.typeSelection.get(referred)
37 } 110 }
38 111
39 override getUndefinedSupertype(Logic2AlloyLanguageMapperTrace trace) { 112 override getUndefinedSupertype(Logic2AlloyLanguageMapperTrace trace) {
40 throw new UnsupportedOperationException("TODO: auto-generated method stub") 113 trace.typeTrace.objectSupperClass
41 } 114 }
42 115
43 override transformReference(DefinedElement referred, Logic2AlloyLanguageMapperTrace trace) { 116 override transformReference(DefinedElement referred, Logic2AlloyLanguageMapperTrace trace) {
44 throw new UnsupportedOperationException("TODO: auto-generated method stub") 117 createALSReference => [it.referred = trace.typeTrace.definedElement2Declaration.get(referred)]
45 } 118 }
46 119
47 override getUndefinedSupertypeScope(int undefinedScope, Logic2AlloyLanguageMapperTrace trace) { 120 override getUndefinedSupertypeScope(int undefinedScope, Logic2AlloyLanguageMapperTrace trace) {
48 throw new UnsupportedOperationException("TODO: auto-generated method stub") 121 return undefinedScope + trace.typeTrace.definedElement2Declaration.size
49 } 122 }
50} \ No newline at end of file 123} \ No newline at end of file