diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/RenderingUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/RenderingUtils.kt index 12de919e4bf..a86c32be6bd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/RenderingUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/RenderingUtils.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.renderer import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.Name @@ -51,6 +52,10 @@ public fun FqNameUnsafe.render(): String { return renderFqName(pathSegments()) } +public fun FqName.render(): String { + return renderFqName(pathSegments()) +} + public fun renderFqName(pathSegments: List): String { return buildString { for (element in pathSegments) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 885933a7ea3..74e605e3f74 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.types.expressions.OperatorConventions @@ -179,14 +180,14 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere private fun KtNameReferenceExpression.changeQualifiedName(fqName: FqName): KtElement { assert(!fqName.isRoot()) { "Can't set empty FqName for element $this" } - val shortName = fqName.shortName().asString() + val shortName = fqName.shortName().render() val psiFactory = KtPsiFactory(this) val fqNameBase = (getParent() as? KtCallExpression)?.let { parent -> val callCopy = parent.copy() as KtCallExpression callCopy.getCalleeExpression()!!.replace(psiFactory.createSimpleName(shortName)).getParent()!!.getText() } ?: shortName - val text = if (!fqName.isOneSegmentFQN()) "${fqName.parent().asString()}.$fqNameBase" else fqNameBase + val text = if (!fqName.isOneSegmentFQN()) "${fqName.parent().render()}.$fqNameBase" else fqNameBase val elementToReplace = getQualifiedElement() return when (elementToReplace) { diff --git a/idea/testData/copyPaste/imports/KeywordClassName.expected.kt b/idea/testData/copyPaste/imports/KeywordClassName.expected.kt new file mode 100644 index 00000000000..4f08a9a3a8c --- /dev/null +++ b/idea/testData/copyPaste/imports/KeywordClassName.expected.kt @@ -0,0 +1,6 @@ +// ERROR: A 'return' expression required in a function with a block body ('{...}') +package to + +import d.`class` + +fun foo(): `class` {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/KeywordClassName.expected.names b/idea/testData/copyPaste/imports/KeywordClassName.expected.names new file mode 100644 index 00000000000..c68ace5aeb3 --- /dev/null +++ b/idea/testData/copyPaste/imports/KeywordClassName.expected.names @@ -0,0 +1 @@ +d.class \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/KeywordClassName.kt b/idea/testData/copyPaste/imports/KeywordClassName.kt new file mode 100644 index 00000000000..5d32af9545b --- /dev/null +++ b/idea/testData/copyPaste/imports/KeywordClassName.kt @@ -0,0 +1,6 @@ +// WITH_LIBRARY: copyPaste/imports/KotlinLibrary +package a + +import d.* + +fun foo(): `class` {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/KotlinLibrary/KeywordNames.kt b/idea/testData/copyPaste/imports/KotlinLibrary/KeywordNames.kt new file mode 100644 index 00000000000..fcfbd473a95 --- /dev/null +++ b/idea/testData/copyPaste/imports/KotlinLibrary/KeywordNames.kt @@ -0,0 +1,3 @@ +package d + +class `class` \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java index 189cb7d5646..2cf31e48144 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java @@ -259,6 +259,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCopy(fileName); } + @TestMetadata("KeywordClassName.kt") + public void testKeywordClassName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/KeywordClassName.kt"); + doTestCopy(fileName); + } + @TestMetadata("Local.kt") public void testLocal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/Local.kt"); @@ -604,6 +610,12 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast doTestCut(fileName); } + @TestMetadata("KeywordClassName.kt") + public void testKeywordClassName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/KeywordClassName.kt"); + doTestCut(fileName); + } + @TestMetadata("Local.kt") public void testLocal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/imports/Local.kt");