Сгенерированный исходный код с макросами в Scala 2.13 и проект Mill, не найденный в Intellij
Я использую zio-макросы в Scala 2.13 / Mill Project.
Вот пример:
@accessible
@mockable
trait AccountObserver {
val accountObserver: AccountObserver.Service[Any]
}
object AccountObserver {
trait Service[R] {
def processEvent(event: String): ZIO[R, Nothing, Unit]
}
// autogenerated `object Service { ... }`
// autogenerated `object > extends Service[AccountObserver] { ... }`
// autogenerated `implicit val mockable: Mockable[AccountObserver] = ...`
}
Я могу запустить тест, и он найдет автоматически сгенерированный код.
Проблема в том, что в Intellij ссылки на автоматически сгенерированный код не компилируются.
Надо что-то настраивать или чего не хватает?
2 ответа
Обновление: этот ответ не решает проблему.
Это ошибка в генераторе проектов IntelliJ IDEA Mill 0.5.2 и ранее. Версии Mill с0.5.2-9-ea4f04
будет содержать исправление для этой конкретной проблемы. (Для справки: #729, #728)
Чтобы обойти: добавьте .mill-version
файл в вашем проекте, содержащий этот номер версии (или любой более новый, конечно), и перезапустите генератор проекта IDEA.
$ echo -n "0.5.2-9-ea4f04" > .mill-version
$ mill mill.scalalib.GenIdea/idea
Следующий проект компилируется
build.sc
import mill._, scalalib._
object root extends ScalaModule {
def scalaVersion = "2.13.1"
val zioMacrosV = "0.4.0"
def ivyDeps = Agg(
ivy"dev.zio::zio-macros-core:${zioMacrosV}",
ivy"dev.zio::zio-macros-access:${zioMacrosV}",
ivy"dev.zio::zio-macros-mock:${zioMacrosV}"
)
def scalacOptions = Seq(
"-Ymacro-annotations",
"-Ymacro-debug-lite"
)
}
корень / SRC /App.scala
import zio.ZIO
import zio.macros.access.accessible
import zio.macros.mock.mockable
@accessible
@mockable
trait AccountObserver {
val accountObserver: AccountObserver.Service[Any]
}
object AccountObserver {
trait Service[R] {
def processEvent(event: String): ZIO[R, Nothing, Unit]
}
}
Команда mill root.compile
компилирует проект
//{
// abstract trait AccountObserver extends scala.AnyRef {
// val accountObserver: AccountObserver.Service[Any]
// };
// object AccountObserver extends scala.AnyRef {
// def <init>() = {
// super.<init>();
// ()
// };
// abstract trait Service[R] extends scala.AnyRef {
// def processEvent(event: String): ZIO[R, Nothing, Unit]
// };
// object Service extends scala.AnyRef {
// def <init>() = {
// super.<init>();
// ()
// };
// case object processEvent extends _root_.zio.test.mock.Method[String, Unit] with scala.Product with scala.Serializable {
// def <init>() = {
// super.<init>();
// ()
// }
// }
// };
// implicit val mockable: _root_.zio.test.mock.Mockable[AccountObserver] = ((mock: _root_.zio.test.mock.Mock) => {
// final class $anon extends AccountObserver {
// def <init>() = {
// super.<init>();
// ()
// };
// val accountObserver = {
// final class $anon extends Service[Any] {
// def <init>() = {
// super.<init>();
// ()
// };
// def processEvent(event: String): _root_.zio.IO[Nothing, Unit] = mock(Service.processEvent, event)
// };
// new $anon()
// }
// };
// new $anon()
// });
// object $greater extends Service[AccountObserver] {
// def <init>() = {
// super.<init>();
// ()
// };
// def processEvent(event: String): _root_.zio.IO[Nothing, Unit] = _root_.zio.ZIO.accessM(<empty> match {
// case (env @ (_: AccountObserver)) => env.accountObserver.processEvent(event)
// })
// }
// };
// ()
//}
Создать файлы IntelliJ
mill mill.scalalib.GenIdea/idea
а затем откройте проект в IntelliJ (не импортируйте его).
Теперь Ctrl+Shift+F9 компилирует проект (аналогично описанному выше).
Вы можете использовать, например, ссылку на объект AccountObserver.Service
(это компилируется). Конечно, IntelliJ выделяетService
красным, но это не имеет значения.