Member is considered deprecated if it overrides only deprecated members

Property accessor is considered deprecated when the property is
Provide IDE inspection to strikeout members overriding deprecated members (like in java)
This commit is contained in:
Pavel V. Talanov
2016-01-12 19:28:22 +03:00
parent 9b3d97470f
commit db07d783a2
14 changed files with 871 additions and 43 deletions
@@ -0,0 +1,5 @@
<html>
<body>
This inspection reports deprecated members being overridden.
</body>
</html>
+8
View File
@@ -1270,6 +1270,14 @@
level="WARNING"
/>
<localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.OverridingDeprecatedMemberInspection"
shortName="OverridingDeprecatedMember"
displayName="Overriding deprecated member"
groupName="Kotlin"
enabledByDefault="true"
level="WARNING"
/>
<localInspection implementationClass="org.jetbrains.kotlin.idea.kdoc.KDocUnresolvedReferenceInspection"
displayName="Unresolved reference in KDoc"
groupName="Kotlin"
@@ -0,0 +1,58 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtPropertyAccessor
import org.jetbrains.kotlin.psi.KtVisitorVoid
import org.jetbrains.kotlin.resolve.deprecatedByOverriddenMessage
import org.jetbrains.kotlin.resolve.getDeprecation
class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object : KtVisitorVoid() {
override fun visitNamedDeclaration(declaration: KtNamedDeclaration) {
registerProblemIfNeeded(declaration, declaration.nameIdentifier ?: return)
}
override fun visitPropertyAccessor(accessor: KtPropertyAccessor) {
registerProblemIfNeeded(accessor, accessor.namePlaceholder)
}
private fun registerProblemIfNeeded(declaration: KtDeclaration, targetForProblem: PsiElement) {
val accessorDescriptor = declaration.resolveToDescriptor() as? CallableMemberDescriptor ?: return
val message = accessorDescriptor.getDeprecation()?.deprecatedByOverriddenMessage() ?: return
val problem = holder.manager.createProblemDescriptor(
targetForProblem,
message,
/* showTooltip = */ true,
ProblemHighlightType.LIKE_DEPRECATED,
isOnTheFly
)
holder.registerProblem(problem)
}
}
}
}
@@ -0,0 +1,62 @@
<problems>
<problem>
<file>test.kt</file>
<line>15</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt"/>
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>20</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt"/>
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>25</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt"/>
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>31</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>32</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>30</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
<problem>
<file>test.kt</file>
<line>39</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/test.kt" />
<problem_class severity="WARNING" attribute_key="DEPRECATED_ATTRIBUTES">Overriding deprecated member</problem_class>
<description>Overrides deprecated member in 'foo.I'</description>
</problem>
</problems>
@@ -0,0 +1 @@
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.OverridingDeprecatedMemberInspection
@@ -0,0 +1,47 @@
package foo
interface I {
@Deprecated("")
fun f(): Int
@Deprecated("")
var p: Int
var i: Int
@Deprecated("") set
}
interface II : I {
override fun f(): Int {
}
}
interface III : I {
override fun f(): Int {
}
}
class C : I {
override fun f(): Int {
}
}
interface IP : I {
override var p: Int
get() = throw UnsupportedOperationException()
set(value) {
}
}
interface IA : I {
override var i: Int
get() = throw UnsupportedOperationException()
set(value) {
}
}
interface Explicit : I {
@Deprecated("a")
override fun f(): Int {
}
}
@@ -118,6 +118,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest {
doTest(fileName);
}
@TestMetadata("overridingDeprecatedMember/inspectionData/inspections.test")
public void testOverridingDeprecatedMember_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/overridingDeprecatedMember/inspectionData/inspections.test");
doTest(fileName);
}
@TestMetadata("redundantSamConstructor/inspectionData/inspections.test")
public void testRedundantSamConstructor_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/redundantSamConstructor/inspectionData/inspections.test");