Поиск по типу
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
.