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.compareDescriptors
|
||||||
import org.jetbrains.kotlin.idea.core.refactoring.getContextForContainingDeclarationBody
|
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.JetPsiRange
|
||||||
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.JetPsiUnifier
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
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
|
if (parent is JetUserType && (parent.getParent() as? JetUserType)?.getQualifier() == parent) continue
|
||||||
|
|
||||||
val descriptor = context[BindingContext.REFERENCE_TARGET, ref]
|
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)) {
|
if (isBadRef && !originalResolveResult.declaration.isInsideOf(originalElements)) {
|
||||||
val originalResolvedCall = originalResolveResult.resolvedCall as? VariableAsFunctionResolvedCall
|
val originalResolvedCall = originalResolveResult.resolvedCall as? VariableAsFunctionResolvedCall
|
||||||
val originalFunctionCall = originalResolvedCall?.functionCall
|
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);
|
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")
|
@TestMetadata("paramAsExplicitInvoke.kt")
|
||||||
public void testParamAsExplicitInvoke() throws Exception {
|
public void testParamAsExplicitInvoke() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/paramAsExplicitInvoke.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/paramAsExplicitInvoke.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user