Fix false positive in class literal #KT-16338 Fixed
This commit is contained in:
committed by
Mikhail Glukhikh
parent
6cd13341ee
commit
65f23f3c4e
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.quickfix.AddModifierFix
|
|||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.LEAKING_THIS
|
import org.jetbrains.kotlin.resolve.BindingContext.LEAKING_THIS
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ class LeakingThisInspection : AbstractKotlinInspection() {
|
|||||||
if (leakingThisDescriptor.classOrObject != klass) continue@these
|
if (leakingThisDescriptor.classOrObject != klass) continue@these
|
||||||
val description = when (leakingThisDescriptor) {
|
val description = when (leakingThisDescriptor) {
|
||||||
is NonFinalClass ->
|
is NonFinalClass ->
|
||||||
if (expression is KtThisExpression)
|
if (expression is KtThisExpression && expression.getStrictParentOfType<KtClassLiteralExpression>() == null)
|
||||||
"Leaking 'this' in constructor of non-final class ${leakingThisDescriptor.klass.name}"
|
"Leaking 'this' in constructor of non-final class ${leakingThisDescriptor.klass.name}"
|
||||||
else
|
else
|
||||||
continue@these // Not supported yet
|
continue@these // Not supported yet
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// PROBLEM: none
|
||||||
|
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
open class Foo {
|
||||||
|
init {
|
||||||
|
test(<caret>this::class)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun test(c: KClass<out Foo>) {
|
||||||
|
// println(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
class Bar : Foo()
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
Foo()
|
||||||
|
Bar()
|
||||||
|
}
|
||||||
+5
@@ -2587,6 +2587,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/leakingThis"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/leakingThis"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inClassLiteral.kt")
|
||||||
|
public void testInClassLiteral() throws Exception {
|
||||||
|
runTest("idea/testData/inspectionsLocal/leakingThis/inClassLiteral.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noOpenForInterface.kt")
|
@TestMetadata("noOpenForInterface.kt")
|
||||||
public void testNoOpenForInterface() throws Exception {
|
public void testNoOpenForInterface() throws Exception {
|
||||||
runTest("idea/testData/inspectionsLocal/leakingThis/noOpenForInterface.kt");
|
runTest("idea/testData/inspectionsLocal/leakingThis/noOpenForInterface.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user