"Convert to anonymous object" quickfix: false negative when interface has concrete members
#KT-37908 Fixed
This commit is contained in:
committed by
Yan Zhulanow
parent
5b927d798c
commit
111b2945e1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.quickfix
|
|||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
@@ -20,7 +21,7 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
||||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.WrongResolutionToClassifier
|
import org.jetbrains.kotlin.resolve.calls.tower.WrongResolutionToClassifier
|
||||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
|
import org.jetbrains.kotlin.resolve.sam.getAbstractMembers
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
||||||
|
|
||||||
class ConvertToAnonymousObjectFix(element: KtNameReferenceExpression) : KotlinQuickFixAction<KtNameReferenceExpression>(element) {
|
class ConvertToAnonymousObjectFix(element: KtNameReferenceExpression) : KotlinQuickFixAction<KtNameReferenceExpression>(element) {
|
||||||
@@ -52,6 +53,10 @@ class ConvertToAnonymousObjectFix(element: KtNameReferenceExpression) : KotlinQu
|
|||||||
|
|
||||||
private fun getFunctionDescriptor(
|
private fun getFunctionDescriptor(
|
||||||
d: DiagnosticWithParameters3<KtReferenceExpression, ClassifierDescriptor, WrongResolutionToClassifier, String>
|
d: DiagnosticWithParameters3<KtReferenceExpression, ClassifierDescriptor, WrongResolutionToClassifier, String>
|
||||||
) = (d.a as? LazyClassDescriptor)?.declaredCallableMembers?.singleOrNull() as? SimpleFunctionDescriptor
|
): SimpleFunctionDescriptor? {
|
||||||
|
val classDescriptor = d.a as? ClassDescriptor ?: return null
|
||||||
|
val singleAbstractFunction = getAbstractMembers(classDescriptor).singleOrNull() as? SimpleFunctionDescriptor ?: return null
|
||||||
|
return if (singleAbstractFunction.typeParameters.isEmpty()) singleAbstractFunction else null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// "Convert to anonymous object" "true"
|
||||||
|
interface I {
|
||||||
|
fun a()
|
||||||
|
fun b() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo(<caret>I {})
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// "Convert to anonymous object" "true"
|
||||||
|
interface I {
|
||||||
|
fun a()
|
||||||
|
fun b() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo(object : I {
|
||||||
|
override fun a() {
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// "Convert to anonymous object" "true"
|
||||||
|
interface I {
|
||||||
|
fun a()
|
||||||
|
val b: Int
|
||||||
|
get() = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo(<caret>I {})
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
// "Convert to anonymous object" "true"
|
||||||
|
interface I {
|
||||||
|
fun a()
|
||||||
|
val b: Int
|
||||||
|
get() = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
foo(object : I {
|
||||||
|
override fun a() {
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// "Convert to anonymous object" "false"
|
||||||
|
// ERROR: Interface I does not have constructors
|
||||||
|
// ACTION: Introduce import alias
|
||||||
|
// ACTION: Split property declaration
|
||||||
|
interface I {
|
||||||
|
fun <T> foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
val i = <caret>I { "" }
|
||||||
|
}
|
||||||
@@ -2911,6 +2911,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/convertToAnonymousObject"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/convertToAnonymousObject"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("hasConcreateMember.kt")
|
||||||
|
public void testHasConcreateMember() throws Exception {
|
||||||
|
runTest("idea/testData/quickfix/convertToAnonymousObject/hasConcreateMember.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("hasConcreateMember2.kt")
|
||||||
|
public void testHasConcreateMember2() throws Exception {
|
||||||
|
runTest("idea/testData/quickfix/convertToAnonymousObject/hasConcreateMember2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("hasTypeParameter.kt")
|
||||||
|
public void testHasTypeParameter() throws Exception {
|
||||||
|
runTest("idea/testData/quickfix/convertToAnonymousObject/hasTypeParameter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("labeledReturn.kt")
|
@TestMetadata("labeledReturn.kt")
|
||||||
public void testLabeledReturn() throws Exception {
|
public void testLabeledReturn() throws Exception {
|
||||||
runTest("idea/testData/quickfix/convertToAnonymousObject/labeledReturn.kt");
|
runTest("idea/testData/quickfix/convertToAnonymousObject/labeledReturn.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user