fun complete()

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