fun buildDetailContext()

in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererRecommendationManager.kt [94:163]


    fun buildDetailContext(
        requestContext: RequestContext,
        userInput: String,
        recommendations: List<Completion>,
        requestId: String,
    ): List<DetailContext> {
        val seen = mutableSetOf<String>()
        return recommendations.map {
            val isDiscardedByUserInput = !it.content().startsWith(userInput) || it.content() == userInput
            if (isDiscardedByUserInput) {
                return@map DetailContext(
                    requestId,
                    it,
                    it,
                    isDiscarded = true,
                    isTruncatedOnRight = false,
                    rightOverlap = "",
                    getCompletionType(it)
                )
            }

            val overlap = findRightContextOverlap(requestContext, it)
            val overlapIndex = it.content().lastIndexOf(overlap)
            val truncatedContent =
                if (overlap.isNotEmpty() && overlapIndex >= 0) {
                    it.content().substring(0, overlapIndex)
                } else {
                    it.content()
                }
            val truncated = it.toBuilder()
                .content(truncatedContent)
                .build()
            val isDiscardedByUserInputForTruncated = !truncated.content().startsWith(userInput) || truncated.content() == userInput
            if (isDiscardedByUserInputForTruncated) {
                return@map DetailContext(
                    requestId,
                    it,
                    truncated,
                    isDiscarded = true,
                    isTruncatedOnRight = true,
                    rightOverlap = overlap,
                    getCompletionType(it)
                )
            }

            val isDiscardedByRightContextTruncationDedupe = !seen.add(truncated.content())
            val isDiscardedByBlankAfterTruncation = truncated.content().isBlank()
            if (isDiscardedByRightContextTruncationDedupe || isDiscardedByBlankAfterTruncation) {
                return@map DetailContext(
                    requestId,
                    it,
                    truncated,
                    isDiscarded = true,
                    truncated.content().length != it.content().length,
                    overlap,
                    getCompletionType(it)
                )
            }
            val reformatted = reformatReference(requestContext, truncated)
            DetailContext(
                requestId,
                it,
                reformatted,
                isDiscarded = false,
                truncated.content().length != it.content().length,
                overlap,
                getCompletionType(it)
            )
        }.toMutableList()
    }