diff --git a/build.sbt b/build.sbt index 1a8f8b72660c0880925086accef44965ba20a410..269d091ede86aacf69e20a4d9cd144cc665cffb3 100644 --- a/build.sbt +++ b/build.sbt @@ -9,6 +9,7 @@ scalaVersion := "2.12.6" libraryDependencies ++= Seq( "org.scala-lang" % "scala-reflect" % scalaVersion.value, + "org.scala-lang" % "scala-compiler" % scalaVersion.value, "org.eclipse.emf" % "org.eclipse.emf.common" % emfcommonVersion, "org.eclipse.emf" % "org.eclipse.emf.ecore" % emfecoreVersion ) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriterTest.scala index 1ca144bf28dc1d4d96be23820c5b2c4f9ed90b33..418f9453b43273477baa505fd45edbc310c79b9c 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriterTest.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriterTest.scala @@ -1,7 +1,7 @@ package org.rosi_project.model_sync.generator.io import org.rosi_project.model_sync.generator.acr._ -import org.rosi_project.model_sync.generator.sync_model.{GetterSetterGeneratingVisitor, SyncNotificationGeneratingVisitor} +import org.rosi_project.model_sync.generator.sync_model.{GetterSetterGeneratingVisitor, SyncEnhancingVisitor} /** * @author Rico Bergmann @@ -16,7 +16,7 @@ object SClassWriterTest extends App { val getterSetterVisitor = new GetterSetterGeneratingVisitor modelClass.accept(getterSetterVisitor) - val syncNotificationVisitor = new SyncNotificationGeneratingVisitor + val syncNotificationVisitor = new SyncEnhancingVisitor modelClass.accept(syncNotificationVisitor) val writer = new SClassWriter(modelClass) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala index b75e03f5e491f443b8d447faece050639d031c17..efc448700ecd7d589138be58150a7b219cd2d6ad 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala @@ -1,21 +1,45 @@ package org.rosi_project.model_sync.generator.io +import java.nio.file.Files + import org.rosi_project.model_sync.generator.acr.{SAttribute, SClass, SMethod, SType} import org.rosi_project.model_sync.generator.sync_model.{SModel, SModelVisitor} import scala.reflect.io.{File, Path} +import scala.tools.nsc.Main /** * @author Rico Bergmann */ class SModelFSWriter extends SModelVisitor { - private val baseOutputDir: File = null - private var sFilesToWrite: List[File] = List.empty + private val baseOutputDir: File = File(Files.createTempDirectory("model").toFile) + private var sFilesToCompile: List[File] = List.empty + + println(s"... Temp dir (sources) is $baseOutputDir") + + override def visit(sModel: SModel): Unit = { + println(s"... Wrote files (sources) $sFilesToCompile") + println("... Starting compilation") + val compiler = Main.newCompiler() + - override def visit(sModel: SModel): Unit = ??? // TODO compile all the written files and put them into a jar - override def visit(sClass: SClass): Unit = ??? // TODO write the sClass + println("... Compilation done") + println("... Cleaning up") + println("... Generating JAR") + + println("... Done") + } + + override def visit(sClass: SClass): Unit = { + val classNameWithPath = baseOutputDir.toAbsolute.toString() + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala" + val writer = new SClassWriter(sClass) + val classFile = File(classNameWithPath) + + classFile.writeAll(writer.stringify) + sFilesToCompile ::= classFile + } override def visit(sAttr: SAttribute): Unit = { // pass @@ -29,4 +53,6 @@ class SModelFSWriter extends SModelVisitor { // pass } + private def pckg2Path(pckg: String): Path = Path(pckg.replace(".", File.separator)) + } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala new file mode 100644 index 0000000000000000000000000000000000000000..774f0789cb665568feb444da736e87c8795cf438 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala @@ -0,0 +1,27 @@ +package org.rosi_project.model_sync.generator.io + +import org.rosi_project.model_sync.generator.acr._ +import org.rosi_project.model_sync.generator.sync_model.{GetterSetterGeneratingVisitor, SimpleSModel, SyncEnhancingVisitor} + +/** + * @author Rico Bergmann + */ +object SModelFSWriterTest extends App { + + val model = new SimpleSModel("org.foo") + + val stringType = SType("String") + + val personAttrs = Seq(SAttribute("name", stringType)) + val personSayHelloMethod = new SMethod("sayHello", stringType, Seq.empty, Seq(SMethodStatement("s\"Hello $name\""))) + val personClass = new SClass("Person", personAttrs, methods = Seq(personSayHelloMethod)) + + val getterSetterVisitor = new GetterSetterGeneratingVisitor + val syncNotificationVisitor = new SyncEnhancingVisitor + + model.addModelClass(personClass) + + model.accept(getterSetterVisitor) + model.accept(syncNotificationVisitor) + model.accept(new SModelFSWriter) +} diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncNotificationGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncEnhancingVisitor.scala similarity index 79% rename from src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncNotificationGeneratingVisitor.scala rename to src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncEnhancingVisitor.scala index b5fa535ba4a6ecfe7cdb38538ce47813fa1ccd70..7bcadd2ca51fd937c8bb94abe5daae108ec09006 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncNotificationGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync_model/SyncEnhancingVisitor.scala @@ -4,14 +4,14 @@ import org.rosi_project.model_sync.generator.acr._ /** * @author Rico Bergmann */ -class SyncNotificationGeneratingVisitor extends SModelVisitor { +class SyncEnhancingVisitor extends SModelVisitor { override def visit(sModel: SModel): Unit = { // pass } override def visit(sClass: SClass): Unit = { - // pass + // TODO extend PlayerSync and call setup method in constructor } override def visit(sAttr: SAttribute): Unit = { @@ -28,7 +28,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor { private def extractSetterAttr(sMethod: SMethod): Option[String] = { sMethod.name match { - case SyncNotificationGeneratingVisitor.SetterRegex(attrName) => + case SyncEnhancingVisitor.SetterRegex(attrName) => Option(attrName) case _ => None @@ -38,7 +38,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor { } -object SyncNotificationGeneratingVisitor { +object SyncEnhancingVisitor { private val SetterRegex = """set([A-Z][a-zA-z0-9]*)""".r