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

Reply via email to