Ошибки ScalaJS fullLinkJS

Несколько недель назад я обновил свой проект Play+ScalaJS с ScalaJS 0.6.32 до 1.4.0. В разработке все работает нормально. Сегодня я попытался развернуть его и, таким образом, выполнил fullLinkJSв первый раз. Выдал ряд ошибок:

      sbt:browser> fullLinkJS
[info] Full optimizing /Users/bwbecker/oat/src/oat3/_browser/target/scala-2.12/browser-opt
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/BMailCreateView.scala(125:43:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/components/filteredTable/FilteredBMailTable.scala(81:53:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/models/Autocomplete.scala(156:18:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/virtualq/QueueAddEditView.scala(90:52:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/edit/BMailSendView.scala(273:62:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/TemplateListView.scala(42:64:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
...

Я просмотрел около дюжины строк, на которые есть ссылки в исходном коде. Большинство из них ссылаются либо на маршрут Play, либо вызывают метод. Остальные из них связаны с обращением к jQuery.

У проекта есть кроссплатформенный подпроект. Тот отлично справляется с fullLinkJS. Существует также клиентский проект ScalaJS. Вот и случаются ошибки.

Я использую ScalaJS 1.4.0 и Play 2.6.25.

Предложения о том, как действовать?

Позже, прочитав ответ от @sjrd

Пример оскорбительного кода:

      private val wapp = routes.oat.wapp.controllers.BMailCtrl
...
window.location.href = wapp.edit(emailId).url // this is the line flagged with the error

windowопределяется в org.scalajs.domкак .

routesопределяется в моем коде как val routes: js.Dynamic = global.jsRoutes. Аннотация типа — это то, что выводится IntelliJ.

Ага! globalопределяется в scala.scalajs.jsкак расширение scala.Dynamic. Но я верю, jsRoutesследует интерпретировать как . Это маршруты, созданные сервером Play.

Похоже, мне нужно изменить способ доступа к этим парням. Изучаю , в частности, Scala.js GlobalScope.

Еще позже - исправление

Я записываю здесь то, что я сделал, чтобы пометить ответ sjrd как «ответ».

Как уже отмечалось, большинство моих ошибок проверки IR были в строках формы

      window.location.href = wapp.edit(emailId).url

hrefимеет тип Stringа также urlявляется js.Dynamicно выдает строку. Думаю в этом и проблема.

Решение, однако, было простым: добавить toString:

      window.location.href = wapp.edit(emailId).url.toString

Все остальные ошибки проверки IR были вариантами этой с аналогичным исправлением.

1 ответ

Ошибки, которые вы видите, являются «ошибками проверки IR». Они означают наличие несоответствий в .sjsirфайлы, созданные компилятором. По умолчанию они проверяются только на fullOptзадания, именно поэтому вы их раньше не видели. Однако это не означает, что IR более действителен для fastOpt(это тот же ИК!), так что ошибка была всегда (скрытая), но всплывает только сейчас. Наличие ошибок проверки IR означает, что оптимизатор или просто генератор кода JavaScript может выдавать бессмысленные результаты.

(Ошибки проверки IR также аналогичныVerifyErrorс на JVM.

Вообще говоря, есть 3 источника ошибок проверки IR:

  • Использование бинарных несовместимых версий транзитивных библиотек в некоторых редких случаях может привести к ошибкам проверки IR, даже если ошибки компоновки не возникает.
  • Ошибки в основной цепочке инструментов Scala.js (компилятор, компоновщик)
  • Конкретно известная (и отчасти преднамеренная) проблема ненадежности в системе типов Scala.js: js.Dynamic <: scala.Dynamic вызывает ненадежность в IR.

То, что вы испытываете, является последней проблемой. Это довольно редко. В основном это происходит, если вы назначаете (через =или передача аргумента функции и т. д.) значение типа в значение типа . Например:

      val jsDyn = js.Dynamic.literal(foo = "bar")
val scalaDyn: scala.Dynamic = jsDyn

Средство проверки типов принимает этот фрагмент, потому что во время компиляции расширяет . Это необходимо в первую очередь для того, чтобы раскрыть его динамизм, поэтому мы не можем этого изменить. Однако во время компоновки и выполнения это тип JavaScript (поскольку он расширяет js.Any) и является типом Scala, а типы JavaScript никогда не являются подтипами типов Scala.


Итак, где это оставляет вас?

Посмотрите на код, указанный в сообщениях об ошибках. Вам нужно будет определить место, где (или любой другой тип JS, который расширяет , но js.Dynamicобычно единственный такой) присваивается .

Крайне редко пишут (или просто Dynamic) как тип вручную (и это, вероятно, всегда является ошибкой), но может случиться так, что компилятор выведет его, например, если у вас есть две ветви if/else, которые возвращают два разных подтипа scala.Dynamic.

Это все, что я могу сказать, не видя проблемного фрагмента кода.

Другие вопросы по тегам