Несоответствие типов с Binding.scala, включая scala.xml.Elem - PullRequest
2 голосов
/ 12 марта 2019

Я не могу скомпилировать простой пример Binding.scala , и, будучи новичком, я не знаю, как это исправить. Может быть, README немного устарел? Пример на https://github.com/ThoughtWorksInc/Binding.scala-sample еще старше и вызывает предупреждения об устаревании.

Мой код, который я в основном собрал из README, и даже немного упростил:

import com.thoughtworks.binding.dom
import org.scalajs.dom.document
import scala.scalajs.js.annotation.JSExport

@JSExport
object SampleMain {

  @dom
  def table = {
    <table border="1" cellPadding="5">
      <thead>
        <tr>
          <th>Name</th>
          <th>E-mail</th>
        </tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  }

  @JSExport
  def main(): Unit = {
    dom.render(document.body, table)
  }

}

fastOptJS вызывает ошибку компиляции:

SampleMain.scala:25:9: overloaded method value render with alternatives:
[error]   (parent: org.scalajs.dom.raw.Node,children: com.thoughtworks.binding.Binding[com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node]],dummy: Unit)Unit <and>
[error]   (parent: org.scalajs.dom.raw.Node,children: com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node])Unit <and>
[error]   (parent: org.scalajs.dom.raw.Node,child: com.thoughtworks.binding.Binding[org.scalajs.dom.raw.Node])Unit
[error]  cannot be applied to (org.scalajs.dom.raw.HTMLElement, scala.xml.Elem)
[error]     dom.render(document.body, table)
[error]         ^

Я подозревал проблему с выводом типа и пробовал эту аннотацию типа: def table: com.thoughtworks.binding.Binding[org.scalajs.dom.html.Table], но это вызвало еще одну ошибку:

SampleMain.scala:11:6: type mismatch;
[error]  found   : scala.xml.Elem
[error]  required: com.thoughtworks.binding.Binding[org.scalajs.dom.html.Table]
[error]     (which expands to)  com.thoughtworks.binding.Binding[org.scalajs.dom.raw.HTMLTableElement]
[error]     <table border="1" cellPadding="5">
[error]      ^

Буду признателен за объяснение, что здесь происходит не так.


Решение: https://stackoverflow.com/a/55137909/1862339

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

Оказывается, проблема была в том, что плагин компилятора paradise не был подобран в моем случае. Я создаю мультипроект SBT с Binding.scala только в подпроекте, а addCompilerPlugin не распространяется на подпроекты. Чтобы это работало, его нужно добавить в настройки подпроекта следующим образом:

lazy val client = (project in file("client"))
  .settings(
    libraryDependencies ++= Seq(
      "com.thoughtworks.binding" %%% "dom" % "11.6.0"
    ),
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
  )
  .enablePlugins(ScalaJSPlugin)

Раньше у меня было addCompilerPlugin на верхнем уровне build.sbt, которое не работало и вызывало ошибку компиляции.

2 голосов
/ 13 марта 2019

Должно появиться сообщение об ошибке, в котором вас попросят включить плагин компилятора paradise.К сожалению, поскольку вы используете Scala 2.10, ошибка в macro-compat не позволяет увидеть сообщение об ошибке.

Поэтому длинный ответ:

  1. ОбновлениеScala до 2.11 или 2.12, установив что-то вроде scalaVersion in ThisBuild := "2.12.8" в вашем build.sbt.
  2. Вы увидите сообщение об ошибке, в котором вас попросят добавить плагин paradise.
  3. Наконец, добавьте следующий параметр в build.sbt в соответствии с сообщением об ошибке:
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
2 голосов
/ 12 марта 2019

Убедитесь, что вы добавили это в build.sbt

addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)

Основной макрос Binding.scala (который переводит XML-литералы Scala в специальные Binding типы) не работает без этого плагина икомпилятор видит только исходные типы (scala.xml.Elem).

Это упоминается в Step 1 из README.

...