From a119a0edd2883f64bab54fe552c40bd46c4a8885 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Mon, 21 Aug 2017 00:38:15 +0200 Subject: simple typemapper for alloy --- ...apper_TypeMapper_InheritanceAndHorizontal.xtend | 99 +++++++++++++++++++--- 1 file changed, 86 insertions(+), 13 deletions(-) (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') 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 @@ package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder +import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSMultiplicity +import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureBody import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSSignatureDeclaration +import hu.bme.mit.inf.dslreasoner.alloyLanguage.AlloyLanguageFactory import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition -import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage +import java.util.Collection import java.util.HashMap +import java.util.LinkedList +import java.util.List import java.util.Map -import java.util.Collection class Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapperTrace { - val Map newElementTypes = new HashMap - val Map definedElementTypes = new HashMap - var ALSSignatureDeclaration undefinedSupertype - var ALSSignatureDeclaration definedSupertype + public var ALSSignatureDeclaration objectSupperClass; + public val Map type2ALSType = new HashMap; + public val Map definedElement2Declaration = new HashMap + public val Map> typeSelection = new HashMap } class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements Logic2AlloyLanguageMapper_TypeMapper{ + private val extension AlloyLanguageFactory factory = AlloyLanguageFactory.eINSTANCE + private val Logic2AlloyLanguageMapper_Support support = new Logic2AlloyLanguageMapper_Support; + + new() { + LogicproblemPackage.eINSTANCE.class + } override transformTypes(Collection types, Collection elements, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + if(types.exists[hasDefinedSupertype]) { + throw new UnsupportedOperationException('''Defined supertype is not supported by this type mapping!''') + } else { + + val typeTrace = new Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal + trace.typeMapperTrace = typeTrace + + // 1. A global type for Objects is created + val objectSig = createALSSignatureDeclaration => [it.name = support.toID(#["util","Object"])] + val objectBody = createALSSignatureBody => [ + it.declarations += objectSig + it.abstract = true + ] + typeTrace.objectSupperClass = objectSig + trace.specification.signatureBodies += objectBody + + // 2. Each type is mapped to a unique sig + for(type : types) { + val sig = createALSSignatureDeclaration => [it.name = support.toIDMultiple("type",type.name)] + val body = createALSSignatureBody => [it.declarations += sig] + body.abstract = type.isIsAbstract || (type instanceof TypeDefinition) + + trace.specification.signatureBodies += body + typeTrace.type2ALSType.put(type,sig) + + if(type instanceof TypeDefinition) { + val elementContainer = createALSSignatureBody => [it.multiplicity = ALSMultiplicity::ONE it.supertype = sig] + for(element : type.elements) { + val signature = createALSSignatureDeclaration => [it.name = support.toIDMultiple("element",element.name)] + elementContainer.declarations += signature + + } + trace.specification.signatureBodies += elementContainer + } + + typeTrace.typeSelection.put(type,new LinkedList()=>[add(sig)]) + } + + // 6. Each inheritance is modeled by extend keyword + for(type : types) { + if(type.supertypes.size == 1) { + val alsType = typeTrace.type2ALSType.get(type.supertypes.head) + (type.eContainer as ALSSignatureBody).supertype = alsType + } else if(type.supertypes.size > 1){ + val alsMainType = typeTrace.type2ALSType.get(type.supertypes.head) + (type.eContainer as ALSSignatureBody).supertype = alsMainType + for(otherType : type.supertypes.filter[it != alsMainType]) { + typeTrace.typeSelection.get(otherType).add(typeTrace.type2ALSType.get(otherType)) + } + } + } + + } } private def boolean hasDefinedSupertype(Type type) { @@ -30,21 +92,32 @@ class Logic2AlloyLanguageMapper_TypeMapper_InheritanceAndHorizontal implements L if(type.supertypes.empty) return false else return type.supertypes.exists[it.hasDefinedSupertype] } - } + } + + def getTypeTrace(Logic2AlloyLanguageMapperTrace trace) { + val res = trace.typeMapperTrace + if(res instanceof Logic2AlloyLanguageMapper_TypeMapperTrace_InheritanceAndHorizontal) { + return res + } else { + throw new IllegalArgumentException(''' + Expected type mapping trace: «Logic2AlloyLanguageMapper_TypeMapperTrace_FilteredTypes.name», + but found «res.class.name»''') + } + } override transformTypeReference(Type referred, Logic2AlloyLanguageMapper mapper, Logic2AlloyLanguageMapperTrace trace) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + trace.typeTrace.typeSelection.get(referred) } override getUndefinedSupertype(Logic2AlloyLanguageMapperTrace trace) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + trace.typeTrace.objectSupperClass } override transformReference(DefinedElement referred, Logic2AlloyLanguageMapperTrace trace) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + createALSReference => [it.referred = trace.typeTrace.definedElement2Declaration.get(referred)] } override getUndefinedSupertypeScope(int undefinedScope, Logic2AlloyLanguageMapperTrace trace) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + return undefinedScope + trace.typeTrace.definedElement2Declaration.size } } \ No newline at end of file -- cgit v1.2.3-54-g00ecf