Detect recursive property accessors #KT-17221 Fixed

This commit is contained in:
Dmitry Neverov
2017-05-12 06:02:57 +02:00
committed by Mikhail Glukhikh
parent 20f5023c48
commit 3b4dafe691
12 changed files with 376 additions and 0 deletions
@@ -0,0 +1,27 @@
class A {
var x = 0
set(value) {
<lineMarker descr="Recursive call">x</lineMarker>++
<lineMarker descr="Recursive call">x</lineMarker>+=1
<lineMarker descr="Recursive call">x</lineMarker> = value
}
var y = 0
get() {
println("$<lineMarker descr="Recursive call">y</lineMarker>")
<lineMarker descr="Recursive call">y</lineMarker>++
<lineMarker descr="Recursive call">y</lineMarker> += 1
return <lineMarker descr="Recursive call">y</lineMarker>
}
var z = 0
get() = <lineMarker descr="Recursive call">z</lineMarker>
var field = 0
get() {
return if (field != 0) field else -1
}
set(value) {
if (value >= 0) field = value
}
}
@@ -0,0 +1,7 @@
package a;
public interface JavaInterface {
String getSomething();
void setSomething(String value);
}
@@ -0,0 +1,119 @@
<problems>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>4</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>5</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>6</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>11</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>12</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>13</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>14</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>18</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursiveSyntheticPropertyAccessor.kt</file>
<line>9</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/recursiveSyntheticPropertyAccessor.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive synthetic property accessor</description>
</problem>
<problem>
<file>recursiveSyntheticPropertyAccessor.kt</file>
<line>14</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/recursiveSyntheticPropertyAccessor.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive synthetic property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>27</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>31</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
<problem>
<file>recursivePropertyAccessors.kt</file>
<line>38</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/recursivePropertyAccessors.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Recursive property accessor</problem_class>
<description>Recursive property accessor</description>
</problem>
</problems>
@@ -0,0 +1 @@
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.RecursivePropertyAccessorInspection
@@ -0,0 +1,41 @@
class A {
var x = 0
set(value) {
x++
x += 1
x = value
}
var y = 0
get() {
println("$y")
y++
y += 1
return y
}
var z = 0
get() = z
var w
set(value) {
field = w + value
}
var field = 0
get() {
this.field
return if (field != 0) field else -1
}
set(value) {
this.field = value
if (value >= 0) field = value
}
companion object {
var g = 0
set(value) {
A.g = 99
}
}
}
@@ -0,0 +1,17 @@
import a.JavaInterface
class B {
var something: String = "123"
class Nested : JavaInterface {
override fun setSomething(value: String) {
val x = something // OK
something = value
}
override fun getSomething(): String {
something = "456" // OK
return something
}
}
}