From 52a694242a6d9c2aa182bf2224a28cea93cf1658 Mon Sep 17 00:00:00 2001 From: Chrissi <christopher@hbsc-werner.de> Date: Tue, 11 Jun 2019 18:13:29 +0200 Subject: [PATCH] Add a new add method for sync generation of sets of elements --- .../model_sync/generator/PackageNames.scala | 2 +- .../generator/acr_model/SSetterAdd.scala | 16 ++++++++++++++++ .../sync/GetterSetterGeneratingVisitor.scala | 7 ++++++- .../generator/sync/SyncEnhancingVisitor.scala | 4 +++- .../generator/test/ApplicationTest.scala | 4 ++-- 5 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala diff --git a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala index 531bfc8..52bdcdb 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala @@ -2,7 +2,7 @@ package org.rosi_project.model_sync.generator object PackageNames { - var sourcePkgPrefix: String = "sum." + var sourcePkgPrefix: String = "sync." val viewPkgName: String = "view" val viewPostName: String = "View" diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala new file mode 100644 index 0000000..3e03d5a --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala @@ -0,0 +1,16 @@ +package org.rosi_project.model_sync.generator.acr_model + +import org.rosi_project.model_sync.generator.support.ExtendedString.stringToExtended +import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes + +/** Add an element to a Set of elements. + * + * @author Rico Bergmann + */ +class SSetterAdd(struc: SStructuralFeature, inner: STypedElement) extends SMethod( + name = s"add${struc.getName.firstLetterToUpperCase}", + result = PredefTypes.Unit, + params = Seq(SMethodParameter(struc.getName.head.toString, inner)), + implementation = Seq(SMethodStatement(content = s"${struc.getName} += ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) { + +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala index ce5e49e..4a8802f 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala @@ -1,6 +1,7 @@ package org.rosi_project.model_sync.generator.sync import org.rosi_project.model_sync.generator.acr_model._ +import org.rosi_project.model_sync.generator.acr_model.types.GenericSequence /** Service to extend [[SClass SClasses]] with getter and setter methods for all attributes. * @@ -16,9 +17,13 @@ class GetterSetterGeneratingVisitor extends SModelVisitor { sClass.getStructuralFeatures.foreach(attr => { attr.setVisibility(MethodVisibility.protectedVis) val getter = new SGetter(attr) - val setter = new SSetter(attr) sClass.addMethod(getter) + val setter = new SSetter(attr) sClass.addMethod(setter) + if (attr.getTypeElement.isInstanceOf[GenericSequence]) { + val adder = new SSetterAdd(attr, attr.getTypeElement.asInstanceOf[GenericSequence].typeParam) + sClass.addMethod(adder) + } }) } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala index 4a30746..7fe5b4b 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala @@ -1,7 +1,6 @@ package org.rosi_project.model_sync.generator.sync import org.rosi_project.model_sync.generator.acr_model._ -import org.rosi_project.model_sync.sync.ISynchronizationCompartment /** Augments [[SClass SClasses]] with the necessary method calls to make it usable in a * synchronization context. @@ -60,6 +59,8 @@ class SyncEnhancingVisitor() extends SModelVisitor { sMethod.getName match { case SyncEnhancingVisitor.Setter(attrName) => Option(attrName) + case SyncEnhancingVisitor.Adder(attrName) => + Option(attrName) case _ => None } @@ -72,5 +73,6 @@ class SyncEnhancingVisitor() extends SModelVisitor { */ object SyncEnhancingVisitor { private val Setter = """set([A-Z][a-zA-z0-9]*)""".r + private val Adder = """add([A-Z][a-zA-z0-9]*)""".r private val PLAYER_SYNC_INIT = SMethodStatement("buildClass()") } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala index 549fabc..7ad2462 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala @@ -10,8 +10,8 @@ object ApplicationTest extends App { //runCombinedTest(Creation.rsum) //runShrinkingModel(Creation.rsum) - runTTC2019(Creation.rolecomb) - //runTTC2019(Creation.rolesync) + //runTTC2019(Creation.rolecomb) + runTTC2019(Creation.rolesync) //runAllTests(Creation.rsum) -- GitLab