Merge pull request #9174 from tamasvajk/kotlin-fix-isUnspecialised

Kotlin: Fix parent class lookup from field initializers in `isUnspecialised`
This commit is contained in:
Tamás Vajk
2022-05-17 10:48:52 +02:00
committed by GitHub
3 changed files with 15 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ import com.github.codeql.KotlinUsesExtractor
import com.github.codeql.getJavaEquivalentClassId
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.common.lower.parents
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
fun IrType.substituteTypeArguments(params: List<IrTypeParameter>, arguments: List<IrTypeArgument>) =
when(this) {
@@ -219,12 +221,13 @@ fun isUnspecialised(paramsContainer: IrTypeParametersContainer, args: List<IrTyp
} ?: false
}
val remainingArgs = args.drop(paramsContainer.typeParameters.size)
val parent = paramsContainer.parent as? IrTypeParametersContainer
val parentClass = paramsContainer.parents.firstIsInstanceOrNull<IrClass>()
val parentUnspecialised = when {
remainingArgs.isEmpty() -> true
parent == null -> false
parent !is IrClass -> false
else -> isUnspecialised(paramsContainer.parentAsClass, remainingArgs)
parentClass == null -> false
else -> isUnspecialised(parentClass, remainingArgs)
}
return unspecialisedHere && parentUnspecialised
}

View File

@@ -0,0 +1,8 @@
import semmle.code.java.Diagnostics
from Diagnostic d
where d.getSeverity() > 2
select d, d.getGeneratedBy(), d.getSeverity(), d.getTag(), d.getMessage(),
d.getFullMessage()
.regexpReplaceAll("^\\[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} K\\] ",
"[DATE TIME K] ")