in src/main/kotlin/jetbrains/buildServer/server/querylang/autocompl/AutoCompletion.kt [28:78]
fun complete(input: String): List<CompletionResult> {
val stream = CharStreams.fromString(input)
val lexer = QLangGrammarLexer(stream)
lexer.removeErrorListeners()
val tokens = CommonTokenStream(lexer)
val parserTree = QLangGrammarParser(tokens)
parserTree.removeErrorListeners()
val start = parserTree.start() ?: return emptyList()
if (start.children == null) {
return emptyList()
}
val treeFindNode = start.find()
val treePartNode = start.partialQuery()
//autocompletion
if (treeFindNode != null) {
//context autocompletion
if (input.last() == '?') {
val res = tryCompleteCollectorQuery(input)
if (res != null) {
return res.map { CompletionResult(input.dropLast(1) + it, it) }.sortedWith(compareBy({ it.show.length }, {it.show})).take(limit)
}
}
val autocomplContext = getFilterTrace(treeFindNode, input) ?: return emptyList()
if (autocomplContext is Trace) {
val (word, objectTypes, trace, completeModifier) = autocomplContext
return compl.suggest(input.dropLast(word.length), objectTypes, trace, word, completeModifier, limit)
}
//partial query autocompletion
if (autocomplContext is FinalCompletion) {
return autocomplContext.vars
}
return emptyList()
}
//suggest full queries for partial query
if (treePartNode != null) {
try {
val multipleQueries = parser.parse(input) as? PartialQuery ?: return emptyList()
return multipleQueries.fullQueries.map {it.createStr()}.map {CompletionResult(it, it)}
} catch (e: ParsingException) {
return completePartialQuery(input, treePartNode)
}
}
return emptyList()
}