package hu.bme.mit.inf.dslreasoner.ecore2logic import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TermDescription import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import java.util.ArrayList import java.util.HashMap import java.util.Map import org.eclipse.emf.common.util.Enumerator import org.eclipse.emf.ecore.EEnum import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* interface EEnumMapper { def void transformEEnums(Ecore2Logic_Trace trace, LogicProblem problem, Iterable enums,Ecore2LogicConfiguration config) def Type TypeofEEnum(Ecore2Logic_Trace trace, EEnum type) def TermDescription Literal(Ecore2Logic_Trace trace, Enumerator literal) def Iterable allEnumsInScope(Ecore2Logic_Trace trace) def Iterable allLiteralsInScope(Ecore2Logic_Trace trace) } class EEnumMapper_PredefinedClasses_Trace implements Trace{ public var Map enums public var Map literals } class EEnumMapper_PredefinedClasses implements EEnumMapper { val extension LogicProblemBuilder builder = new LogicProblemBuilder override transformEEnums(Ecore2Logic_Trace trace, LogicProblem problem, Iterable enums, Ecore2LogicConfiguration config) { val enumTrace = new EEnumMapper_PredefinedClasses_Trace trace.enumMapperTrace = enumTrace enumTrace.enums = new HashMap enumTrace.literals = new HashMap for(enum : enums) { val l = new ArrayList(enum.ELiterals.size) for(literal : enum.ELiterals.map[instance]) { val element = Element('''«literal.name» literal «enum.name»''') l+=element enumTrace.literals.put(literal,element) } val type = TypeDefinition('''«enum.name» enum''',false,l) problem.add(type) enumTrace.enums.put(enum,type) } } private def asTrace(Trace o) { o as EEnumMapper_PredefinedClasses_Trace } override TypeofEEnum(Ecore2Logic_Trace trace, EEnum type) { trace.enumMapperTrace.asTrace.enums.get(type) } override Literal(Ecore2Logic_Trace trace, Enumerator literal) { literal.lookup(trace.enumMapperTrace.asTrace.literals) } override allEnumsInScope(Ecore2Logic_Trace trace) { trace.enumMapperTrace.asTrace.enums.keySet } override allLiteralsInScope(Ecore2Logic_Trace trace) { trace.enumMapperTrace.asTrace.literals.keySet } }