Scala Воспроизвести 2.8 Тип FieldConstructor и IntelliJ: не удается разрешить символ f - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь написать свой собственный конструктор настраиваемых полей, используя документацию для Play 2.8.

Следуя документации, я создал этот идентичный пример конструктора:

@(elements: helper.FieldElements)

<div class="@if(elements.hasErrors) {error}">
    <label for="@elements.id">@elements.label</label>
    <div class="input">
        @elements.input
        <span class="errors">@elements.errors.mkString(", ")</span>
        <span class="help">@elements.infos.mkString(", ")</span>
    </div>
</div>

Я назвал его app/views/myFieldConstructor.scala.html. (Ранее я пытался назвать его myFieldConstructor.f; документация play здесь не очень хорошая.)

Затем в другом месте я создал scala объект с именем app/forms/auth/AuthFieldConstructor:

package forms.auth

import views.html

object AuthFieldConstructor {
  import views.html.helper.FieldConstructor
  implicit val myFields: FieldConstructor = FieldConstructor(html.myFieldConstructor.f)
}

Моя IDE жалуется на то, что f не может быть найден, а также выводит тип html.myFieldConstructor как myFieldConstructor.type.

Я я могу @import forms.auth.AuthFieldConstructor._ в другом шаблоны, и код компилируется, и форма формируется, но меня беспокоит, что моя IDE неправильно выводит это.

Изучив его немного подробнее, этот код все еще компилируется, но f все еще не распознан :

object AuthFieldConstructor {
  import views.html.helper.FieldConstructor
  val fieldConstructor: myFieldConstructor.type = html.myFieldConstructor
  implicit val myFields: FieldConstructor = FieldConstructor(fieldConstructor.f)
}

Раньше я встречал .type, когда забывал применить объект, но добавление apply или () здесь не помогает. Есть идеи, как заставить мою IDE распознавать, что здесь происходит?

У меня отключен сервер компиляции Scala. Я использую оболочку sbt как для перезагрузки проекта, так и для сборки. У меня установлен флажок "Использовать компилятор Play 2 для этого проекта". Scala 2.13.3, сбт 1.3.13, играть 2.8.2.

1 Ответ

0 голосов
/ 04 августа 2020

Я не совсем уверен в ответе на странность вывода типов, но мне удалось заставить IDE перестать жаловаться, сначала взяв подсказку из этого старого PR , чтобы изменить scala код объекта для помощника конструктора поля:

  implicit val authFieldConstructor = new FieldConstructor {
    override def apply(elements: FieldElements): Html = myFieldConstructor(elements)
  }

Пару преобразований IDE позже, и я закончил с очистителем:

  implicit val authFieldConstructor: FieldConstructor = (elements: FieldElements) => myFieldConstructor(elements)
...