Поиск по типу

Language
Info: JavaScript is currently disabled, code tabs will still work, but preferences will not be remembered.

Поиск функций по их символическим именам может занять много времени. Именно поэтому новый scaladoc позволяет искать методы и поля по их типам.

Рассмотрим следующее определение метода расширения:

extension [T](arr: IArray[T]) def span(p: T => Boolean): (IArray[T], IArray[T]) = ...

Вместо поиска span также можно искать по IArray[A] => (A => Boolean) => (IArray[A], IArray[A]).

Чтобы использовать эту функцию, введите сигнатуру искомого элемента в строке поиска scaladoc. Вот как это работает:

Эта функция предоставляется поисковой системой Inkuire, которая работает для Scala 3 и Kotlin. Чтобы быть в курсе развития этой функции, следите за репозиторием Inkuire.

Примеры запросов

Некоторые примеры запросов с предполагаемыми результатами:

  • List[Int] => (Int => Long) => List[Long] -> map
  • Seq[A] => (A => B) => Seq[B] -> map
  • (A, B) => A -> _1
  • Set[Long] => Long => Boolean -> contains
  • Int => Long => Int -> const
  • String => Int => Char -> apply
  • (Int & Float) => (String | Double) -> toDouble, toString
  • F[A] => Int -> length

Синтаксис запроса

Для того чтобы запрос панели поиска scaladoc выполнялся с использованием Inkuire вместо поисковой системы по умолчанию, запрос должен содержать последовательность символов =>.

Принятый ввод аналогичен сигнатуре каррированной функции в Scala 3. С некоторыми отличиями:

  • AndTypes, OrTypes и Functions должны быть заключены в круглые скобки, например, (Int & Any) => String
  • поля и методы без параметров можно найти, указав перед их типом =>, например, => Int
  • Можно использовать подстановочный знак _, чтобы указать, что необходимо сопоставить любой тип в данном месте, например, Long => Double => _
  • Типы в виде одной буквы, например A, или буквы с цифрой X1, автоматически считаются переменными типа.
  • Другие переменные типа могут быть объявлены так же, как и в полиморфных функциях, например [AVariable, AlsoAVariable] => AVariable => AlsoAVariable => AVariable

Работа с псевдонимами типов и приемниками методов

Когда дело доходит до того, как код сопоставляется с записями InkuireDb, есть некоторые преобразования, чтобы сделать движок более самостоятельным (хотя и открытым для предложений и изменений). Во-первых, получатель (не владелец модуля) функции может рассматриваться как первый аргумент. Также применяется автоматическое каррирование, чтобы результаты не зависели от списков аргументов. При поиске совпадений val и def не различаются.

Итак, по запросу Num => Int => Int => Int должны быть найдены следующие объявления:

class Num():
 def a(i: Int, j: Int): Int
 def b(i: Int)(j: Int): Int
 def c(i: Int): (Int => Int)
 val d: Int => Int => Int
 val e: Int => Int => Int
 val f: (Int, Int) => Int
end Num
def g(i: Num, j: Int, k: Int): Int
extension (i: Num) def h(j: Int, k: Int): Int
def i(i: Num, j: Int)(k: Int): Int
extension (i: Num) def j(j: Int)(k: Int): Int
...

Когда дело доходит до псевдонимов типов, они дешугаризуются как в объявлении, так и в подписи запроса. Это означает, что для объявлений:

type Name = String
def fromName(name: Name): String
def fromString(str: String): Name

оба метода fromName и fromString, должны быть найдены по запросам Name => Name, String => String, Name => String и String => Name.

Как это работает

Inkuire работает как рабочий JavaScript в браузере благодаря мощи ScalaJS.

Чтобы включить Inkuire при запуске scaladoc, добавьте флаг -Ygenerate-inkuire. При добавлении этого флага создаются два файла:

  • inkuire-db.json - это файл, содержащий все доступные для поиска объявления из текущего документированного проекта в формате, читаемом поисковой системой Inkuire.
  • inkuire-config.json - этот файл содержит расположение файлов базы данных, которые должны быть доступны для поиска в документации текущего проекта. По умолчанию он будет сгенерирован с расположением локального файла базы данных, а также с подразумеваемыми по умолчанию расположениями файлов базы данных во внешних сопоставлениях -external-mappings.

Contributors to this page:

AltStyle によって変換されたページ (->オリジナル) /