diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/DataForConversion.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/DataForConversion.kt index f3070f0131f..98236030562 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/DataForConversion.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/DataForConversion.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.util.TextRange import com.intellij.psi.* import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.platform.JavaToKotlinClassMap +import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.elementsInRange import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.siblings @@ -217,11 +218,16 @@ data class DataForConversion private( } else { add(fileText.substring(range.start, elements.first().range.start)) - addAll(elements) + elements.flatMapTo(this) { + if (shouldExpandToChildren(it)) it.allChildren.toList() else listOf(it) + } add(fileText.substring(elements.last().range.end, range.end)) } } + // converting of PsiModifierList is not supported by converter, but converting of single annotations inside it is supported + private fun shouldExpandToChildren(element: PsiElement) = element is PsiModifierList + private fun buildImportsAndPackage(sourceFile: PsiJavaFile): String { return StringBuilder { val packageName = sourceFile.getPackageName() diff --git a/idea/testData/copyPaste/conversion/CopyAnnotation.expected.kt b/idea/testData/copyPaste/conversion/CopyAnnotation.expected.kt new file mode 100644 index 00000000000..c570051a471 --- /dev/null +++ b/idea/testData/copyPaste/conversion/CopyAnnotation.expected.kt @@ -0,0 +1,2 @@ +Ann(String::class) +class X \ No newline at end of file diff --git a/idea/testData/copyPaste/conversion/CopyAnnotation.java b/idea/testData/copyPaste/conversion/CopyAnnotation.java new file mode 100644 index 00000000000..703e61bd92c --- /dev/null +++ b/idea/testData/copyPaste/conversion/CopyAnnotation.java @@ -0,0 +1,7 @@ +@interface Ann { + Class value(); +} + +@Ann(String.class) +class C { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/conversion/CopyAnnotation.to.kt b/idea/testData/copyPaste/conversion/CopyAnnotation.to.kt new file mode 100644 index 00000000000..7de642d202d --- /dev/null +++ b/idea/testData/copyPaste/conversion/CopyAnnotation.to.kt @@ -0,0 +1 @@ +class X \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/JavaToKotlinCopyPasteConversionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/JavaToKotlinCopyPasteConversionTestGenerated.java index 78ed2d9f22a..e70b7c18aaf 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/JavaToKotlinCopyPasteConversionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/JavaToKotlinCopyPasteConversionTestGenerated.java @@ -95,6 +95,12 @@ public class JavaToKotlinCopyPasteConversionTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("CopyAnnotation.java") + public void testCopyAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/conversion/CopyAnnotation.java"); + doTest(fileName); + } + @TestMetadata("FieldWithNoEndComment.java") public void testFieldWithNoEndComment() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/copyPaste/conversion/FieldWithNoEndComment.java");