From e9fc058bd206b4307f8156443ed32405c1f9fdbb Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Mon, 3 Feb 2025 12:11:15 +0100 Subject: [PATCH] Migrate VerifiedServerHostnamesCheck to kotlin-analysis-api Co-authored-by: Marharyta Nedzelska Co-authored-by: Evgeny Mandrikov --- .../checks/VerifiedServerHostnamesCheck.kt | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/sonar-kotlin-checks/src/main/java/org/sonarsource/kotlin/checks/VerifiedServerHostnamesCheck.kt b/sonar-kotlin-checks/src/main/java/org/sonarsource/kotlin/checks/VerifiedServerHostnamesCheck.kt index 29f395dea..2fbab7952 100644 --- a/sonar-kotlin-checks/src/main/java/org/sonarsource/kotlin/checks/VerifiedServerHostnamesCheck.kt +++ b/sonar-kotlin-checks/src/main/java/org/sonarsource/kotlin/checks/VerifiedServerHostnamesCheck.kt @@ -16,19 +16,19 @@ */ package org.sonarsource.kotlin.checks +import org.jetbrains.kotlin.analysis.api.resolution.KaFunctionCall import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtReturnExpression -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.calls.util.getParentCall -import org.jetbrains.kotlin.resolve.calls.util.getType import org.sonar.check.Rule import org.sonarsource.kotlin.api.checks.AbstractCheck import org.sonarsource.kotlin.api.checks.FunMatcher +import org.sonarsource.kotlin.api.checks.getParentCall +import org.sonarsource.kotlin.api.checks.predictRuntimeBooleanValue import org.sonarsource.kotlin.api.frontend.KotlinFileContext +import org.sonarsource.kotlin.api.visiting.withKaSession -@org.sonarsource.kotlin.api.frontend.K1only @Rule(key = "S5527") class VerifiedServerHostnamesCheck : AbstractCheck() { @@ -47,21 +47,19 @@ class VerifiedServerHostnamesCheck : AbstractCheck() { } override fun visitNamedFunction(function: KtNamedFunction, kotlinFileContext: KotlinFileContext) { - val (_, _, bindingContext) = kotlinFileContext - if (VERIFY_MATCHER.matches(function, bindingContext)) { + if (VERIFY_MATCHER.matches(function)) { val listStatements = function.listStatements() - if (listStatements.size == 1 && onlyReturnsTrue(listStatements[0], bindingContext)) { + if (listStatements.size == 1 && onlyReturnsTrue(listStatements[0])) { kotlinFileContext.reportIssue(function.nameIdentifier!!, MESSAGE) } } } override fun visitLambdaExpression(expression: KtLambdaExpression, kotlinFileContext: KotlinFileContext) { - val (_, _, bindingContext) = kotlinFileContext - expression.getParentCall(bindingContext)?.let { - if (HOSTNAME_VERIFIER_MATCHER.matches(it, bindingContext)) { + (expression.getParentCall() as? KaFunctionCall<*>)?.let { + if (HOSTNAME_VERIFIER_MATCHER.matches(it)) { val listStatements = expression.bodyExpression?.statements - if (listStatements?.size == 1 && listStatements[0].isTrueConstant(bindingContext)) { + if (listStatements?.size == 1 && listStatements[0].isTrueConstant()) { kotlinFileContext.reportIssue(expression, MESSAGE) } } @@ -70,16 +68,13 @@ class VerifiedServerHostnamesCheck : AbstractCheck() { private fun onlyReturnsTrue( ktExpression: KtExpression, - bindingContext: BindingContext, ): Boolean = when (ktExpression) { is KtReturnExpression -> - ktExpression.returnedExpression?.isTrueConstant(bindingContext) ?: false + ktExpression.returnedExpression?.isTrueConstant() ?: false else -> false } - private fun KtExpression.isTrueConstant( - bindingContext: BindingContext, - ) = getType(bindingContext)?.let { - bindingContext[BindingContext.COMPILE_TIME_VALUE, this]?.getValue(it) == true - } ?: false + private fun KtExpression.isTrueConstant() = withKaSession { + predictRuntimeBooleanValue() ?: false + } }