Sbt 类型与涉及scala.xml.Elem的Binding.scala不匹配

Sbt 类型与涉及scala.xml.Elem的Binding.scala不匹配,sbt,scala.js,binding.scala,Sbt,Scala.js,Binding.scala,我没有编译一个简单的Binding.scala的例子,作为一个新手,我没有直觉知道如何修复它。也许自述有点过时了?上的示例甚至更旧,会导致弃用警告 我的代码基本上是从自述文件中拼凑起来的,甚至简化了一点: import com.thoughtworks.binding.dom import org.scalajs.dom.document import scala.scalajs.js.annotation.JSExport @JSExport object SampleMain { @

我没有编译一个简单的Binding.scala的例子,作为一个新手,我没有直觉知道如何修复它。也许自述有点过时了?上的示例甚至更旧,会导致弃用警告

我的代码基本上是从自述文件中拼凑起来的,甚至简化了一点:

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

}
我怀疑类型推断有问题,并尝试了以下类型注释:
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]      ^
SampleMain.scala:11:6:类型不匹配;
找到[错误]:scala.xml.Elem
[错误]必需:com.thoughtworks.binding.binding[org.scalajs.dom.html.Table]
[错误](扩展为)com.thoughtworks.binding.binding[org.scalajs.dom.raw.HTMLTableElement]
[错误]
[错误]^
我希望你能解释一下这里出了什么问题



解决方案:

检查您是否已将其添加到您的
build.sbt

addCompilerPlugin(“org.scalamacros”%“paradise”%“2.1.0”cross CrossVersion.full)
如果没有此插件,
Binding.scala
(将scala XML文本转换为特殊的
Binding
类型)的主宏无法工作,编译器只能看到原始类型(
scala.XML.Elem


这在自述文件的
步骤1
中提到。

应该有一条错误消息,要求您启用
paradise
编译器插件。不幸的是,由于您使用的是Scala 2.10,因此无法看到错误消息

因此,长话短说的答案是:

  • 将Scala升级到2.11或2.12,方法是在
    build.sbt
    中设置类似于
    scalaVersion的东西,在这个构建中:=“2.12.8”
  • 您将看到一条错误消息,要求您添加
    paradise
    插件
  • 最后,根据错误消息在
    build.sbt
    中添加以下设置:

  • 原来问题是在我的例子中没有使用
    paradise
    编译器插件。我只在子项目中使用Binding.scala构建SBT多项目,而
    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)
    

    在此之前,我在
    build.sbt
    的顶层添加了
    addCompilerPlugin
    ,但它不起作用,导致了编译错误。

    感谢您将我推向正确的方向!我的构建有点复杂,我确实(尝试)配置了编译器插件,但它不正确(参见我自己的答案)。您的见解确实帮助我理解了这个问题。实际上,我正在使用Scala 2.12,但没有看到有用的错误消息。可能是因为我使用的是SBT多项目构建?无论如何,编译器插件是我需要的提示,我修复了SBT中的一个错误配置(参见我的答案)。谢谢
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
    
    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)