From 2679bf2acba1116aa9385c1d75757b16e52f8a01 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 18 Jan 2012 11:45:37 +0100 Subject: [PATCH] suggest to delete type arguments when they are not expected (IDEA-79300) --- .../impl/analysis/GenericsHighlightUtil.java | 3 + .../impl/quickfix/RemoveTypeArgumentsFix.java | 75 +++++++++++++++++++ .../removeTypeArguments/afterRemoveAll.java | 7 ++ .../removeTypeArguments/beforeRemoveAll.java | 7 ++ .../beforeRemoveUnavailable.java | 7 ++ .../quickFix/RemoveTypeArgumentsTest.java | 25 +++++++ 6 files changed, 124 insertions(+) create mode 100644 java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveTypeArgumentsFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/afterRemoveAll.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveAll.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveUnavailable.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveTypeArgumentsTest.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 3d5cc6306f28..4a0ed7347583 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -157,6 +157,9 @@ public class GenericsHighlightUtil { if (pparent instanceof PsiTypeElement) { PsiElement variable = pparent.getParent(); if (variable instanceof PsiVariable) { + if (targetParametersNum == 0) { + QuickFixAction.registerQuickFixAction(highlightInfo, new RemoveTypeArgumentsFix(variable), null); + } VariableParameterizedTypeFix.registerIntentions(highlightInfo, (PsiVariable)variable, referenceParameterList); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveTypeArgumentsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveTypeArgumentsFix.java new file mode 100644 index 000000000000..d0a5eea3c48b --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveTypeArgumentsFix.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-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 com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.intention.HighPriorityAction; +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: anna + * Date: 1/18/12 + */ +public class RemoveTypeArgumentsFix extends LocalQuickFixAndIntentionActionOnPsiElement implements HighPriorityAction { + private static final Logger LOGGER = Logger.getInstance("#" + RemoveTypeArgumentsFix.class.getName()); + + public RemoveTypeArgumentsFix(@Nullable PsiElement element) { + super(element); + } + + @NotNull + @Override + public String getText() { + return "Remove type arguments"; + } + + @NotNull + @Override + public String getFamilyName() { + return getText(); + } + + @Override + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + return startElement instanceof PsiVariable && startElement.isValid() && ((PsiVariable)startElement).getTypeElement() != null; + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable("is null when called from inspection") Editor editor, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + final PsiVariable psiVariable = (PsiVariable)startElement; + final PsiTypeElement typeElement = psiVariable.getTypeElement(); + LOGGER.assertTrue(typeElement != null); + final PsiJavaCodeReferenceElement referenceElement = typeElement.getInnermostComponentReferenceElement(); + if (referenceElement != null) { + final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); + if (parameterList != null) { + parameterList.delete(); + } + } + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/afterRemoveAll.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/afterRemoveAll.java new file mode 100644 index 000000000000..6717f0845c70 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/afterRemoveAll.java @@ -0,0 +1,7 @@ +// "Remove type arguments" "true" +abstract class SomeClass implements Some { + public abstract void doSomething(K key, Node root); +} +class Node {} +interface Some{} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveAll.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveAll.java new file mode 100644 index 000000000000..b80e08c65436 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveAll.java @@ -0,0 +1,7 @@ +// "Remove type arguments" "true" +abstract class SomeClass implements Some { + public abstract void doSomething(K key, Node root); +} +class Node {} +interface Some{} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveUnavailable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveUnavailable.java new file mode 100644 index 000000000000..23363b2c6613 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments/beforeRemoveUnavailable.java @@ -0,0 +1,7 @@ +// "Remove type arguments" "false" +abstract class SomeClass implements Some { + public abstract void doSomething(K key, Node root); +} +class Node {} +interface Some{} + diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveTypeArgumentsTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveTypeArgumentsTest.java new file mode 100644 index 000000000000..cd1a096e0d96 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveTypeArgumentsTest.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-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 com.intellij.codeInsight.daemon.quickFix; + +public class RemoveTypeArgumentsTest extends LightQuickFixTestCase { + public void test() throws Exception { doAllTests(); } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/removeTypeArguments"; + } +} -- 2.23.3