fun suggest()

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)
    }