diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java index 0d5b7802b9e8..5966fbf38d36 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java @@ -27,6 +27,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -35,14 +36,14 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class AddTypeCastFix implements IntentionAction { +public class AddTypeCastFix extends LocalQuickFixAndIntentionActionOnPsiElement { private final PsiType myType; - private final PsiExpression myExpression; public AddTypeCastFix(PsiType type, PsiExpression expression) { + super(expression); myType = type; - myExpression = expression; } @Override @@ -58,14 +59,21 @@ public class AddTypeCastFix implements IntentionAction { } @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - return myType.isValid() && myExpression.isValid() && myExpression.getManager().isInProject(myExpression); + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + return myType.isValid() && startElement.isValid() && startElement.getManager().isInProject(startElement); } @Override - public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable("is null when called from inspection") Editor editor, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { if (!CodeInsightUtilBase.prepareFileForWrite(file)) return; - addTypeCast(project, myExpression, myType); + addTypeCast(project, (PsiExpression)startElement, myType); } private static void addTypeCast(Project project, PsiExpression originalExpression, PsiType type) throws IncorrectOperationException { diff --git a/platform/lang-impl/src/com/intellij/codeInspection/DefaultHighlightVisitorBasedInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/DefaultHighlightVisitorBasedInspection.java index 2bb0ff86c664..935c80220789 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/DefaultHighlightVisitorBasedInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/DefaultHighlightVisitorBasedInspection.java @@ -19,6 +19,7 @@ package com.intellij.codeInspection; import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeInsight.daemon.impl.*; import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder; +import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; @@ -108,10 +109,10 @@ public abstract class DefaultHighlightVisitorBasedInspection extends GlobalSimpl if (element == null) { element = file; } + GlobalInspectionUtil.createProblem( element, - info.description, - HighlightInfo.convertType(info.type), + info, range.shiftRight(-element.getNode().getStartOffset()), info.getProblemGroup(), manager, diff --git a/platform/lang-impl/src/com/intellij/codeInspection/GlobalInspectionUtil.java b/platform/lang-impl/src/com/intellij/codeInspection/GlobalInspectionUtil.java index 04214ea5be0b..6ddaf3ead1b0 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/GlobalInspectionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/GlobalInspectionUtil.java @@ -16,13 +16,19 @@ package com.intellij.codeInspection; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.reference.RefElement; import com.intellij.lang.injection.InjectedLanguageManager; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + /** * User: Maxim.Mossienko * Date: 16.09.2009 @@ -46,15 +52,22 @@ public class GlobalInspectionUtil { return message + LOC_MARKER; } - public static void createProblem(PsiElement elt, String message, ProblemHighlightType problemHighlightType, TextRange range, + public static void createProblem(PsiElement elt, HighlightInfo info, TextRange range, @Nullable String problemGroup, InspectionManager manager, ProblemDescriptionsProcessor problemDescriptionsProcessor, GlobalInspectionContext globalContext) { - ProblemDescriptor descriptor = manager.createProblemDescriptor( - elt, - range, - createInspectionMessage(message), - problemHighlightType, false); + List fixes = new ArrayList(); + if (info.quickFixActionRanges != null) { + for (Pair actionRange : info.quickFixActionRanges) { + final IntentionAction action = actionRange.getFirst().getAction(); + if (action instanceof LocalQuickFix) { + fixes.add((LocalQuickFix)action); + } + } + } + ProblemDescriptor descriptor = manager.createProblemDescriptor(elt, range, createInspectionMessage(info.description), + HighlightInfo.convertType(info.type), false, + fixes.isEmpty() ? null : fixes.toArray(new LocalQuickFix[fixes.size()])); descriptor.setProblemGroup(problemGroup); problemDescriptionsProcessor.addProblemElement( retrieveRefElement(elt, globalContext), diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java index 34fa3bc3ac1b..50a9665f00e0 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java @@ -47,11 +47,9 @@ public class XmlHighlightVisitorBasedInspection extends GlobalSimpleInspectionTo @Override public boolean add(@Nullable HighlightInfo info) { if (info != null) { - ProblemHighlightType problemHighlightType = HighlightInfo.convertType(info.type); GlobalInspectionUtil.createProblem( file, - info.description, - problemHighlightType, + info, new TextRange(info.startOffset, info.endOffset), null, manager,