在Intellij中找不到Scala 2.13和Mill项目中使用宏生成的源代码



我在Scala 2.13/Mill项目中使用zio宏。

这里的例子:

@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中,对自动生成代码的引用不会编译。

我必须配置一些东西还是缺少什么?

以下项目编译

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"
)
}

root/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,但这并不重要。

更新:这个答案没有解决这个问题。


这是mill 0.5.2及更早版本的IntelliJ IDEA项目生成器中的一个错误。自0.5.2-9-ea4f04以来的工厂版本将包含针对该特定问题的修复程序。(参考:#729、#728(

解决方法:在项目中添加一个包含该版本号的.mill-version文件(当然也可以是任何更新的版本号(,然后重新运行IDEA项目生成器。

$ echo -n "0.5.2-9-ea4f04" > .mill-version
$ mill mill.scalalib.GenIdea/idea

相关内容

  • 没有找到相关文章

最新更新