diff options
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.xtend | 99 |
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 @@ | |||
1 | package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder | 1 | package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder |
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSMultiplicity | ||
4 | import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureBody | ||
3 | import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureDeclaration | 5 | import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureDeclaration |
6 | import hu.bme.mit.inf.dslreasoner.alloyLanguage.AlloyLanguageFactory | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | 7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement |
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | 8 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type |
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration | ||
7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition | 9 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition |
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 10 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage |
11 | import java.util.Collection | ||
9 | import java.util.HashMap | 12 | import java.util.HashMap |
13 | import java.util.LinkedList | ||
14 | import java.util.List | ||
10 | import java.util.Map | 15 | import java.util.Map |
11 | import java.util.Collection | ||
12 | 16 | ||
13 | class Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapperTrace { | 17 | class 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 | ||
20 | class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapper{ | 24 | class 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 |