diff --git a/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/AnnotationHolder.java b/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/AnnotationHolder.java index 6d9e78b8a41e..12306f4d3255 100644 --- a/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/AnnotationHolder.java +++ b/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/AnnotationHolder.java @@ -74,16 +74,15 @@ import org.netbeans.spi.editor.highlighting.support.OffsetsBag; import org.netbeans.spi.editor.hints.ErrorDescription; import org.netbeans.spi.editor.hints.ErrorDescriptionFactory; +import org.netbeans.spi.editor.hints.Fix; import org.netbeans.spi.editor.hints.LazyFixList; import org.netbeans.spi.editor.hints.Severity; import org.openide.cookies.EditorCookie; import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.text.Annotation; import org.openide.text.NbDocument; -import org.openide.util.RequestProcessor; -import org.openide.util.WeakListeners; -import org.openide.filesystems.FileUtil; import org.openide.text.PositionBounds; import org.openide.util.Exceptions; import org.openide.util.Lookup; @@ -91,7 +90,9 @@ import org.openide.util.LookupListener; import org.openide.util.NbBundle; import org.openide.util.Pair; +import org.openide.util.RequestProcessor; import org.openide.util.RequestProcessor.Task; +import org.openide.util.WeakListeners; /** * @@ -1394,6 +1395,42 @@ public void run() { return result[0]; } + public synchronized void removeErrorForFixOnLine(Fix fix, int line) throws IOException, BadLocationException { + Position pos = getPosition(line, false); + List errs = getErrorsForLine(pos, false); + + List errsToRemove = new ArrayList<>(); // Should be 1, but uses List just in case + for (ErrorDescription err : errs) { + if (err.getFixes().getFixes().contains(fix)) { + errsToRemove.add(err); + } + } + + Map> layers = new HashMap<>(); + for (ErrorDescription ed : errsToRemove) { + for (Entry> layer : layer2Errors.entrySet()) { + String key = layer.getKey(); + List val = layer.getValue(); + for (ErrorDescription err : val) { + if (!ed.equals(err)) { + continue; + } + if (!layers.containsKey(key)) { + layers.put(key, new ArrayList<>(val)); + } + layers.get(key).remove(ed); + } + } + } + + for (Entry> entry : layers.entrySet()) { + String key = entry.getKey(); + List val = entry.getValue(); + setErrorDescriptions(key, val, false); + } + } + + private static final boolean ENABLE_ASSERTS = Boolean.getBoolean(AnnotationHolder.class.getName() + ".enableAsserts200469"); private static class PositionComparator implements Comparator { diff --git a/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/HintsUI.java b/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/HintsUI.java index e0112d03fc97..26b20ef1571a 100644 --- a/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/HintsUI.java +++ b/ide/spi.editor.hints/src/org/netbeans/modules/editor/hints/HintsUI.java @@ -76,6 +76,8 @@ import javax.swing.text.JTextComponent; import javax.swing.text.Position; import org.netbeans.api.editor.EditorRegistry; +import org.netbeans.api.editor.document.LineDocument; +import org.netbeans.api.editor.document.LineDocumentUtils; import org.netbeans.api.editor.mimelookup.MimeLookup; import org.netbeans.api.editor.settings.EditorStyleConstants; import org.netbeans.editor.AnnotationDesc; @@ -350,7 +352,7 @@ public void showPopup(FixData hints) { } } - public void showPopup(FixData fixes, String description, JTextComponent component, Point position) { + public void showPopup(FixData fixes, String description, JTextComponent component, Point position) { removeHints(); setComponent(component); JTextComponent comp = getComponent(); @@ -630,7 +632,6 @@ boolean invokeDefaultAction(boolean onlyActive) { String description; if (!onlyActive) { - refresh(doc, comp.getCaretPosition()); AnnotationHolder holder = getAnnotationHolder(doc); Pair fixData = holder != null ? holder.buildUpFixDataForLine(line) : null; @@ -807,6 +808,9 @@ private void invokeHint (final Fix f) { t = RequestProcessor.getDefault().post(new Runnable() { public void run() { try { + int line = LineDocumentUtils.getLineIndex((LineDocument) component.getDocument(), component.getCaretPosition()); + AnnotationHolder holder = getAnnotationHolder(component.getDocument()); + holder.removeErrorForFixOnLine(f, line); changes = f.implement(); } catch (GuardedException ge) { reportGuardedException(component, ge);