Fix build for Kotlin 2.2.0

This commit is contained in:
Chris Smowton
2025-04-28 14:23:19 +01:00
parent 24feb51661
commit a36fc30d44
16 changed files with 75 additions and 20 deletions

View File

@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
import org.jetbrains.kotlin.ir.builders.declarations.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunction
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.*
@@ -1619,9 +1618,7 @@ open class KotlinFileExtractor(
// (NB. kotlinc's actual implementation strategy is different -- it makes an inner class
// called InterfaceWithDefault$DefaultImpls and stores the default methods
// there to allow default method usage in Java < 8, but this is hopefully niche.
!jvmDefaultModeEnabledIsEnabled(
pluginContext.languageVersionSettings
.getFlag(JvmAnalysisFlags.jvmDefaultMode)) &&
!jvmDefaultModeEnabledIsEnabled(getJvmDefaultMode(pluginContext.languageVersionSettings)) &&
f.parentClassOrNull.let {
it != null &&
it.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB &&
@@ -6011,11 +6008,7 @@ open class KotlinFileExtractor(
is IrGetValue -> {
val exprParent = parent.expr(e, callable)
val owner = e.symbol.owner
if (
owner is IrValueParameter &&
owner.index == -1 &&
!owner.isExtensionReceiver()
) {
if (owner is IrValueParameter && isDispatchReceiver(owner)) {
extractThisAccess(e, owner.parent, exprParent, callable)
} else {
val isAnnotationClassParameter =
@@ -6966,11 +6959,6 @@ open class KotlinFileExtractor(
}
}
private fun IrValueParameter.isExtensionReceiver(): Boolean {
val parentFun = parent as? IrFunction ?: return false
return parentFun.extensionReceiverParameter == this
}
private open inner class GeneratedClassHelper(
protected val locId: Label<DbLocation>,
protected val ids: GeneratedClassLabels

View File

@@ -2136,7 +2136,7 @@ open class KotlinUsesExtractor(
}
val parentId = parent ?: overriddenParentAttributes?.id ?: useDeclarationParentOf(vp, false)
val idxBase = overriddenParentAttributes?.valueParameters?.indexOf(vp) ?: vp.index
val idxBase = overriddenParentAttributes?.valueParameters?.indexOf(vp) ?: parameterIndexExcludingReceivers(vp)
val idxOffset =
if (
declarationParent is IrFunction &&

View File

@@ -2,12 +2,18 @@ package com.github.codeql.comments
import com.github.codeql.*
import com.github.codeql.utils.isLocalFunction
import com.github.codeql.utils.versions.isDispatchReceiver
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.util.parentClassOrNull
private fun IrValueParameter.isExtensionReceiver(): Boolean {
val parentFun = parent as? IrFunction ?: return false
return parentFun.extensionReceiverParameter == this
}
open class CommentExtractor(
protected val fileExtractor: KotlinFileExtractor,
protected val file: IrFile,
@@ -19,7 +25,7 @@ open class CommentExtractor(
protected fun getLabel(element: IrElement): Label<out DbTop>? {
if (element == file) return fileLabel
if (element is IrValueParameter && element.index == -1) {
if (element is IrValueParameter && (isDispatchReceiver(element) || element.isExtensionReceiver())) {
// Don't attribute comments to the implicit `this` parameter of a function.
return null
}

View File

@@ -1,17 +1,17 @@
package com.github.codeql.utils
import com.github.codeql.utils.versions.IrVisitor
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.isFakeOverride
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrVisitorLookup(
private val psi2Ir: Psi2IrFacade,
private val psi: PsiElement,
private val file: IrFile
) : IrElementVisitor<Unit, MutableCollection<IrElement>> {
) : IrVisitor<Unit, MutableCollection<IrElement>>() {
private val location = psi.getLocation()
override fun visitElement(element: IrElement, data: MutableCollection<IrElement>): Unit {

View File

@@ -0,0 +1,3 @@
package com.github.codeql.utils.versions
typealias IrLazyFunction = org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunction

View File

@@ -0,0 +1,4 @@
package com.github.codeql.utils.versions
abstract class IrVisitor<R, D> : org.jetbrains.kotlin.ir.visitors.IrElementVisitor<R, D>
abstract class IrVisitorVoid : org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid

View File

@@ -0,0 +1,7 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.config.LanguageVersionSettings
fun getJvmDefaultMode(lvs: LanguageVersionSettings) =
lvs.getFlag(JvmAnalysisFlags.jvmDefaultMode)

View File

@@ -0,0 +1,6 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
fun isDispatchReceiver(p: IrValueParameter) = p.index == -1 && p != (p.parent as? IrFunction)?.extensionReceiverParameter

View File

@@ -0,0 +1,5 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
fun parameterIndexExcludingReceivers(vp: IrValueParameter) = vp.index

View File

@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
@@ -43,7 +42,7 @@ class CommentExtractorLighterAST(
val kDocOwners = mutableMapOf<Int, MutableList<IrElement>>()
val visitor =
object : IrElementVisitorVoid {
object : IrVisitorVoid() {
override fun visitElement(element: IrElement) {
val metadata = (element as? IrMetadataSourceOwner)?.metadata
val sourceElement = (metadata as? FirMetadataSource)?.fir?.source

View File

@@ -0,0 +1,3 @@
package com.github.codeql.utils.versions
typealias IrLazyFunction = org.jetbrains.kotlin.psi2ir.lazy.IrLazyFunction

View File

@@ -0,0 +1,4 @@
package com.github.codeql.utils.versions
typealias IrVisitor<R, D> = org.jetbrains.kotlin.ir.visitors.IrVisitor<R, D>
typealias IrVisitorVoid = org.jetbrains.kotlin.ir.visitors.IrVisitorVoid

View File

@@ -0,0 +1,7 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.util.createThisReceiverParameter
fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() =
this.createThisReceiverParameter()

View File

@@ -0,0 +1,7 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.jvmDefaultMode
fun getJvmDefaultMode(lvs: LanguageVersionSettings) =
lvs.jvmDefaultMode

View File

@@ -0,0 +1,6 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.IrParameterKind
fun isDispatchReceiver(p: IrValueParameter) = p.kind == IrParameterKind.DispatchReceiver

View File

@@ -0,0 +1,10 @@
package com.github.codeql.utils.versions
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
fun parameterIndexExcludingReceivers(vp: IrValueParameter): Int {
val offset =
(vp.parent as? IrFunction)?.let { (if (it.extensionReceiverParameter != null) 1 else 0) + (if (it.dispatchReceiverParameter != null) 1 else 0) } ?: 0
return vp.indexInParameters - offset
}