From 6f4afd675f006fb81060644080387cf4e401e3db Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 27 Nov 2012 14:56:08 +0400 Subject: [PATCH] A quick fix for 'Raw type in is-expression' --- .../jetbrains/jet/plugin/JetBundle.properties | 1 + .../quickfix/AddStarProjectionsFix.java | 86 +++++++++++++++++++ .../jet/plugin/quickfix/QuickFixes.java | 2 + .../afterQualifiedArrayList.kt | 4 + .../addStarProjections/afterQualifiedList.kt | 4 + .../addStarProjections/afterQualifiedMap.kt | 4 + .../afterUnqualifiedList.kt | 4 + .../addStarProjections/afterUnqualifiedMap.kt | 4 + .../afterUnqualifiedMapOneArg.kt | 6 ++ .../beforeQualifiedArrayList.kt | 4 + .../addStarProjections/beforeQualifiedList.kt | 4 + .../addStarProjections/beforeQualifiedMap.kt | 4 + .../beforeUnqualifiedList.kt | 4 + .../beforeUnqualifiedMap.kt | 4 + .../beforeUnqualifiedMapOneArg.kt | 6 ++ 15 files changed, 141 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/AddStarProjectionsFix.java create mode 100644 idea/testData/quickfix/addStarProjections/afterQualifiedArrayList.kt create mode 100644 idea/testData/quickfix/addStarProjections/afterQualifiedList.kt create mode 100644 idea/testData/quickfix/addStarProjections/afterQualifiedMap.kt create mode 100644 idea/testData/quickfix/addStarProjections/afterUnqualifiedList.kt create mode 100644 idea/testData/quickfix/addStarProjections/afterUnqualifiedMap.kt create mode 100644 idea/testData/quickfix/addStarProjections/afterUnqualifiedMapOneArg.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeQualifiedArrayList.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeQualifiedList.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeQualifiedMap.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeUnqualifiedList.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeUnqualifiedMap.kt create mode 100644 idea/testData/quickfix/addStarProjections/beforeUnqualifiedMapOneArg.kt diff --git a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties index a68a8a1a91a..a218abbaf93 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -11,6 +11,7 @@ change.variable.mutability.family=Change variable mutability remove.function.body=Remove function body make.element.modifier=Make {0} {1} add.modifier=Add ''{0}'' modifier +add.star.projections=Add ''{0}'' make.element.not.modifier=Make {0} not {1} remove.modifier=Remove ''{0}'' modifier remove.modifier.family=Remove modifier diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddStarProjectionsFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddStarProjectionsFix.java new file mode 100644 index 00000000000..0ba9abde473 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddStarProjectionsFix.java @@ -0,0 +1,86 @@ +/* + * Copyright 2010-2012 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.jet.plugin.quickfix; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; +import org.jetbrains.jet.lang.diagnostics.Errors; +import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.psi.JetTypeElement; +import org.jetbrains.jet.lang.psi.JetUserType; +import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.plugin.JetBundle; + +public class AddStarProjectionsFix extends JetIntentionAction { + + private final int argumentCount; + + private AddStarProjectionsFix(@NotNull JetUserType element, int count) { + super(element); + argumentCount = count; + } + + @NotNull + @Override + public String getText() { + return JetBundle.message("add.star.projections", TypeUtils.getTypeNameAndStarProjectionsString("", argumentCount)); + } + + @NotNull + @Override + public String getFamilyName() { + return "Add star projections"; + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + assert element.getTypeArguments().isEmpty(); + + String typeString = TypeUtils.getTypeNameAndStarProjectionsString(element.getText(), argumentCount); + JetTypeElement replacement = JetPsiFactory.createType(project, typeString).getTypeElement(); + assert replacement != null : "No type element after parsing " + typeString; + + element.replace(replacement); + } + + @Override + public boolean startInWriteAction() { + return true; + } + + public static JetIntentionActionFactory createFactory() { + return new JetIntentionActionFactory() { + @Override + public IntentionAction createAction(Diagnostic diagnostic) { + assert diagnostic.getFactory() == Errors.NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION; + @SuppressWarnings("unchecked") + DiagnosticWithParameters2 diagnosticWithParameters = + (DiagnosticWithParameters2) diagnostic; + JetUserType userType = QuickFixUtil.getParentElementOfType(diagnostic, JetUserType.class); + if (userType == null) return null; + Integer size = diagnosticWithParameters.getA(); + return new AddStarProjectionsFix(userType, size); + } + }; + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index 96def177297..ea1d097b9fa 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -144,5 +144,7 @@ public class QuickFixes { actions.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SpecifyTypeExplicitlyFix()); factories.put(NO_ELSE_IN_WHEN, AddWhenElseBranchFix.createFactory()); + + factories.put(NO_TYPE_ARGUMENTS_ON_RHS_OF_IS_EXPRESSION, AddStarProjectionsFix.createFactory()); } } diff --git a/idea/testData/quickfix/addStarProjections/afterQualifiedArrayList.kt b/idea/testData/quickfix/addStarProjections/afterQualifiedArrayList.kt new file mode 100644 index 00000000000..8e2052ebe45 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterQualifiedArrayList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is java.util.ArrayList<*> +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/afterQualifiedList.kt b/idea/testData/quickfix/addStarProjections/afterQualifiedList.kt new file mode 100644 index 00000000000..03df74663c0 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterQualifiedList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is jet.List<*> +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/afterQualifiedMap.kt b/idea/testData/quickfix/addStarProjections/afterQualifiedMap.kt new file mode 100644 index 00000000000..89e839cffa6 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterQualifiedMap.kt @@ -0,0 +1,4 @@ +// "Add '<*, *>'" "true" +public fun foo(a: Any) { + a is jet.Map<*, *> +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/afterUnqualifiedList.kt b/idea/testData/quickfix/addStarProjections/afterUnqualifiedList.kt new file mode 100644 index 00000000000..9f72a0770b7 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterUnqualifiedList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is List<*> +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/afterUnqualifiedMap.kt b/idea/testData/quickfix/addStarProjections/afterUnqualifiedMap.kt new file mode 100644 index 00000000000..21774dd8801 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterUnqualifiedMap.kt @@ -0,0 +1,4 @@ +// "Add '<*, *>'" "true" +public fun foo(a: Any) { + a is Map<*, *> +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/afterUnqualifiedMapOneArg.kt b/idea/testData/quickfix/addStarProjections/afterUnqualifiedMapOneArg.kt new file mode 100644 index 00000000000..89e58141855 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/afterUnqualifiedMapOneArg.kt @@ -0,0 +1,6 @@ +// "Add '<*, *>'" "false" +// "Add '<*>'" "false" +// ERROR: 2 type arguments expected +public fun foo(a: Any) { + a is Map +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeQualifiedArrayList.kt b/idea/testData/quickfix/addStarProjections/beforeQualifiedArrayList.kt new file mode 100644 index 00000000000..44b6749235f --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeQualifiedArrayList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is java.util.ArrayList +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeQualifiedList.kt b/idea/testData/quickfix/addStarProjections/beforeQualifiedList.kt new file mode 100644 index 00000000000..986d69d4059 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeQualifiedList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is jet.List +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeQualifiedMap.kt b/idea/testData/quickfix/addStarProjections/beforeQualifiedMap.kt new file mode 100644 index 00000000000..9a22a74d59c --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeQualifiedMap.kt @@ -0,0 +1,4 @@ +// "Add '<*, *>'" "true" +public fun foo(a: Any) { + a is jet.Map +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeUnqualifiedList.kt b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedList.kt new file mode 100644 index 00000000000..99918d24075 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedList.kt @@ -0,0 +1,4 @@ +// "Add '<*>'" "true" +public fun foo(a: Any) { + a is List +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMap.kt b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMap.kt new file mode 100644 index 00000000000..3ae43ac8928 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMap.kt @@ -0,0 +1,4 @@ +// "Add '<*, *>'" "true" +public fun foo(a: Any) { + a is Map +} \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMapOneArg.kt b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMapOneArg.kt new file mode 100644 index 00000000000..8078456b367 --- /dev/null +++ b/idea/testData/quickfix/addStarProjections/beforeUnqualifiedMapOneArg.kt @@ -0,0 +1,6 @@ +// "Add '<*, *>'" "false" +// "Add '<*>'" "false" +// ERROR: 2 type arguments expected +public fun foo(a: Any) { + a is Map +} \ No newline at end of file