[FE 1.0] Don't report UNUSED_* warnings on local properties with delegate

^KT-25527 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-05-13 11:39:13 +03:00
committed by teamcity
parent 4d5a4ccd6b
commit 89b1307e16
8 changed files with 127 additions and 2 deletions
@@ -5944,6 +5944,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unresolvedReference.kt");
}
@Test
@TestMetadata("unusedPropertyWithCustomAccessors.kt")
public void testUnusedPropertyWithCustomAccessors() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unusedPropertyWithCustomAccessors.kt");
}
@Test
@TestMetadata("useUninitializedInLambda.kt")
public void testUseUninitializedInLambda() throws Exception {
@@ -5944,6 +5944,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unresolvedReference.kt");
}
@Test
@TestMetadata("unusedPropertyWithCustomAccessors.kt")
public void testUnusedPropertyWithCustomAccessors() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unusedPropertyWithCustomAccessors.kt");
}
@Test
@TestMetadata("useUninitializedInLambda.kt")
public void testUseUninitializedInLambda() throws Exception {
@@ -5944,6 +5944,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unresolvedReference.kt");
}
@Test
@TestMetadata("unusedPropertyWithCustomAccessors.kt")
public void testUnusedPropertyWithCustomAccessors() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unusedPropertyWithCustomAccessors.kt");
}
@Test
@TestMetadata("useUninitializedInLambda.kt")
public void testUseUninitializedInLambda() throws Exception {
@@ -676,7 +676,9 @@ class ControlFlowInformationProviderImpl private constructor(
when (expressionInQuestion) {
is KtBinaryExpression -> if (expressionInQuestion.operationToken === KtTokens.EQ) {
expressionInQuestion.right?.let {
report(Errors.UNUSED_VALUE.on(expressionInQuestion, it, variableDescriptor), ctxt)
if (!variableDescriptor.isLocalVariableWithDelegate) {
report(Errors.UNUSED_VALUE.on(expressionInQuestion, it, variableDescriptor), ctxt)
}
}
}
is KtPostfixExpression -> {
@@ -689,6 +691,9 @@ class ControlFlowInformationProviderImpl private constructor(
}
}
private val VariableDescriptor.isLocalVariableWithDelegate: Boolean
get() = this is LocalVariableDescriptor && this.isDelegated
private fun processUnusedDeclaration(
element: KtNamedDeclaration,
variableDescriptor: VariableDescriptor,
@@ -710,7 +715,9 @@ class ControlFlowInformationProviderImpl private constructor(
processUnusedParameter(ctxt, element, variableDescriptor)
}
} else if (variableUseState === ONLY_WRITTEN_NEVER_READ && KtPsiUtil.isRemovableVariableDeclaration(element)) {
report(Errors.ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE.on(element, variableDescriptor), ctxt)
if (!variableDescriptor.isLocalVariableWithDelegate) {
report(Errors.ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE.on(element, variableDescriptor), ctxt)
}
} else if (variableUseState === WRITTEN_AFTER_READ && element is KtVariableDeclaration) {
when (element) {
is KtProperty ->
@@ -0,0 +1,40 @@
// ISSUE: KT-25527
import kotlin.reflect.KProperty
fun test_1(delegate: Delegate) {
var p1 by delegate
p1 = 10
var p2 by delegate
p2++
var p3 by delegate
++p3
}
fun test_2() {
var p1 = 0
p1 = 10
var p2: Int
p2 = 10
var p3 = 1
p3++
var p4 = 1
++p4
}
class Delegate {
var prop: Int = 0
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return prop
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
prop = value
}
}
@@ -0,0 +1,40 @@
// ISSUE: KT-25527
import kotlin.reflect.KProperty
fun test_1(delegate: Delegate) {
var p1 by delegate
p1 = 10
var p2 by delegate
<!UNUSED_CHANGED_VALUE!>p2++<!>
var p3 by delegate
++p3
}
fun test_2() {
var <!ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE!>p1<!> = 0
<!UNUSED_VALUE!>p1 =<!> 10
var <!ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE!>p2<!>: Int
<!UNUSED_VALUE!>p2 =<!> 10
var p3 = 1
<!UNUSED_CHANGED_VALUE!>p3++<!>
var p4 = 1
++p4
}
class Delegate {
var prop: Int = 0
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return prop
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
prop = value
}
}
@@ -0,0 +1,14 @@
package
public fun test_1(/*0*/ delegate: Delegate): kotlin.Unit
public fun test_2(): kotlin.Unit
public final class Delegate {
public constructor Delegate()
public final var prop: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final operator fun getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final operator fun setValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>, /*2*/ value: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -5950,6 +5950,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unresolvedReference.kt");
}
@Test
@TestMetadata("unusedPropertyWithCustomAccessors.kt")
public void testUnusedPropertyWithCustomAccessors() throws Exception {
runTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/unusedPropertyWithCustomAccessors.kt");
}
@Test
@TestMetadata("useUninitializedInLambda.kt")
public void testUseUninitializedInLambda() throws Exception {