diff --git a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.kt b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.kt index 553e81cb053..929dba86a13 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.kt @@ -20,29 +20,29 @@ import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.lookup.LookupElement import com.intellij.openapi.editor.Document -import com.intellij.openapi.editor.RangeMarker import com.intellij.psi.PsiDocumentManager -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.psi.JetFile -import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.jet.plugin.codeInsight.ShortenReferences import org.jetbrains.jet.plugin.completion.JetLookupObject +import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor public object JetClassInsertHandler : InsertHandler { override fun handleInsert(context: InsertionContext, item: LookupElement) { val file = context.getFile() if (file is JetFile) { - val descriptor = (item.getObject() as? JetLookupObject)?.getDescriptor() + val descriptor = (item.getObject() as? JetLookupObject)?.getDescriptor() as? ClassDescriptor if (descriptor != null) { val startOffset = context.getStartOffset() val document = context.getDocument() if (!isAfterDot(document, startOffset)) { - val fqName = DescriptorUtils.getFqName(descriptor).asString() + val qualifiedName = getQualifiedName(descriptor)!! // insert dot after because otherwise parser can sometimes produce no suitable reference here val tempSuffix = ".xxx" // we add "xxx" after dot because of some bugs in resolve (see KT-5145) - document.replaceString(startOffset, context.getTailOffset(), fqName + tempSuffix) - val classNameEnd = startOffset + fqName.length() + document.replaceString(startOffset, context.getTailOffset(), qualifiedName + tempSuffix) + val classNameEnd = startOffset + qualifiedName.length() val psiDocumentManager = PsiDocumentManager.getInstance(context.getProject()) psiDocumentManager.commitAllDocuments() @@ -72,4 +72,18 @@ public object JetClassInsertHandler : InsertHandler { } return false } + + private fun getQualifiedName(descriptor: ClassDescriptor): String? { + val name = descriptor.getName() + if (name.isSpecial()) return null + val nameString = name.asString() + val parent = descriptor.getContainingDeclaration() + val qualifier = when (parent) { + is ClassDescriptor -> getQualifiedName(parent) + is PackageViewDescriptor -> parent.getFqName().asString() + is PackageFragmentDescriptor -> parent.fqName.asString() + else -> null + } + return if (qualifier != null && qualifier != "") qualifier + "." + nameString else nameString + } } diff --git a/idea/testData/completion/handlers/LocalClassCompletion.kt b/idea/testData/completion/handlers/LocalClassCompletion.kt new file mode 100644 index 00000000000..c04061e5bf8 --- /dev/null +++ b/idea/testData/completion/handlers/LocalClassCompletion.kt @@ -0,0 +1,5 @@ +fun foo() { + class LocalClass {} + + val v: Lo +} \ No newline at end of file diff --git a/idea/testData/completion/handlers/LocalClassCompletion.kt.after b/idea/testData/completion/handlers/LocalClassCompletion.kt.after new file mode 100644 index 00000000000..e1e934ce86b --- /dev/null +++ b/idea/testData/completion/handlers/LocalClassCompletion.kt.after @@ -0,0 +1,5 @@ +fun foo() { + class LocalClass {} + + val v: LocalClass +} \ No newline at end of file diff --git a/idea/testData/completion/handlers/NestedLocalClassCompletion.kt b/idea/testData/completion/handlers/NestedLocalClassCompletion.kt new file mode 100644 index 00000000000..f90070167b1 --- /dev/null +++ b/idea/testData/completion/handlers/NestedLocalClassCompletion.kt @@ -0,0 +1,7 @@ +fun foo() { + class LocalClass { + inner class Nested {} + + val v: + } +} \ No newline at end of file diff --git a/idea/testData/completion/handlers/NestedLocalClassCompletion.kt.after b/idea/testData/completion/handlers/NestedLocalClassCompletion.kt.after new file mode 100644 index 00000000000..8a53caf6140 --- /dev/null +++ b/idea/testData/completion/handlers/NestedLocalClassCompletion.kt.after @@ -0,0 +1,7 @@ +fun foo() { + class LocalClass { + inner class Nested {} + + val v: Nested + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt index 6614e3ecddd..7fb2ba86b01 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt +++ b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt @@ -139,4 +139,7 @@ public class BasicCompletionHandlerTest : CompletionHandlerTestBase(){ fun testClassFromClassObject() = doTest(1, "Some", null, '\n') fun testParameterType() = doTest(1, "StringBuilder", " (java.lang)", '\n') + + fun testLocalClassCompletion() = doTest(1, "LocalClass", null, '\n') + fun testNestedLocalClassCompletion() = doTest(1, "Nested", null, '\n') } \ No newline at end of file