in src/main/kotlin/jetbrains/buildServer/server/querylang/autocompl/Completer.kt [29:82]
fun suggest(
input: String,
objectTypes: List<String>?,
trace: List<String>,
word: String,
completeModifier: Boolean,
limit: Int
): List<CompletionResult> {
//complete object type name
if (objectTypes == null) {
return graph["root"]!!.map {it.first()}
.filterBegins(word)
.map {StringInfo(it, it.getShortDescription(listOf(emptyList())))}
.autocomplSort()
.toCompletionResult(input)
}
objectTypes.forEach {
if (!graph.contains(it)) throw IllegalStateException("Unkwnow type name $it")
}
val fullTrace = objectTypes.map {
listOf(it) + trace
}
//complete first level filter name (e.g `find project with par`)
if (trace.isEmpty()) {
if (objectTypes.isEmpty()) {
throw IllegalStateException("objectTypes shouldn't be empty")
}
return objectTypes.map {
graph[it]!!.map {it.first()}.toSet()
}.reduce{acc, s ->
acc.intersect(s)
}.toList()
.filterBegins(word)
.autocomplSort()
.toCompletionResult(input, true, fullTrace)
}
//some of the types doesn't contain first filter
if (!objectTypes.all {graph[it]!!.any {it.contains(trace.first())}}) {
return listOf()
}
//unite all variants
return objectTypes.flatMap { objType ->
getVariants(objType, trace, word, limit, completeModifier, fullTrace)
}.toSet()
.toList()
.take(limit)
.autocomplSort()
.toCompletionResult(input)
}