From 4c1c64fa087d59374c738879db219ad0c02e10aa Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 17 Feb 2016 14:55:59 +0300 Subject: [PATCH] Quick fix for adding arrayOf wrapper for annotation parameters #KT-10063 Fixed --- .../kotlin/idea/quickfix/AddArrayOfTypeFix.kt | 47 +++++++++++++++++++ .../QuickFixFactoryForTypeMismatchError.java | 11 +++++ .../quickfix/typeMismatch/addArrayOfType.kt | 5 ++ .../typeMismatch/addArrayOfType.kt.after | 5 ++ ...rrayOfTypeForJavaAnnotation.before.Main.kt | 7 +++ ...eForJavaAnnotation.before.data.Sample.java | 3 ++ .../addArrayOfTypeForNamedParameter.kt | 5 ++ .../addArrayOfTypeForNamedParameter.kt.after | 5 ++ .../quickfix/typeMismatch/addIntArrayOf.kt | 5 ++ .../typeMismatch/addIntArrayOf.kt.after | 5 ++ .../QuickFixMultiFileTestGenerated.java | 6 +++ .../idea/quickfix/QuickFixTestGenerated.java | 18 +++++++ 12 files changed, 122 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/AddArrayOfTypeFix.kt create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfType.kt create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfType.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.Main.kt create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.data.Sample.java create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt create mode 100644 idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/addIntArrayOf.kt create mode 100644 idea/testData/quickfix/typeMismatch/addIntArrayOf.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddArrayOfTypeFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddArrayOfTypeFix.kt new file mode 100644 index 00000000000..5ba7ab0659b --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddArrayOfTypeFix.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.types.KotlinType + +class AddArrayOfTypeFix(expression: KtExpression, val expectedType: KotlinType) : KotlinQuickFixAction(expression) { + + val prefix = if (KotlinBuiltIns.isArray(expectedType)) { + "arrayOf" + } + else { + val name = "$expectedType" + "${name.decapitalize()}Of" + + } + + override fun getText() = "Add $prefix wrapper" + + override fun getFamilyName() = "Add arrayOf wrapper" + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val arrayOfExpression = KtPsiFactory(project).createExpressionByPattern("$0($1)", prefix, element) + element.replace(arrayOfExpression) + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java index a5a37be6fde..1169682c2a5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1; @@ -152,6 +153,16 @@ public class QuickFixFactoryForTypeMismatchError extends KotlinIntentionActionsF } } + // KT-10063: arrayOf() bounding single array element + KtAnnotationEntry annotationEntry = PsiTreeUtil.getParentOfType(expression, KtAnnotationEntry.class); + if (annotationEntry != null) { + if (KotlinBuiltIns.isArray(expectedType) && + TypeUtilsKt.isSubtypeOf(expressionType, expectedType.getArguments().get(0).getType()) || + KotlinBuiltIns.isPrimitiveArray(expectedType)) { + actions.add(new AddArrayOfTypeFix(expression, expectedType)); + } + } + ResolvedCall resolvedCall = CallUtilKt.getParentResolvedCall(expression, context, true); if (resolvedCall != null) { // to fix 'type mismatch' on 'if' branches diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfType.kt b/idea/testData/quickfix/typeMismatch/addArrayOfType.kt new file mode 100644 index 00000000000..55e5755760b --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfType.kt @@ -0,0 +1,5 @@ +// "Add arrayOf wrapper" "true" + +annotation class ArrAnn(val value: Array) + +@ArrAnn("123") class My diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfType.kt.after b/idea/testData/quickfix/typeMismatch/addArrayOfType.kt.after new file mode 100644 index 00000000000..fbe9d76c4c9 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfType.kt.after @@ -0,0 +1,5 @@ +// "Add arrayOf wrapper" "true" + +annotation class ArrAnn(val value: Array) + +@ArrAnn(arrayOf("123")) class My diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.Main.kt b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.Main.kt new file mode 100644 index 00000000000..3499c0c081f --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.Main.kt @@ -0,0 +1,7 @@ +// "Add arrayOf wrapper" "false" +// ACTION: Add 'value =' to argument +// ACTION: Create test +// ACTION: Make internal +// ACTION: Make private + +@ArrAnn("123") class My \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.data.Sample.java b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.data.Sample.java new file mode 100644 index 00000000000..a218ab84843 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.data.Sample.java @@ -0,0 +1,3 @@ +public @interface ArrAnn { + String[] value(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt new file mode 100644 index 00000000000..5ebed1cc3df --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt @@ -0,0 +1,5 @@ +// "Add doubleArrayOf wrapper" "true" + +annotation class ArrAnn(val name: DoubleArray) + +@ArrAnn(name = 3.14) class My diff --git a/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt.after b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt.after new file mode 100644 index 00000000000..471ba95ebb6 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt.after @@ -0,0 +1,5 @@ +// "Add doubleArrayOf wrapper" "true" + +annotation class ArrAnn(val name: DoubleArray) + +@ArrAnn(name = doubleArrayOf(3.14)) class My diff --git a/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt b/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt new file mode 100644 index 00000000000..b68f69fa981 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt @@ -0,0 +1,5 @@ +// "Add intArrayOf wrapper" "true" + +annotation class ArrAnn(val value: IntArray) + +@ArrAnn(42) class My diff --git a/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt.after b/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt.after new file mode 100644 index 00000000000..3cdc73dcf0c --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addIntArrayOf.kt.after @@ -0,0 +1,5 @@ +// "Add intArrayOf wrapper" "true" + +annotation class ArrAnn(val value: IntArray) + +@ArrAnn(intArrayOf(42)) class My diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index cc0163e85c9..4ea4adb6f42 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -1540,6 +1540,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeMismatch extends AbstractQuickFixMultiFileTest { + @TestMetadata("addArrayOfTypeForJavaAnnotation.before.Main.kt") + public void testAddArrayOfTypeForJavaAnnotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addArrayOfTypeForJavaAnnotation.before.Main.kt"); + doTestWithExtraFile(fileName); + } + public void testAllFilesPresentInTypeMismatch() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true); } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 467d0659683..9c7f4e63fc3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6891,6 +6891,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("addArrayOfType.kt") + public void testAddArrayOfType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addArrayOfType.kt"); + doTest(fileName); + } + + @TestMetadata("addArrayOfTypeForNamedParameter.kt") + public void testAddArrayOfTypeForNamedParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addArrayOfTypeForNamedParameter.kt"); + doTest(fileName); + } + @TestMetadata("addExclExclToRemoveNullability.kt") public void testAddExclExclToRemoveNullability() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt"); @@ -6915,6 +6927,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("addIntArrayOf.kt") + public void testAddIntArrayOf() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addIntArrayOf.kt"); + doTest(fileName); + } + public void testAllFilesPresentInTypeMismatch() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); }