diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 328c55aa492..03264dc2391 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -449,7 +449,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { CallableKind.PROPERTY -> "" } val returnTypeString = if (skipReturnType || assignmentToReplace != null) "" else ": Any" - val header = "$ownerTypeString${callableInfo.name}$paramList$returnTypeString" + val header = "$ownerTypeString${callableInfo.name.quoteIfNeeded()}$paramList$returnTypeString" val psiFactory = JetPsiFactory(currentFile) @@ -479,11 +479,12 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { ClassKind.ANNOTATION_CLASS, ClassKind.ENUM_ENTRY -> "" else -> "{\n\n}" } + val safeName = name.quoteIfNeeded() when (kind) { ClassKind.ENUM_ENTRY -> { if (!(targetParent is JetClass && targetParent.isEnum())) throw AssertionError("Enum class expected: ${targetParent.getText()}") val hasParameters = targetParent.getPrimaryConstructorParameters().isNotEmpty() - psiFactory.createEnumEntry("$name${if (hasParameters) "()" else " "}") + psiFactory.createEnumEntry("$safeName${if (hasParameters) "()" else " "}") } else -> { val openMod = if (open) "open " else "" @@ -493,7 +494,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { else -> "" } psiFactory.createDeclaration( - "$openMod$innerMod${kind.keyword} $name$typeParamList$paramList$returnTypeString $classBody" + "$openMod$innerMod${kind.keyword} $safeName$typeParamList$paramList$returnTypeString $classBody" ) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetParameterInfo.kt index 31270a20c12..cb7c607204d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetParameterInfo.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.compareDescriptors +import org.jetbrains.kotlin.idea.core.refactoring.quoteIfNeeded import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JetCallableDefinitionUsage import org.jetbrains.kotlin.idea.references.JetReference import org.jetbrains.kotlin.idea.references.mainReference @@ -200,7 +201,7 @@ public class JetParameterInfo( buffer.append(valOrVar).append(' ') } - buffer.append(getInheritedName(inheritedCallable)) + buffer.append(getInheritedName(inheritedCallable).quoteIfNeeded()) if (requiresExplicitType(inheritedCallable)) { buffer.append(": ").append(renderType(parameterIndex, inheritedCallable)) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index c1e7efe898a..4c57b39d2cb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -66,6 +66,7 @@ import org.jetbrains.kotlin.idea.JetFileType import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.getPackage import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices import org.jetbrains.kotlin.idea.util.ProjectRootsUtil @@ -661,4 +662,6 @@ public fun invokeOnceOnCommandFinish(action: () -> Unit) { } } commandProcessor.addCommandListener(listener) -} \ No newline at end of file +} + +public fun String.quoteIfNeeded(): String = if (KotlinNameSuggester.isIdentifier(this)) this else "`$this`" \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt b/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt new file mode 100644 index 00000000000..8c5242bfe27 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt @@ -0,0 +1,4 @@ +// "Create class 'A\u00A0'" "true" +fun test() { + val t = `A\u00A0`(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt.after b/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt.after new file mode 100644 index 00000000000..2a8cc59c27b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt.after @@ -0,0 +1,8 @@ +// "Create class 'A\u00A0'" "true" +fun test() { + val t = `A\u00A0`(1) +} + +class `A\u00A0`(i: Int) { + +} diff --git a/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt b/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt new file mode 100644 index 00000000000..fba85abe085 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt @@ -0,0 +1,4 @@ +// "Create extension function '\u00A0'" "true" +fun test() { + val t: Int = 1 `\u00A0` 2 +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt.after b/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt.after new file mode 100644 index 00000000000..d64f4c72c14 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt.after @@ -0,0 +1,8 @@ +// "Create extension function '\u00A0'" "true" +fun test() { + val t: Int = 1 `\u00A0` 2 +} + +fun Int.`\u00A0`(i: Int): Int { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. +} diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt new file mode 100644 index 00000000000..696c1e8bfe5 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt @@ -0,0 +1,4 @@ +// "Create parameter '\u00A0'" "true" +fun test() { + val t: Int = `\u00A0` +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt.after b/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt.after new file mode 100644 index 00000000000..a172daf54e0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt.after @@ -0,0 +1,4 @@ +// "Create parameter '\u00A0'" "true" +fun test(`\u00A0`: Int) { + val t: Int = `\u00A0` +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt new file mode 100644 index 00000000000..049c1dba38b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt @@ -0,0 +1,5 @@ +// "Create property '\u00A0'" "true" +// ERROR: Property must be initialized +fun test() { + val t: Int = `\u00A0` +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt.after b/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt.after new file mode 100644 index 00000000000..ad38143a27f --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt.after @@ -0,0 +1,7 @@ +val `\u00A0`: Int + +// "Create property '\u00A0'" "true" +// ERROR: Property must be initialized +fun test() { + val t: Int = `\u00A0` +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index e087b5a32a3..f25328765c1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -920,6 +920,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("quotedName.kt") + public void testQuotedName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt"); + doTest(fileName); + } + @TestMetadata("singleArgCallInAnnotationEntry.kt") public void testSingleArgCallInAnnotationEntry() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/singleArgCallInAnnotationEntry.kt"); @@ -1547,6 +1553,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("quotedName.kt") + public void testQuotedName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/quotedName.kt"); + doTest(fileName); + } + @TestMetadata("whenInOnUserType.kt") public void testWhenInOnUserType() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/whenInOnUserType.kt"); @@ -2672,6 +2684,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("quotedName.kt") + public void testQuotedName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/quotedName.kt"); + doTest(fileName); + } + @TestMetadata("recursiveBound.kt") public void testRecursiveBound() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/recursiveBound.kt"); @@ -2759,6 +2777,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("quotedName.kt") + public void testQuotedName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/quotedName.kt"); + doTest(fileName); + } + @TestMetadata("recursiveBound.kt") public void testRecursiveBound() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/recursiveBound.kt");