This is an automated email from the ASF dual-hosted git repository.

mbien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new ab3fecb1a7 safer auto completion chaining
     new 495ab3f111 Merge pull request #4165 from mbien/check-completion-invoke
ab3fecb1a7 is described below

commit ab3fecb1a7b34971286cbac62e4f4e5c72471753
Author: Michael Bien <[email protected]>
AuthorDate: Fri May 27 21:25:03 2022 +0200

    safer auto completion chaining
    
     - attempting to open the next completion can cause problems if the
       completion itself is not implemented properly (infinite completion
       loops)
     - to mitigate this we can check if the last removed group of the
       template had "completionInvoke" set, so that for example constructor
       completions still works as expected
    
    follow up on #2519, #3290
---
 .../codetemplates/CodeTemplateInsertHandler.java   | 38 ++++++++++++++--------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git 
a/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
 
b/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
index d902a873d8..cb15ca4b36 100644
--- 
a/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
+++ 
b/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
@@ -109,7 +109,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
     private TextSyncGroup textSyncGroup;
     
     private boolean completionInvoked;
-    
+
     public CodeTemplateInsertHandler(
         CodeTemplate codeTemplate,
         JTextComponent component, 
@@ -127,7 +127,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
 
         setParametrizedText(codeTemplate.getParametrizedText());
 
-        processors = new ArrayList<CodeTemplateProcessor>();
+        processors = new ArrayList<>();
         for (CodeTemplateProcessorFactory factory : processorFactories) {
             processors.add(factory.createProcessor(this.request));
         }
@@ -184,8 +184,9 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
     
     public void setParametrizedText(String parametrizedText) {
         int idx = 0;
-        while(idx < parametrizedText.length() && 
Character.isWhitespace(parametrizedText.charAt(idx)))
+        while(idx < parametrizedText.length() && 
Character.isWhitespace(parametrizedText.charAt(idx))) {
             idx++;
+        }
         this.parametrizedText = 
CharacterConversions.lineSeparatorToLineFeed(idx > 0 ? 
parametrizedText.substring(idx) : parametrizedText);
         parseParametrizedText();
     }
@@ -226,10 +227,6 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
         }
         // Insert the template into document
         insertTemplate();
-
-        if (masterParameters.stream().noneMatch(param -> param.isEditable())) {
-            SwingUtilities.invokeLater(Completion.get()::showCompletion);
-        }
     }
 
     void checkInsertTextBuilt() {
@@ -279,6 +276,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
         return completionInvoked;
     }
 
+    @Override
     public void run() {
         boolean success = false;
         try {
@@ -435,8 +433,8 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
     }
     
     private void parseParametrizedText() {
-        allParameters = new ArrayList<CodeTemplateParameter>(2);
-        masterParameters = new ArrayList<CodeTemplateParameter>(2);
+        allParameters = new ArrayList<>(2);
+        masterParameters = new ArrayList<>(2);
         parametrizedTextParser = new ParametrizedTextParser(this, 
parametrizedText);
         parametrizedTextParser.parse();
     }
@@ -468,8 +466,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
         completionInvoked = false;
         TextRegionManager trm = evt.textRegionManager();
         if (evt.isFocusChange()) {
-            TextSync activeTextSync = evt.activeTextSync();
-            if (activeTextSync != null && activeTextSync.isCompletionInvoke()) 
{
+            if (shouldOpenCompletionAfter(evt)) {
                 SwingUtilities.invokeLater(Completion.get()::showCompletion);
                 completionInvoked = true;
             }
@@ -482,7 +479,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
                 }
             }
 
-            if (removedGroups.size() > 0) {
+            if (!removedGroups.isEmpty()) {
                 TextSync textSync = trm.activeTextSync();
                 if (textSync != null) {
                     TextSyncGroup<CodeTemplateInsertHandler> activeGroup = 
textSync.<CodeTemplateInsertHandler>group();
@@ -508,6 +505,19 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
         }
     }
 
+    private static boolean shouldOpenCompletionAfter(TextRegionManagerEvent 
evt) {
+        TextSync activeTextSync = evt.activeTextSync();
+        if (activeTextSync != null && activeTextSync.isCompletionInvoke()) {
+            return true;
+        }
+        List<TextSyncGroup<Object>> removed = evt.removedGroups();
+        if (removed.isEmpty() || evt.previousTextSync() != null) {
+            return false;
+        }
+        TextSync last = removed.get(removed.size()-1).activeTextSync();
+        return last.isCaretMarker() && last.isCompletionInvoke();
+    }
+
     void release() {
         synchronized (this) {
             if (released) {
@@ -564,7 +574,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
     static List<CodeTemplateParameter> 
prioritizeParameters(List<CodeTemplateParameter> params) {
 
         List<CodeTemplateParameter> result = new ArrayList<>(params);
-        Collections.sort(result, new Comparator<CodeTemplateParameter>() {
+        result.sort(new Comparator<CodeTemplateParameter>() {
             @Override
             public int compare(CodeTemplateParameter p1, CodeTemplateParameter 
p2) {
                 return getPrio(p1) - getPrio(p2);
@@ -591,7 +601,7 @@ public final class CodeTemplateInsertHandler implements 
TextRegionManagerListene
 
     private static final class TemplateInsertUndoEdit extends 
AbstractUndoableEdit {
         
-        private Document doc;
+        private final Document doc;
 
         private boolean inactive;
         


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to