Create From Usage: Quote declaration name if it's not a valid identifier
#EA-70291 Fixed
This commit is contained in:
+4
-3
@@ -449,7 +449,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
|
|||||||
CallableKind.PROPERTY -> ""
|
CallableKind.PROPERTY -> ""
|
||||||
}
|
}
|
||||||
val returnTypeString = if (skipReturnType || assignmentToReplace != null) "" else ": Any"
|
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)
|
val psiFactory = JetPsiFactory(currentFile)
|
||||||
|
|
||||||
@@ -479,11 +479,12 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
|
|||||||
ClassKind.ANNOTATION_CLASS, ClassKind.ENUM_ENTRY -> ""
|
ClassKind.ANNOTATION_CLASS, ClassKind.ENUM_ENTRY -> ""
|
||||||
else -> "{\n\n}"
|
else -> "{\n\n}"
|
||||||
}
|
}
|
||||||
|
val safeName = name.quoteIfNeeded()
|
||||||
when (kind) {
|
when (kind) {
|
||||||
ClassKind.ENUM_ENTRY -> {
|
ClassKind.ENUM_ENTRY -> {
|
||||||
if (!(targetParent is JetClass && targetParent.isEnum())) throw AssertionError("Enum class expected: ${targetParent.getText()}")
|
if (!(targetParent is JetClass && targetParent.isEnum())) throw AssertionError("Enum class expected: ${targetParent.getText()}")
|
||||||
val hasParameters = targetParent.getPrimaryConstructorParameters().isNotEmpty()
|
val hasParameters = targetParent.getPrimaryConstructorParameters().isNotEmpty()
|
||||||
psiFactory.createEnumEntry("$name${if (hasParameters) "()" else " "}")
|
psiFactory.createEnumEntry("$safeName${if (hasParameters) "()" else " "}")
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
val openMod = if (open) "open " else ""
|
val openMod = if (open) "open " else ""
|
||||||
@@ -493,7 +494,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
|
|||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
psiFactory.createDeclaration<JetClassOrObject>(
|
psiFactory.createDeclaration<JetClassOrObject>(
|
||||||
"$openMod$innerMod${kind.keyword} $name$typeParamList$paramList$returnTypeString $classBody"
|
"$openMod$innerMod${kind.keyword} $safeName$typeParamList$paramList$returnTypeString $classBody"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.core.compareDescriptors
|
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.refactoring.changeSignature.usages.JetCallableDefinitionUsage
|
||||||
import org.jetbrains.kotlin.idea.references.JetReference
|
import org.jetbrains.kotlin.idea.references.JetReference
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
@@ -200,7 +201,7 @@ public class JetParameterInfo(
|
|||||||
buffer.append(valOrVar).append(' ')
|
buffer.append(valOrVar).append(' ')
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.append(getInheritedName(inheritedCallable))
|
buffer.append(getInheritedName(inheritedCallable).quoteIfNeeded())
|
||||||
|
|
||||||
if (requiresExplicitType(inheritedCallable)) {
|
if (requiresExplicitType(inheritedCallable)) {
|
||||||
buffer.append(": ").append(renderType(parameterIndex, inheritedCallable))
|
buffer.append(": ").append(renderType(parameterIndex, inheritedCallable))
|
||||||
|
|||||||
@@ -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.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
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.core.getPackage
|
||||||
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
|
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
|
||||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||||
@@ -661,4 +662,6 @@ public fun invokeOnceOnCommandFinish(action: () -> Unit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
commandProcessor.addCommandListener(listener)
|
commandProcessor.addCommandListener(listener)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun String.quoteIfNeeded(): String = if (KotlinNameSuggester.isIdentifier(this)) this else "`$this`"
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create class 'A\u00A0'" "true"
|
||||||
|
fun test() {
|
||||||
|
val t = <caret>`A\u00A0`(1)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// "Create class 'A\u00A0'" "true"
|
||||||
|
fun test() {
|
||||||
|
val t = `A\u00A0`(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
class `A\u00A0`(i: Int) {
|
||||||
|
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create extension function '\u00A0'" "true"
|
||||||
|
fun test() {
|
||||||
|
val t: Int = 1 <caret>`\u00A0` 2
|
||||||
|
}
|
||||||
+8
@@ -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.
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create parameter '\u00A0'" "true"
|
||||||
|
fun test() {
|
||||||
|
val t: Int = <caret>`\u00A0`
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create parameter '\u00A0'" "true"
|
||||||
|
fun test(`\u00A0`: Int) {
|
||||||
|
val t: Int = `\u00A0`
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// "Create property '\u00A0'" "true"
|
||||||
|
// ERROR: Property must be initialized
|
||||||
|
fun test() {
|
||||||
|
val t: Int = <caret>`\u00A0`
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
val `\u00A0`: Int
|
||||||
|
|
||||||
|
// "Create property '\u00A0'" "true"
|
||||||
|
// ERROR: Property must be initialized
|
||||||
|
fun test() {
|
||||||
|
val t: Int = `\u00A0`
|
||||||
|
}
|
||||||
@@ -920,6 +920,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("singleArgCallInAnnotationEntry.kt")
|
||||||
public void testSingleArgCallInAnnotationEntry() throws Exception {
|
public void testSingleArgCallInAnnotationEntry() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/singleArgCallInAnnotationEntry.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/singleArgCallInAnnotationEntry.kt");
|
||||||
@@ -1547,6 +1553,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("whenInOnUserType.kt")
|
||||||
public void testWhenInOnUserType() throws Exception {
|
public void testWhenInOnUserType() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/whenInOnUserType.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/binaryOperations/whenInOnUserType.kt");
|
||||||
@@ -2672,6 +2684,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("recursiveBound.kt")
|
||||||
public void testRecursiveBound() throws Exception {
|
public void testRecursiveBound() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/recursiveBound.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/recursiveBound.kt");
|
||||||
@@ -2759,6 +2777,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("recursiveBound.kt")
|
||||||
public void testRecursiveBound() throws Exception {
|
public void testRecursiveBound() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/recursiveBound.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/recursiveBound.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user