diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index fbd59470e52..03e02db721e 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -331,14 +331,21 @@ private fun ExtractionData.inferParametersInfo( val hasThisReceiver = thisDescriptor != null val thisExpr = ref.getParent() as? JetThisExpression - val hasClassObjectReceiver = (thisDescriptor as? ClassDescriptor)?.getKind() == ClassKind.CLASS_OBJECT - val classObjectClassDescriptor = - if (hasClassObjectReceiver) thisDescriptor!!.getContainingDeclaration() as? ClassDescriptor else null + val typeDescriptor = ((thisDescriptor ?: originalDescriptor) as? ClassDescriptor)?.let { + when(it.getKind()) { + ClassKind.OBJECT, ClassKind.ENUM_CLASS -> it + ClassKind.CLASS_OBJECT, ClassKind.ENUM_ENTRY -> it.getContainingDeclaration() as? ClassDescriptor + else -> null + } + } - if (classObjectClassDescriptor != null) { - assert (classObjectClassDescriptor.canBeReferencedViaImport(), "Class object should be allowed only for importable classes: className = ${classObjectClassDescriptor.getName().asString()}") - - replacementMap[refInfo.offsetInBody] = FqNameReplacement(DescriptorUtils.getFqNameSafe(originalDescriptor)) + if (typeDescriptor != null) { + if (typeDescriptor.canBeReferencedViaImport()) { + replacementMap[refInfo.offsetInBody] = FqNameReplacement(DescriptorUtils.getFqNameSafe(originalDescriptor)) + } + else { + nonDenotableTypes.add(typeDescriptor.getDefaultType()) + } } else { val extractThis = hasThisReceiver || thisExpr != null diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt new file mode 100644 index 00000000000..33e5ee82b61 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt @@ -0,0 +1,14 @@ +// SIBLING: +class MyClass { + fun test() { + P.A.foo() + P.A.a + } + + enum class P { + A + + val a = 1 + fun foo() = 1 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt.after new file mode 100644 index 00000000000..2a5e41988a6 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt.after @@ -0,0 +1,18 @@ +// SIBLING: +class MyClass { + fun test() { + unit() + } + + enum class P { + A + + val a = 1 + fun foo() = 1 + } +} + +fun unit() { + MyClass.P.A.foo() + MyClass.P.A.a +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt new file mode 100644 index 00000000000..cfca5c5d8d9 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt @@ -0,0 +1,12 @@ +// SIBLING: +class MyClass { + fun test() { + P.foo() + P.a + } + + object P { + val a = 1 + fun foo() = 1 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt.after new file mode 100644 index 00000000000..45629b9938f --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt.after @@ -0,0 +1,16 @@ +// SIBLING: +class MyClass { + fun test() { + unit() + } + + object P { + val a = 1 + fun foo() = 1 + } +} + +fun unit() { + MyClass.P.foo() + MyClass.P.a +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt new file mode 100644 index 00000000000..de322266f9f --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt @@ -0,0 +1,12 @@ +package p.q + +val a = 1 +fun foo() = 1 + +// SIBLING: +class MyClass { + fun test() { + p.q.foo() + p.q.a + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt.after new file mode 100644 index 00000000000..a5c5411f765 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt.after @@ -0,0 +1,16 @@ +package p.q + +val a = 1 +fun foo() = 1 + +// SIBLING: +class MyClass { + fun test() { + unit() + } +} + +fun unit() { + foo() + a +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index bcc10d873c4..e0729c5e51c 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -744,6 +744,21 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt"); } + @TestMetadata("qualifiedEnum.kt") + public void testQualifiedEnum() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/qualifiedEnum.kt"); + } + + @TestMetadata("qualifiedObject.kt") + public void testQualifiedObject() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/qualifiedObject.kt"); + } + + @TestMetadata("qualifiedPackage.kt") + public void testQualifiedPackage() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/qualifiedPackage.kt"); + } + @TestMetadata("usagesInCallArgs.kt") public void testUsagesInCallArgs() throws Exception { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt");