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

Я загружаю исходный код в компилятор с помощью askReload, а затем пытаюсь вызвать askTypeCompletion. (Точка). Завершение в первом случае (метод с 2 аргументами) не работает, но завершение в вызове метода с одним аргументом работает как ожидалось.

  val list = Seq(1,2)
  def add(x: Int, y: Int): Int = x + y
  def minusOne(x: Int) = x - 1


  add(list.<completion is not working)
  minusOne(list.<works fine>)

что интересно, если у меня есть код:

  implicit class OptionW[T](opt: Option[T]) {
    def cata[A](some: T => A, none: A) = opt.map(some) getOrElse none
  }


  Option("").cata(x => x.<not working>)

завершение после точки снова не работает, но если я набираю запятую после точки и затем пытаюсь снова завершить после точки, это работает: Option("").cata(x => x.<works!>,) Это какая-то ошибка или ожидаемое поведение?

1 ответ

Решение

Я прототипировал изменение в компиляторе, чтобы быть более отказоустойчивым из-за пропущенных аргументов.

https://github.com/retronym/scala/commit/c1460f50945a161599d6d454da355ee20aa402b2

Вместо того, чтобы просто выручить с ошибкой "недостаточно аргументов", мы также можем выполнить типовую проверку данных аргументов, если мы разрешили один (не перегруженный) метод. Нам нужно проверить тип аргумента x => x.... использование типа параметра в качестве ожидаемого типа для вывода типа параметра лямбда и, в свою очередь, для предложения дополнений.

Я подал это в качестве улучшения: https://issues.scala-lang.org/browse/SI-8739

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