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");