Skip to content
Snippets Groups Projects
Verified Commit 4e86bea9 authored by Rico Bergmann's avatar Rico Bergmann
Browse files

[WIP] Make FS writer save all model classes to FS

parent 2500cb05
Branches
No related tags found
2 merge requests!2Publish v0.1,!1Move away from experimental changes
This commit is part of merge request !1. Comments created here will be created in the context of that merge request.
...@@ -9,6 +9,7 @@ scalaVersion := "2.12.6" ...@@ -9,6 +9,7 @@ scalaVersion := "2.12.6"
libraryDependencies ++= Seq( libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value, "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.common" % emfcommonVersion,
"org.eclipse.emf" % "org.eclipse.emf.ecore" % emfecoreVersion "org.eclipse.emf" % "org.eclipse.emf.ecore" % emfecoreVersion
) )
......
package org.rosi_project.model_sync.generator.io package org.rosi_project.model_sync.generator.io
import org.rosi_project.model_sync.generator.acr._ 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 * @author Rico Bergmann
...@@ -16,7 +16,7 @@ object SClassWriterTest extends App { ...@@ -16,7 +16,7 @@ object SClassWriterTest extends App {
val getterSetterVisitor = new GetterSetterGeneratingVisitor val getterSetterVisitor = new GetterSetterGeneratingVisitor
modelClass.accept(getterSetterVisitor) modelClass.accept(getterSetterVisitor)
val syncNotificationVisitor = new SyncNotificationGeneratingVisitor val syncNotificationVisitor = new SyncEnhancingVisitor
modelClass.accept(syncNotificationVisitor) modelClass.accept(syncNotificationVisitor)
val writer = new SClassWriter(modelClass) val writer = new SClassWriter(modelClass)
......
package org.rosi_project.model_sync.generator.io 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.acr.{SAttribute, SClass, SMethod, SType}
import org.rosi_project.model_sync.generator.sync_model.{SModel, SModelVisitor} import org.rosi_project.model_sync.generator.sync_model.{SModel, SModelVisitor}
import scala.reflect.io.{File, Path} import scala.reflect.io.{File, Path}
import scala.tools.nsc.Main
/** /**
* @author Rico Bergmann * @author Rico Bergmann
*/ */
class SModelFSWriter extends SModelVisitor { class SModelFSWriter extends SModelVisitor {
private val baseOutputDir: File = null private val baseOutputDir: File = File(Files.createTempDirectory("model").toFile)
private var sFilesToWrite: List[File] = List.empty 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 println("... Compilation done")
println("... Cleaning up")
println("... Generating JAR")
override def visit(sClass: SClass): Unit = ??? // TODO write the sClass 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 = { override def visit(sAttr: SAttribute): Unit = {
// pass // pass
...@@ -29,4 +53,6 @@ class SModelFSWriter extends SModelVisitor { ...@@ -29,4 +53,6 @@ class SModelFSWriter extends SModelVisitor {
// pass // pass
} }
private def pckg2Path(pckg: String): Path = Path(pckg.replace(".", File.separator))
} }
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)
}
...@@ -4,14 +4,14 @@ import org.rosi_project.model_sync.generator.acr._ ...@@ -4,14 +4,14 @@ import org.rosi_project.model_sync.generator.acr._
/** /**
* @author Rico Bergmann * @author Rico Bergmann
*/ */
class SyncNotificationGeneratingVisitor extends SModelVisitor { class SyncEnhancingVisitor extends SModelVisitor {
override def visit(sModel: SModel): Unit = { override def visit(sModel: SModel): Unit = {
// pass // pass
} }
override def visit(sClass: SClass): Unit = { override def visit(sClass: SClass): Unit = {
// pass // TODO extend PlayerSync and call setup method in constructor
} }
override def visit(sAttr: SAttribute): Unit = { override def visit(sAttr: SAttribute): Unit = {
...@@ -28,7 +28,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor { ...@@ -28,7 +28,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor {
private def extractSetterAttr(sMethod: SMethod): Option[String] = { private def extractSetterAttr(sMethod: SMethod): Option[String] = {
sMethod.name match { sMethod.name match {
case SyncNotificationGeneratingVisitor.SetterRegex(attrName) => case SyncEnhancingVisitor.SetterRegex(attrName) =>
Option(attrName) Option(attrName)
case _ => case _ =>
None None
...@@ -38,7 +38,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor { ...@@ -38,7 +38,7 @@ class SyncNotificationGeneratingVisitor extends SModelVisitor {
} }
object SyncNotificationGeneratingVisitor { object SyncEnhancingVisitor {
private val SetterRegex = """set([A-Z][a-zA-z0-9]*)""".r private val SetterRegex = """set([A-Z][a-zA-z0-9]*)""".r
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment