Cats-tagless - ошибка аннотации макроса Scala

Я создал простой trait, используя cats-tagless lib:

@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {

  def put(element: Element): F[Element]

  def get(elementId: Id): F[Element]

  def all(): F[List[Element]]

  def delete(elementId: Id): F[Unit]
}

но когда я попытался его скомпилировать, у меня возникла ошибка:

Error:(8, 7) macro annotation could not be expanded (the most common reason for that is that you need to enable the macro paradise plugin; another possibility is that you try to use macro annotation in the same compilation run that defines it)

Я также добавил addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full) в plugins.sbt файл и build.sbt, но это не помогло. Вы можете помочь мне решить эту проблему?

Мой build.sbt файл выглядит так:

addCompilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11").cross(CrossVersion.full))

lazy val commonSettings = Seq(
  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % CatsVersion,
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
  )
)

person Developus    schedule 14.04.2019    source источник
comment
Что такое CatsVersion?   -  person Andrey Tyukin    schedule 14.04.2019
comment
в настоящее время 1.6.0   -  person Developus    schedule 14.04.2019
comment
Да, я использую его в модуле algebra, где я создал службу trait. Используйте это так lazy val algebra = (project in file("algebra")) .settings(commonSettings)   -  person Developus    schedule 14.04.2019


Ответы (1)


В пустом новом проекте с этим build.sbt:

scalaVersion := "2.12.8"

libraryDependencies ++= Seq(
  "org.typelevel" %% "cats-tagless-macros" % "0.5",
  "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5"
)

addCompilerPlugin(
  "org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full
)

этот код:

import cats.tagless._

case class Element()
case class Id()

@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {
  def put(element: Element): F[Element]
  def get(elementId: Id): F[Element]
  def all(): F[List[Element]]
  def delete(elementId: Id): F[Unit]
}

компилируется нормально, как рекламируется здесь.

Если я удалю addCompilerPlugin("org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full), я получаю такое же сообщение об ошибке:

не удалось развернуть аннотацию макроса (наиболее частая причина в том, что вам нужно включить плагин macro paradise; другая возможность состоит в том, что вы пытаетесь использовать аннотацию макроса в том же прогоне компиляции, который ее определяет)

Опять же, это как задокументировано, на связанной странице говорится:

Аннотации макросов (@finalAlg, @autoFunctorK, @autoInvariantK и т. Д.) По-прежнему зависят от scalameta, поэтому вам нужно добавить зависимости scalameta в build.sbt.

Так что вроде нужно из-за @finalAlg и @autoFunctorK.

Обратите внимание, что я ничего не менял в project/.


ИЗМЕНИТЬ

Если у вас несколько подпроектов, вы должны добавить плагин компилятора к подпроекту, который действительно в нем нуждается. Заметить, что

addCompilerPlugin(foobar)

по сути просто

libraryDependencies += compilerPlugin(foobar)

поэтому в вашем случае вам, вероятно, следует попробовать что-то вроде

  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % "1.6.0",
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
    compilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11")
      .cross(CrossVersion.full))
  )

а затем добавьте это в свой подпроект algebra.

person Andrey Tyukin    schedule 14.04.2019
comment
Я добавил addCompilerPlugin( ("org.scalameta" % "paradise" % "3.0.0-M11").cross(CrossVersion.full)), "org.typelevel" %% "cats-tagless-macros" % latestVersion и "org.typelevel" %% "cats-tagless-legacy-macros" % latestVersion в build.sbt, и это не помогло - person Developus; 14.04.2019
comment
@allocer В каком смысле не помогло? Есть тысячи вещей, которые могли пойти не так, это невозможно выяснить без надлежащего MCVE. - person Andrey Tyukin; 14.04.2019
comment
@allocer Я создал пример, воспроизводящий ошибку, затем показал build.sbt, который позволяет избежать ошибки. Если у вас есть другой пример, который не работает, вам придется его показать. - person Andrey Tyukin; 14.04.2019
comment
@allocer Мое последнее предположение: взгляните на правку, пожалуйста. Я предполагаю, что вы каким-то образом добавили плагин не в тот подпроект. - person Andrey Tyukin; 14.04.2019
comment
отлично, это помогло переместить compilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11")(CrossVersion.full)) в commonSettings. Спасибо - person Developus; 14.04.2019