This is an automated email from the ASF dual-hosted git repository. neilcsmith pushed a commit to branch delivery in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/delivery by this push: new 6543da0774f Prevent NullPointerException when caret is not present on text component new ec09f981a4f Merge pull request #5393 from matthiasblaesing/npe_lsp 6543da0774f is described below commit 6543da0774fe19d0c65aacb1ac71b85234da647c Author: Matthias Bläsing <mblaes...@doppel-helix.eu> AuthorDate: Wed Jan 25 20:57:48 2023 +0100 Prevent NullPointerException when caret is not present on text component Observed exception: java.lang.NullPointerException: Cannot invoke "javax.swing.text.Caret.getDot()" because "this.caret" is null at java.desktop/javax.swing.text.JTextComponent.getCaretPosition(JTextComponent.java:1704) at org.netbeans.modules.lsp.client.bindings.MarkOccurrences.<init>(MarkOccurrences.java:71) at org.netbeans.modules.lsp.client.bindings.TextDocumentSyncServerCapabilityHandler.lambda$registerBackgroundTasks$6(TextDocumentSyncServerCapabilityHandler.java:330) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136) [catch] at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) --- .../client/bindings/GoToMarkOccurrencesAction.java | 7 ++++- .../lsp/client/bindings/MarkOccurrences.java | 33 ++++++++++++++++------ .../refactoring/RefactoringActionsProvider.java | 13 +++++++-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/GoToMarkOccurrencesAction.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/GoToMarkOccurrencesAction.java index 4db9dd732a6..daae26127d6 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/GoToMarkOccurrencesAction.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/GoToMarkOccurrencesAction.java @@ -20,6 +20,7 @@ package org.netbeans.modules.lsp.client.bindings; import java.awt.event.ActionEvent; +import javax.swing.text.Caret; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import org.netbeans.api.editor.EditorActionNames; @@ -115,7 +116,11 @@ public class GoToMarkOccurrencesAction extends BaseAction { private static void navigateToOccurence(boolean next, JTextComponent txt) { if (txt != null && txt.getDocument() != null) { Document doc = txt.getDocument(); - int position = txt.getCaretPosition(); + Caret caret = txt.getCaret(); + if(caret == null) { + return; + } + int position = caret.getDot(); int goTo = findOccurrencePosition(next, doc, position); if (goTo > 0) { txt.setCaretPosition(goTo); diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java index ec628363fcd..8c94a9e58c5 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java @@ -30,6 +30,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import org.eclipse.lsp4j.DocumentHighlight; @@ -63,28 +64,33 @@ public class MarkOccurrences implements BackgroundTask, CaretListener, PropertyC private Document doc; private int caretPos; + @SuppressWarnings("LeakingThisInConstructor") public MarkOccurrences(JTextComponent component) { this.component = component; + doc = component.getDocument(); + Caret caret = component.getCaret(); + caretPos = caret != null ? caret.getDot() : -1; component.addCaretListener(this); component.addPropertyChangeListener(this); - doc = component.getDocument(); - caretPos = component.getCaretPosition(); } @Override public void run(LSPBindings bindings, FileObject file) { - Document doc; - int caretPos; + Document localDoc; + int localCaretPos; synchronized (this) { - doc = this.doc; - caretPos = this.caretPos; + localDoc = this.doc; + localCaretPos = this.caretPos; } - getHighlightsBag(doc).setHighlights(computeHighlights(doc, caretPos)); + getHighlightsBag(localDoc).setHighlights(computeHighlights(localDoc, localCaretPos)); } private OffsetsBag computeHighlights(Document doc, int caretPos) { AttributeSet attr = getColoring(doc); OffsetsBag result = new OffsetsBag(doc); + if(caretPos < 0) { + return result; + } FileObject file = NbEditorUtilities.getFileObject(doc); if (file == null) { return result; @@ -128,7 +134,11 @@ public class MarkOccurrences implements BackgroundTask, CaretListener, PropertyC @Override public synchronized void caretUpdate(CaretEvent e) { - caretPos = e.getDot(); + if(e != null) { + caretPos = e.getDot(); + } else { + caretPos = -1; + } WORKER.post(() -> { FileObject file = NbEditorUtilities.getFileObject(doc); @@ -149,19 +159,23 @@ public class MarkOccurrences implements BackgroundTask, CaretListener, PropertyC OffsetsBag bag = (OffsetsBag) doc.getProperty(MarkOccurrences.class); if (bag == null) { - doc.putProperty(MarkOccurrences.class, bag = new OffsetsBag(doc, false)); + bag = new OffsetsBag(doc, false); + doc.putProperty(MarkOccurrences.class, bag); Object stream = doc.getProperty(Document.StreamDescriptionProperty); final OffsetsBag bagFin = bag; DocumentListener l = new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { bagFin.removeHighlights(e.getOffset(), e.getOffset(), false); } + @Override public void removeUpdate(DocumentEvent e) { bagFin.removeHighlights(e.getOffset(), e.getOffset(), false); } + @Override public void changedUpdate(DocumentEvent e) { } }; @@ -180,6 +194,7 @@ public class MarkOccurrences implements BackgroundTask, CaretListener, PropertyC @MimeRegistration(mimeType = "", service = HighlightsLayerFactory.class) public static class HighlightsLayerFactoryImpl implements HighlightsLayerFactory { + @Override public HighlightsLayer[] createLayers(HighlightsLayerFactory.Context context) { return new HighlightsLayer[]{ //the mark occurrences layer should be "above" current row and "below" the search layers: diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java index cf5d4551b18..a369be6927e 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java @@ -24,6 +24,7 @@ import javax.swing.JEditorPane; import javax.swing.SwingUtilities; import javax.swing.text.AbstractDocument; import javax.swing.text.BadLocationException; +import javax.swing.text.Caret; import javax.swing.text.Document; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.ReferenceContext; @@ -70,7 +71,11 @@ public class RefactoringActionsProvider extends ActionsImplementationProvider{ AbstractDocument abstractDoc = (doc instanceof AbstractDocument) ? ((AbstractDocument) doc) : null; FileObject file = NbEditorUtilities.getFileObject(doc); LSPBindings bindings = LSPBindings.getBindings(file); - int caretPos = c.getCaretPosition(); + Caret caret = c.getCaret(); + if(caret == null) { + return; + } + int caretPos = caret.getDot(); Position pos = Utils.createPosition(doc, caretPos); ReferenceParams params = new ReferenceParams(); params.setTextDocument(new TextDocumentIdentifier(Utils.toURI(file))); @@ -118,7 +123,11 @@ public class RefactoringActionsProvider extends ActionsImplementationProvider{ AbstractDocument abstractDoc = (doc instanceof AbstractDocument) ? ((AbstractDocument) doc) : null; FileObject file = NbEditorUtilities.getFileObject(doc); LSPBindings bindings = LSPBindings.getBindings(file); - int caretPos = c.getCaretPosition(); + Caret caret = c.getCaret(); + if(caret == null) { + return; + } + int caretPos = caret.getDot(); Position pos = Utils.createPosition(doc, caretPos); String name; if(abstractDoc != null) { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists