diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GenerifyFileFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GenerifyFileFix.java index 11ed68014b75..010d04ecb693 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GenerifyFileFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GenerifyFileFix.java @@ -25,21 +25,22 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.refactoring.actions.TypeCookAction; import org.jetbrains.annotations.NotNull; public class GenerifyFileFix implements IntentionAction, LocalQuickFix { - private final PsiFile myFile; + private final String myFileName; - public GenerifyFileFix(PsiFile file) { - myFile = file; + public GenerifyFileFix(String fileName) { + myFileName = fileName; } @NotNull public String getText() { - return QuickFixBundle.message("generify.text", myFile.getName()); + return QuickFixBundle.message("generify.text", myFileName); } @NotNull @@ -55,21 +56,23 @@ public class GenerifyFileFix implements IntentionAction, LocalQuickFix { @Override public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { - if (isAvailable(project, null, null)) { + final PsiElement element = descriptor.getPsiElement(); + if (element == null) return; + if (isAvailable(project, null, element.getContainingFile())) { new WriteCommandAction(project) { protected void run(Result result) throws Throwable { - invoke(project, FileEditorManager.getInstance(project).getSelectedTextEditor(), descriptor.getPsiElement().getContainingFile()); + invoke(project, FileEditorManager.getInstance(project).getSelectedTextEditor(), element.getContainingFile()); } }.execute(); } } public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return myFile.isValid() && PsiManager.getInstance(project).isInProject(myFile); + return file != null && file.isValid() && PsiManager.getInstance(project).isInProject(file); } public void invoke(@NotNull Project project, Editor editor, PsiFile file) { - if (!CodeInsightUtilBase.prepareFileForWrite(myFile)) return; + if (!CodeInsightUtilBase.prepareFileForWrite(file)) return; new TypeCookAction().getHandler().invoke(project, editor, file, null); } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java index 8f49b6883cd7..5818702ec324 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -315,24 +315,20 @@ public class DataFlowInspection extends BaseLocalInspectionTool { @Nullable private static LocalQuickFix createSimplifyBooleanExpressionFix(PsiElement element, final boolean value) { - if (!(element instanceof PsiExpression)) return null; - final PsiExpression expression = (PsiExpression)element; - while (element.getParent() instanceof PsiExpression) { - element = element.getParent(); - } - final SimplifyBooleanExpressionFix fix = new SimplifyBooleanExpressionFix(expression, value); - // simplify intention already active - if (!fix.isAvailable(element.getProject(), null, element.getContainingFile()) || - SimplifyBooleanExpressionFix.canBeSimplified((PsiExpression)element)) { - return null; - } + SimplifyBooleanExpressionFix fix = createIntention(element, value); + if (fix == null) return null; + final String text = fix.getText(); return new LocalQuickFix() { - @NotNull public String getName() { - return fix.getText(); + @NotNull + public String getName() { + return text; } public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement psiElement = descriptor.getPsiElement(); + if (psiElement == null) return; + final SimplifyBooleanExpressionFix fix = createIntention(psiElement, value); + if (fix==null) return; try { LOG.assertTrue(psiElement.isValid()); fix.invoke(project, null, psiElement.getContainingFile()); @@ -349,6 +345,21 @@ public class DataFlowInspection extends BaseLocalInspectionTool { }; } + private static SimplifyBooleanExpressionFix createIntention(PsiElement element, boolean value) { + if (!(element instanceof PsiExpression)) return null; + final PsiExpression expression = (PsiExpression)element; + while (element.getParent() instanceof PsiExpression) { + element = element.getParent(); + } + final SimplifyBooleanExpressionFix fix = new SimplifyBooleanExpressionFix(expression, value); + // simplify intention already active + if (!fix.isAvailable(element.getProject(), null, element.getContainingFile()) || + SimplifyBooleanExpressionFix.canBeSimplified((PsiExpression)element)) { + return null; + } + return fix; + } + private static class RedundantInstanceofFix implements LocalQuickFix { @NotNull public String getName() { diff --git a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java index 9c4b90c9a5ab..d4b1ed0fd9f9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java @@ -33,6 +33,7 @@ import com.intellij.ui.FieldPanel; import com.intellij.ui.IdeBorderFactory; import com.intellij.util.IJSwingUtilities; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -326,7 +327,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { final PsiDocTag tag = factory.createDocTagFromText("@" + myTag + " " + myValue); if (docComment != null) { PsiElement addedTag; - final PsiElement anchor = getAnchor(); + final PsiElement anchor = getAnchor(descriptor); if (anchor != null) { addedTag = docComment.addBefore(tag, anchor); } @@ -343,7 +344,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } @Nullable - protected PsiElement getAnchor() { + protected PsiElement getAnchor(ProblemDescriptor descriptor) { return null; } @@ -742,24 +743,36 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { PsiParameter param, final InspectionManager manager, boolean isOnTheFly) { String message = InspectionsBundle.message("inspection.javadoc.method.problem.missing.param.tag", "@param", "" + param.getName() + ""); - return createDescriptor(elementToHighlight, message, new AddMissingParamTagFix(param), manager, isOnTheFly); + return createDescriptor(elementToHighlight, message, new AddMissingParamTagFix(param.getName()), manager, isOnTheFly); } private static class AddMissingParamTagFix extends AddMissingTagFix { - private final PsiParameter myParam; + private final String myName; - public AddMissingParamTagFix(final PsiParameter param) { - super("param", param.getName()); - myParam = param; + public AddMissingParamTagFix(String name) { + super("param", name); + myName = name; } @NotNull public String getName() { - return InspectionsBundle.message("inspection.javadoc.problem.add.param.tag", myParam.getName()); + return InspectionsBundle.message("inspection.javadoc.problem.add.param.tag", myName); } @Nullable - protected PsiElement getAnchor() { + protected PsiElement getAnchor(ProblemDescriptor descriptor) { + PsiElement element = descriptor.getPsiElement(); + PsiElement parent = element == null ? null : element.getParent(); + if (!(parent instanceof PsiMethod)) return null; + PsiParameter[] parameters = ((PsiMethod)parent).getParameterList().getParameters(); + PsiParameter myParam = ContainerUtil.find(parameters, new Condition() { + @Override + public boolean value(PsiParameter psiParameter) { + return myName.equals(psiParameter.getName()); + } + }); + if (myParam == null) return null; + final PsiMethod psiMethod = PsiTreeUtil.getParentOfType(myParam, PsiMethod.class); LOG.assertTrue(psiMethod != null); final PsiDocComment docComment = psiMethod.getDocComment(); @@ -938,12 +951,12 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { if (tagInfo == null) { problems.add( createDescriptor(nameElement, InspectionsBundle.message("inspection.javadoc.problem.wrong.tag", "" + tagName + ""), - new AddUnknownTagToCustoms(tag), inspectionManager, isOnTheFly)); + new AddUnknownTagToCustoms(tag.getName()), inspectionManager, isOnTheFly)); } else { problems.add(createDescriptor(nameElement, InspectionsBundle.message("inspection.javadoc.problem.disallowed.tag", "" + tagName + ""), - new AddUnknownTagToCustoms(tag), inspectionManager, isOnTheFly)); + new AddUnknownTagToCustoms(tag.getName()), inspectionManager, isOnTheFly)); } } return false; @@ -1129,15 +1142,15 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } private class AddUnknownTagToCustoms implements LocalQuickFix { - PsiDocTag myTag; + private final String myTag; - public AddUnknownTagToCustoms(PsiDocTag tag) { + public AddUnknownTagToCustoms(String tag) { myTag = tag; } @NotNull public String getName() { - return QuickFixBundle.message("add.doctag.to.custom.tags", myTag.getName()); + return QuickFixBundle.message("add.doctag.to.custom.tags", myTag); } @NotNull @@ -1146,12 +1159,12 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - if (myTag == null || !myTag.isValid()) return; + if (myTag == null) return; if (myAdditionalJavadocTags.length() > 0) { - myAdditionalJavadocTags += "," + myTag.getName(); + myAdditionalJavadocTags += "," + myTag; } else { - myAdditionalJavadocTags = myTag.getName(); + myAdditionalJavadocTags = myTag; } final InspectionProfile inspectionProfile = InspectionProjectProfileManager.getInstance(project).getInspectionProfile(); diff --git a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocReferenceInspection.java b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocReferenceInspection.java index 77b76a3b4f26..531cd52c4f2d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocReferenceInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocReferenceInspection.java @@ -179,7 +179,7 @@ public class JavaDocReferenceInspection extends BaseLocalInspectionTool { } } } - fixes.add(new RemoveTagFix(tagName, paramName, tag)); + fixes.add(new RemoveTagFix(tagName, paramName)); problems.add(inspectionManager.createProblemDescriptor(valueElement, reference.getRangeInElement(), cannotResolveSymbolMessage(params), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, onTheFly, @@ -300,12 +300,10 @@ public class JavaDocReferenceInspection extends BaseLocalInspectionTool { private static class RemoveTagFix implements LocalQuickFix { private final String myTagName; private final CharSequence myParamName; - private final PsiDocTag myTag; - public RemoveTagFix(String tagName, CharSequence paramName, PsiDocTag tag) { + public RemoveTagFix(String tagName, CharSequence paramName) { myTagName = tagName; myParamName = paramName; - myTag = tag; } @NotNull @@ -319,6 +317,8 @@ public class JavaDocReferenceInspection extends BaseLocalInspectionTool { } public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + final PsiDocTag myTag = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiDocTag.class); + if (myTag == null) return; myTag.delete(); } } diff --git a/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java index 33b5133dbe33..319e94db2df5 100644 --- a/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java @@ -213,7 +213,7 @@ public class UncheckedWarningLocalInspection extends BaseJavaLocalInspectionTool if (GenericsHighlightUtil.isUncheckedCast(castType, exprType)) { final String description = JavaErrorMessages.message("generics.unchecked.cast", HighlightUtil.formatType(exprType), HighlightUtil.formatType(castType)); - registerProblem(description, expression, myOnTheFly ? new GenerifyFileFix(operand.getContainingFile()) : null); + registerProblem(description, expression, myOnTheFly ? new GenerifyFileFix(operand.getContainingFile().getName()) : null); } } @@ -227,7 +227,7 @@ public class UncheckedWarningLocalInspection extends BaseJavaLocalInspectionTool if (IGNORE_UNCHECKED_CALL) return; registerProblem(description, callExpression instanceof PsiMethodCallExpression ? ((PsiMethodCallExpression)callExpression).getMethodExpression() - : callExpression, myOnTheFly ? new GenerifyFileFix(callExpression.getContainingFile()) : null); + : callExpression, myOnTheFly ? new GenerifyFileFix(callExpression.getContainingFile().getName()) : null); } else { if (IGNORE_UNCHECKED_ASSIGNMENT) return; @@ -245,7 +245,7 @@ public class UncheckedWarningLocalInspection extends BaseJavaLocalInspectionTool final PsiType parameterType = substitutor.substitute(parameter.getType()); final PsiType expressionType = substitutor.substitute(expression.getType()); if (expressionType != null) { - checkRawToGenericsAssignment(expression, parameterType, expressionType, true, myOnTheFly ? new GenerifyFileFix(expression.getContainingFile()) : null); + checkRawToGenericsAssignment(expression, parameterType, expressionType, true, myOnTheFly ? new GenerifyFileFix(expression.getContainingFile().getName()) : null); } } } diff --git a/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixAndIntentionActionOnPsiElement.java b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixAndIntentionActionOnPsiElement.java new file mode 100644 index 000000000000..c93338b8e33a --- /dev/null +++ b/platform/lang-api/src/com/intellij/codeInspection/LocalQuickFixAndIntentionActionOnPsiElement.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2011 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.codeInspection; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class LocalQuickFixAndIntentionActionOnPsiElement implements LocalQuickFix, IntentionAction { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.LocalQuickFixAndIntentionAction"); + private final SmartPsiElementPointer myStartElement; + private final SmartPsiElementPointer myEndElement; + + protected LocalQuickFixAndIntentionActionOnPsiElement(@Nullable PsiElement element) { + this(element, element); + } + protected LocalQuickFixAndIntentionActionOnPsiElement(@Nullable PsiElement startElement, @Nullable PsiElement endElement) { + if (startElement == null || endElement == null) { + myStartElement = myEndElement = null; + return; + } + LOG.assertTrue(startElement.isValid()); + LOG.assertTrue(endElement == startElement || endElement.isValid()); + PsiFile containingFile = startElement.getContainingFile(); + LOG.assertTrue(endElement == startElement || containingFile == endElement.getContainingFile()); + myStartElement = SmartPointerManager.getInstance(containingFile.getProject()).createSmartPsiElementPointer(startElement); + myEndElement = endElement == startElement ? null : SmartPointerManager.getInstance(containingFile.getProject()).createSmartPsiElementPointer(endElement); + } + + @Override + public final void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + if (file == null||myStartElement==null) return; + final PsiElement startElement = myStartElement.getElement(); + final PsiElement endElement = myEndElement == null ? startElement : myEndElement.getElement(); + if (startElement == null || endElement == null) return; + invoke(project, file, startElement, endElement); + } + + @Override + public final void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + if (myStartElement == null) return; + final PsiElement startElement = myStartElement.getElement(); + final PsiElement endElement = myEndElement == null ? startElement : myEndElement.getElement(); + if (startElement == null || endElement == null) return; + invoke(project, startElement.getContainingFile(), startElement, endElement); + } + + @Override + public final boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + if (myStartElement == null) return false; + final PsiElement startElement = myStartElement.getElement(); + final PsiElement endElement = myEndElement == null ? startElement : myEndElement.getElement(); + return startElement != null && + endElement != null && + startElement.isValid() && + (endElement == startElement || endElement.isValid()) && + isAvailable(project, file, startElement, endElement); + } + + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + return true; + } + + public PsiElement getStartElement() { + return myStartElement.getElement(); + } + + public abstract void invoke(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement); +} diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java index 58a60035e6ac..bd909ee2a6e3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java @@ -77,7 +77,7 @@ public class IfCanBeSwitchInspection extends BaseInspection { @Override protected InspectionGadgetsFix buildFix(Object... infos) { - return new IfCanBeSwitchFix((PsiExpression) infos[0]); + return new IfCanBeSwitchFix(minimumBranches); } @Override @@ -146,12 +146,11 @@ public class IfCanBeSwitchInspection extends BaseInspection { } private static class IfCanBeSwitchFix extends InspectionGadgetsFix { + private final int myMinimumBranches; - private final PsiExpression switchExpression; - - public IfCanBeSwitchFix(PsiExpression switchExpression) { - this.switchExpression = switchExpression; - } + public IfCanBeSwitchFix(int minimumBranches) { + myMinimumBranches = minimumBranches; + } @NotNull public String getName() { @@ -193,8 +192,12 @@ public class IfCanBeSwitchInspection extends BaseInspection { final List branches = new ArrayList(20); - while (true) { - final PsiExpression condition = ifStatement.getCondition(); + final PsiExpression switchExpression = + SwitchUtils.getSwitchExpression(ifStatement, myMinimumBranches); + if (switchExpression == null) return; + while (true) { + final PsiExpression condition = ifStatement.getCondition(); + final List labels = getValuesFromExpression(condition, switchExpression, new ArrayList()); diff --git a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java index 510abd5cb1f7..fff029931e9f 100644 --- a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java +++ b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java @@ -361,33 +361,24 @@ public class I18nInspection extends BaseLocalInspectionTool { return problems.isEmpty() ? null : problems.toArray(new ProblemDescriptor[problems.size()]); } - private static LocalQuickFix createIntroduceConstantFix(final PsiExpression... expressions) { - //noinspection unchecked - final SmartPsiElementPointer[] pointers = new SmartPsiElementPointer[expressions.length]; - for(int i=0; i exprList = new ArrayList(); - for (SmartPsiElementPointer ptr : pointers) { - PsiExpression expr = ptr.getElement(); - if (expr != null && expr.isValid()) { - exprList.add(expr); - } - } - new IntroduceConstantHandler().invoke(project, exprList.toArray(new PsiExpression[exprList.size()])); - } - }; + public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { //do it later because it is invoked from write action - ApplicationManager.getApplication().invokeLater(runnable); + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiExpression)) return; + + PsiExpression[] expressions = {(PsiExpression)element}; + new IntroduceConstantHandler().invoke(project, expressions); + } + }, project.getDisposed()); } @NotNull @@ -439,7 +430,7 @@ public class I18nInspection extends BaseLocalInspectionTool { fixes.add(I18N_QUICK_FIX); if (!isNotConstantFieldInitializer(expression)) { - fixes.add(createIntroduceConstantFix(expression)); + fixes.add(createIntroduceConstantFix()); } final Project project = expression.getManager().getProject(); @@ -454,9 +445,10 @@ public class I18nInspection extends BaseLocalInspectionTool { } } - final ProblemDescriptor problem = myManager - .createProblemDescriptor(expression, - description, myOnTheFly, fixes.toArray(new LocalQuickFix[fixes.size()]), ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + LocalQuickFix[] farr = fixes.toArray(new LocalQuickFix[fixes.size()]); + final ProblemDescriptor problem = myManager.createProblemDescriptor(expression, + description, myOnTheFly, farr, + ProblemHighlightType.GENERIC_ERROR_OR_WARNING); myProblems.add(problem); } } diff --git a/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownAttributeInspection.java b/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownAttributeInspection.java index 334f59f371b9..991e9b4f7dd4 100644 --- a/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownAttributeInspection.java +++ b/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownAttributeInspection.java @@ -101,7 +101,7 @@ public class HtmlUnknownAttributeInspection extends HtmlUnknownTagInspection { boolean maySwitchToHtml5 = HtmlUtil.isCustomHtml5Attribute(name) && !HtmlUtil.hasNonHtml5Doctype(tag); LocalQuickFix[] quickfixes = new LocalQuickFix[maySwitchToHtml5 ? 3 : 2]; quickfixes[0] = new AddCustomTagOrAttributeIntentionAction(getShortName(), name, XmlEntitiesInspection.UNKNOWN_ATTRIBUTE); - quickfixes[1] = new RemoveAttributeIntentionAction(name, attribute); + quickfixes[1] = new RemoveAttributeIntentionAction(name); if (maySwitchToHtml5) { quickfixes[2] = new SwitchToHtml5WithHighPriorityAction(); } diff --git a/xml/impl/src/com/intellij/codeInspection/htmlInspections/RemoveAttributeIntentionAction.java b/xml/impl/src/com/intellij/codeInspection/htmlInspections/RemoveAttributeIntentionAction.java index 33793cbf9235..a4eb248034a5 100644 --- a/xml/impl/src/com/intellij/codeInspection/htmlInspections/RemoveAttributeIntentionAction.java +++ b/xml/impl/src/com/intellij/codeInspection/htmlInspections/RemoveAttributeIntentionAction.java @@ -24,6 +24,7 @@ import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttribute; import org.jetbrains.annotations.NotNull; @@ -32,11 +33,9 @@ import org.jetbrains.annotations.NotNull; */ public class RemoveAttributeIntentionAction implements LocalQuickFix { private final String myLocalName; - private final XmlAttribute myAttribute; - public RemoveAttributeIntentionAction(final String localName, final XmlAttribute attribute) { + public RemoveAttributeIntentionAction(final String localName) { myLocalName = localName; - myAttribute = attribute; } @NotNull @@ -50,28 +49,18 @@ public class RemoveAttributeIntentionAction implements LocalQuickFix { } public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { + PsiElement e = descriptor.getPsiElement(); + final XmlAttribute myAttribute = PsiTreeUtil.getParentOfType(e, XmlAttribute.class); + if (myAttribute == null) return; + if (!CodeInsightUtilBase.prepareFileForWrite(myAttribute.getContainingFile())) { return; } - PsiElement next = findNextAttribute(myAttribute); new WriteCommandAction(project) { protected void run(final Result result) throws Throwable { myAttribute.delete(); } }.execute(); - - //if (next != null) { - // editor.getCaretModel().moveToOffset(next.getTextRange().getStartOffset()); - //} - } - - private static PsiElement findNextAttribute(final XmlAttribute attribute) { - PsiElement nextSibling = attribute.getNextSibling(); - while (nextSibling != null) { - if (nextSibling instanceof XmlAttribute) return nextSibling; - nextSibling = nextSibling.getNextSibling(); - } - return null; } } diff --git a/xml/impl/src/com/intellij/codeInspection/htmlInspections/XmlWrongRootElementInspection.java b/xml/impl/src/com/intellij/codeInspection/htmlInspections/XmlWrongRootElementInspection.java index ab9eb0c8c7b0..a1f408ed8d23 100644 --- a/xml/impl/src/com/intellij/codeInspection/htmlInspections/XmlWrongRootElementInspection.java +++ b/xml/impl/src/com/intellij/codeInspection/htmlInspections/XmlWrongRootElementInspection.java @@ -21,15 +21,16 @@ import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.daemon.XmlErrorMessages; import com.intellij.codeInsight.daemon.impl.analysis.XmlHighlightVisitor; import com.intellij.codeInspection.*; +import com.intellij.lang.ASTNode; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.html.HtmlTag; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.xml.XmlBundle; import com.intellij.xml.util.XmlUtil; -import com.intellij.lang.ASTNode; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -107,29 +108,7 @@ public class XmlWrongRootElementInspection extends HtmlLocalInspectionTool { if (tag instanceof HtmlTag) { return; // it is legal to have html / head / body omitted } - final LocalQuickFix localQuickFix = new LocalQuickFix() { - @NotNull - public String getName() { - return XmlBundle.message("change.root.element.to", doctype.getNameElement().getText()); - } - - @NotNull - public String getFamilyName() { - return getName(); - } - - public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { - if (!CodeInsightUtilBase.prepareFileForWrite(tag.getContainingFile())) { - return; - } - - new WriteCommandAction(project) { - protected void run(final Result result) throws Throwable { - tag.setName(doctype.getNameElement().getText()); - } - }.execute(); - } - }; + final LocalQuickFix localQuickFix = new MyLocalQuickFix(doctype.getNameElement().getText()); holder.registerProblem(XmlChildRole.START_TAG_NAME_FINDER.findChild(tag.getNode()).getPsi(), XmlErrorMessages.message("wrong.root.element"), @@ -147,4 +126,36 @@ public class XmlWrongRootElementInspection extends HtmlLocalInspectionTool { } } } + + private static class MyLocalQuickFix implements LocalQuickFix { + private final String myText; + + public MyLocalQuickFix(String text) { + myText = text; + } + + @NotNull + public String getName() { + return XmlBundle.message("change.root.element.to", myText); + } + + @NotNull + public String getFamilyName() { + return getName(); + } + + public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { + final XmlTag myTag = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), XmlTag.class); + + if (!CodeInsightUtilBase.prepareFileForWrite(myTag.getContainingFile())) { + return; + } + + new WriteCommandAction(project) { + protected void run(final Result result) throws Throwable { + myTag.setName(myText); + } + }.execute(); + } + } } diff --git a/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java b/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java index 728e91eab011..af0b0e57e1a9 100644 --- a/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java +++ b/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java @@ -68,41 +68,7 @@ public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool { return; } - final LocalQuickFix fix = new LocalQuickFix() { - @NotNull - public String getName() { - return XmlBundle.message("html.inspections.check.empty.script.tag.fix.message"); - } - - public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - final XmlTag tag = (XmlTag)descriptor.getPsiElement(); - if (tag == null) return; - final PsiFile psiFile = tag.getContainingFile(); - - if (psiFile == null) return; - ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(psiFile.getVirtualFile()); - - final StringBuilder builder = new StringBuilder(tag.getText()); - builder.replace(builder.length() - 2, builder.length(), ">"); - - try { - final FileType fileType = psiFile.getFileType(); - PsiFile file = PsiFileFactory.getInstance(tag.getProject()).createFileFromText( - "dummy." + (fileType == StdFileTypes.JSP || tag.getContainingFile().getLanguage() == HTMLLanguage.INSTANCE ? "html" : "xml"), builder.toString()); - - tag.replace(((XmlFile)file).getDocument().getRootTag()); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } - } - - //to appear in "Apply Fix" statement when multiple Quick Fixes exist - @NotNull - public String getFamilyName() { - return getName(); - } - }; + final LocalQuickFix fix = new MyLocalQuickFix(); holder.registerProblem(tag, XmlBundle.message("html.inspections.check.empty.script.message"), @@ -138,4 +104,40 @@ public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool { public String getShortName() { return "CheckEmptyScriptTag"; } + + private static class MyLocalQuickFix implements LocalQuickFix { + @NotNull + public String getName() { + return XmlBundle.message("html.inspections.check.empty.script.tag.fix.message"); + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + final XmlTag tag = (XmlTag)descriptor.getPsiElement(); + if (tag == null) return; + final PsiFile psiFile = tag.getContainingFile(); + + if (psiFile == null) return; + ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(psiFile.getVirtualFile()); + + final StringBuilder builder = new StringBuilder(tag.getText()); + builder.replace(builder.length() - 2, builder.length(), ">"); + + try { + final FileType fileType = psiFile.getFileType(); + PsiFile file = PsiFileFactory.getInstance(tag.getProject()).createFileFromText( + "dummy." + (fileType == StdFileTypes.JSP || tag.getContainingFile().getLanguage() == HTMLLanguage.INSTANCE ? "html" : "xml"), builder.toString()); + + tag.replace(((XmlFile)file).getDocument().getRootTag()); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + + //to appear in "Apply Fix" statement when multiple Quick Fixes exist + @NotNull + public String getFamilyName() { + return getName(); + } + } }