"Redundant qualifier name": fix false positive with inner class as constructor parameter for outer

#KT-33123 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-10-07 11:53:11 +09:00
committed by Dmitry Gridin
parent bc66834c3c
commit bdc04547cc
6 changed files with 54 additions and 0 deletions
@@ -9,6 +9,7 @@ import com.intellij.codeInspection.*
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.analysis.analyzeAsReplacement
import org.jetbrains.kotlin.idea.caches.resolve.analyze
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.compareDescriptors
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.idea.util.hasNotReceiver
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -128,6 +130,11 @@ private fun KtUserType.applicableExpression(context: BindingContext): KtUserType
val referenceExpression = referenceExpression as? KtNameReferenceExpression ?: return null
val originalDescriptor = referenceExpression.mainReference.resolveToDescriptors(context).firstOrNull() ?: return null
if (originalDescriptor is ClassDescriptor
&& originalDescriptor.isInner
&& (originalDescriptor.containingDeclaration as? ClassDescriptor)?.typeConstructor != null
) return null
val shortName = originalDescriptor.importableFqName?.shortName() ?: return null
val scope = referenceExpression.getResolutionScope(context) ?: return null
val descriptor = scope.findFirstClassifierWithDeprecationStatus(shortName, NoLookupLocation.FROM_IDE)?.descriptor ?: return null
@@ -0,0 +1,4 @@
// PROBLEM: none
class Outer<T>(val inner: <caret>Outer<T>.Inner? = null) {
inner class Inner
}
@@ -0,0 +1,8 @@
// PROBLEM: none
interface Inv<X>
class Outer<E> {
inner class Inner
class Nested : Inv<<caret>Outer<String>.Inner>
}
@@ -0,0 +1,8 @@
// PROBLEM: none
class Outer<E> {
inner class Inner
class Nested {
fun bar(x: <caret>Outer<String>.Inner) {}
}
}
@@ -0,0 +1,7 @@
// PROBLEM: none
class Outer<T>() {
inner class Inner
fun test(inner: <caret>Outer<T>.Inner?) {
}
}
@@ -8464,6 +8464,26 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableExpression4.kt");
}
@TestMetadata("notApplicableInnerClassInGenericOuterClass.kt")
public void testNotApplicableInnerClassInGenericOuterClass() throws Exception {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableInnerClassInGenericOuterClass.kt");
}
@TestMetadata("notApplicableInnerClassInGenericOuterClass2.kt")
public void testNotApplicableInnerClassInGenericOuterClass2() throws Exception {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableInnerClassInGenericOuterClass2.kt");
}
@TestMetadata("notApplicableInnerClassInGenericOuterClass3.kt")
public void testNotApplicableInnerClassInGenericOuterClass3() throws Exception {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableInnerClassInGenericOuterClass3.kt");
}
@TestMetadata("notApplicableInnerClassInGenericOuterClass4.kt")
public void testNotApplicableInnerClassInGenericOuterClass4() throws Exception {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableInnerClassInGenericOuterClass4.kt");
}
@TestMetadata("notApplicableLocalFun.kt")
public void testNotApplicableLocalFun() throws Exception {
runTest("idea/testData/inspectionsLocal/removeRedundantQualifierName/notApplicableLocalFun.kt");