Пользовательский Slick Codegen генерирует сопоставленные классы case вне черты `${container}`?

Может ли Slick Codegen генерировать все сопоставленные классы case за пределами ${container} trait , чтобы они не наследовали его тип? Может вообще в другом файле т.е. Models.scala?

// SuppliersRowsDAA.scala
import persistence.Tables

object SuppliersRowsDAA {
  case class Save(sup: Tables.SuppliersRow)
}   

Я получаю эту ошибку компиляции:

[error] /app/src/main/scala/persistence/dal/SuppliersDAA.scala:5: type mismatch;
[error]  found   : persistence.Tables.SuppliersRow
[error]  required: SuppliersDAA.this.SuppliersRow
[error]     case Save(sup) ⇒ sender ! db.run(Suppliers += sup)

Использование импорта Tables#SuppliersRow дает ту же ошибку.

Если я вручную вырезаю и вставляю класс case SuppliersRow вне автоматически сгенерированного trait Tables, он работает!

....

trait Tables {

....
}
case class SuppliersRow(id: Int, userId: Int, name: String)
//EOF

person phedoreanu    schedule 25.06.2015    source источник
comment
вы должны быть в состоянии сделать это неизменно, но у меня нет времени, чтобы изучить это прямо сейчас   -  person cvogt    schedule 26.06.2015
comment
mkString() использует scala.collection.mutable.StringBuilder, сложность добавления которого равна aC по сравнению с C из ListBuffer/MutableList docs.scala-lang.org/overviews/collections/   -  person phedoreanu    schedule 26.06.2015
comment
Я не считаю асимптотическую сложность важной темой, когда мы генерируем несколько строк во время компиляции.   -  person cvogt    schedule 26.06.2015
comment
правильность и ясность гораздо важнее. здесь помогает неизменность.   -  person cvogt    schedule 26.06.2015


Ответы (1)


Добавление исходного docWithCode из EntityType к super.packageCode():

import slick.codegen.SourceCodeGenerator
import slick.model.Model
import scala.collection.mutable

class CustomizedCodeGenerator(model: Model) extends SourceCodeGenerator(model) {
  val models = new mutable.MutableList[String]

  override def packageCode(profile: String, pkg: String, container: String, parentType: Option[String]): String = {
    super.packageCode(profile, pkg, container, parentType) + "\n" + outsideCode
  }

  def outsideCode = s"${indent(models.mkString("\n"))}"

  override def Table = new Table(_) {
    override def EntityType = new EntityTypeDef {
      override def docWithCode: String = {
        models += super.docWithCode.toString + "\n"
        ""
      }
    }
  }

}
person Minidevops    schedule 18.08.2015