From 0b5b5d8e89063c8e44cd8a109b9afddfb9dd446b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 10 Oct 2017 12:51:27 +0300 Subject: [PATCH] Suggest primitive array type for collection literals in "add type" fix So #KT-18549 Fixed --- .../AddTypeAnnotationToValueParameterFix.kt | 12 +++++++++++- .../annotationWithArrayLiteralDouble.kt | 4 ++++ .../annotationWithArrayLiteralDouble.kt.after | 4 ++++ .../annotationWithArrayLiteralInt.kt | 4 ++++ .../annotationWithArrayLiteralInt.kt.after | 4 ++++ .../annotationWithArrayLiteralString.kt | 4 ++++ .../annotationWithArrayLiteralString.kt.after | 4 ++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 ++++++++++++++++++ 8 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt.after create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt.after create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt create mode 100644 idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddTypeAnnotationToValueParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddTypeAnnotationToValueParameterFix.kt index 5af1c78fcd1..c36a2da7abb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddTypeAnnotationToValueParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddTypeAnnotationToValueParameterFix.kt @@ -19,11 +19,14 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.ShortenReferences +import org.jetbrains.kotlin.idea.project.builtIns import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.psi.KtCollectionLiteralExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtPsiFactory @@ -36,7 +39,14 @@ class AddTypeAnnotationToValueParameterFix(element: KtParameter) : KotlinQuickFi init { val defaultValue = element.defaultValue - val type = defaultValue?.getType(defaultValue.analyze(BodyResolveMode.PARTIAL)) + var type = defaultValue?.getType(defaultValue.analyze(BodyResolveMode.PARTIAL)) + if (defaultValue is KtCollectionLiteralExpression && type != null && KotlinBuiltIns.isArray(type)) { + val builtIns = element.builtIns + val elementType = builtIns.getArrayElementType(type) + if (KotlinBuiltIns.isPrimitiveType(elementType)) { + type = builtIns.getPrimitiveArrayKotlinTypeByPrimitiveKotlinType(elementType) + } + } typeNameShort = type?.let { IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(it) } typeName = type?.let { IdeDescriptorRenderers.SOURCE_CODE.renderType(it) } diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt new file mode 100644 index 00000000000..13c17bd3e60 --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt @@ -0,0 +1,4 @@ +// "Add type 'DoubleArray' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value = [1.0, 2.2]) \ No newline at end of file diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt.after b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt.after new file mode 100644 index 00000000000..9e25d2d6f60 --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt.after @@ -0,0 +1,4 @@ +// "Add type 'DoubleArray' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value: DoubleArray = [1.0, 2.2]) \ No newline at end of file diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt new file mode 100644 index 00000000000..14d0a7e1944 --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt @@ -0,0 +1,4 @@ +// "Add type 'IntArray' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value = [1, 2]) \ No newline at end of file diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt.after b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt.after new file mode 100644 index 00000000000..81e7438a04d --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt.after @@ -0,0 +1,4 @@ +// "Add type 'IntArray' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value: IntArray = [1, 2]) \ No newline at end of file diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt new file mode 100644 index 00000000000..42bd6bbbaa6 --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt @@ -0,0 +1,4 @@ +// "Add type 'Array' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value = ["alpha", "beta"]) \ No newline at end of file diff --git a/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt.after b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt.after new file mode 100644 index 00000000000..b7c7d01a798 --- /dev/null +++ b/idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt.after @@ -0,0 +1,4 @@ +// "Add type 'Array' to parameter 'value'" "true" +// LANGUAGE_VERSION: 1.2 + +annotation class CollectionDefault(val value: Array = ["alpha", "beta"]) \ 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 8430102142b..938f6ecb797 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -893,6 +893,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addTypeAnnotationToValueParameter"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("annotationWithArrayLiteralDouble.kt") + public void testAnnotationWithArrayLiteralDouble() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralDouble.kt"); + doTest(fileName); + } + + @TestMetadata("annotationWithArrayLiteralInt.kt") + public void testAnnotationWithArrayLiteralInt() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralInt.kt"); + doTest(fileName); + } + + @TestMetadata("annotationWithArrayLiteralString.kt") + public void testAnnotationWithArrayLiteralString() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addTypeAnnotationToValueParameter/annotationWithArrayLiteralString.kt"); + doTest(fileName); + } + @TestMetadata("noDefaultValue.kt") public void testNoDefaultValue() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addTypeAnnotationToValueParameter/noDefaultValue.kt");