Extract Function: Consider reference "broken" if corresponding diagnostics are changed after code fragment extraction
#KT-8633 Fixed
This commit is contained in:
+4
-1
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.codeInsight.JetFileReferencesResolver
|
||||
import org.jetbrains.kotlin.idea.core.compareDescriptors
|
||||
import org.jetbrains.kotlin.idea.core.refactoring.getContextForContainingDeclarationBody
|
||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.JetPsiRange
|
||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.JetPsiUnifier
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
@@ -213,7 +214,9 @@ data class ExtractionData(
|
||||
if (parent is JetUserType && (parent.getParent() as? JetUserType)?.getQualifier() == parent) continue
|
||||
|
||||
val descriptor = context[BindingContext.REFERENCE_TARGET, ref]
|
||||
val isBadRef = !compareDescriptors(project, originalResolveResult.descriptor, descriptor) || smartCast != null
|
||||
val isBadRef = !(compareDescriptors(project, originalResolveResult.descriptor, descriptor)
|
||||
&& originalContext.diagnostics.forElement(originalResolveResult.originalRefExpr) == context.diagnostics.forElement(ref))
|
||||
|| smartCast != null
|
||||
if (isBadRef && !originalResolveResult.declaration.isInsideOf(originalElements)) {
|
||||
val originalResolvedCall = originalResolveResult.resolvedCall as? VariableAsFunctionResolvedCall
|
||||
val originalFunctionCall = originalResolvedCall?.functionCall
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
// PARAM_TYPES: kotlin.String
|
||||
// PARAM_DESCRIPTOR: internal final fun kotlin.String.foo(): kotlin.Unit defined in X
|
||||
|
||||
fun print(a: Any) {
|
||||
|
||||
}
|
||||
|
||||
class X {
|
||||
fun String.foo() {
|
||||
<selection>print(extension)</selection>
|
||||
}
|
||||
|
||||
val String.extension: Int get() = length()
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// PARAM_TYPES: kotlin.String
|
||||
// PARAM_DESCRIPTOR: internal final fun kotlin.String.foo(): kotlin.Unit defined in X
|
||||
|
||||
fun print(a: Any) {
|
||||
|
||||
}
|
||||
|
||||
class X {
|
||||
fun String.foo() {
|
||||
__dummyTestFun__()
|
||||
}
|
||||
|
||||
private fun String.__dummyTestFun__() {
|
||||
print(extension)
|
||||
}
|
||||
|
||||
val String.extension: Int get() = length()
|
||||
}
|
||||
+6
@@ -1979,6 +1979,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
||||
doExtractFunctionTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("missingReceiver.kt")
|
||||
public void testMissingReceiver() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt");
|
||||
doExtractFunctionTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("paramAsExplicitInvoke.kt")
|
||||
public void testParamAsExplicitInvoke() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/paramAsExplicitInvoke.kt");
|
||||
|
||||
Reference in New Issue
Block a user