You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by lk...@apache.org on 2020/11/02 17:47:30 UTC

[netbeans] branch delivery updated: Ensure document state is consistent after unnamed is saved.

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

lkishalmi 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 2969adc  Ensure document state is consistent after unnamed is saved.
2969adc is described below

commit 2969adc83b00f5f3ffcbca9be1e0d69e65b4b47a
Author: Svata Dedic <sv...@oracle.com>
AuthorDate: Mon Nov 2 14:02:31 2020 +0100

    Ensure document state is consistent after unnamed is saved.
---
 .../server/protocol/TextDocumentServiceImpl.java   | 27 ++++----
 .../java/lsp/server/protocol/ServerTest.java       | 74 +++++++++++++++++++---
 2 files changed, 76 insertions(+), 25 deletions(-)

diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index f612a1a..530feaf 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -1014,22 +1014,19 @@ public class TextDocumentServiceImpl implements TextDocumentService, LanguageCli
             Document doc = ec.getDocument();
             // the document may be not opened yet. Clash with in-memory content can happen only if
             // the doc was opened prior to request reception.
-            if (doc != null) {
-                String text = params.getTextDocument().getText();
-                try {
-                    // could be faster with CharSequence, but requires a dependency on
-                    // org.netbeans.modules.editor.util
-                    if (!text.contentEquals(doc.getText(0, doc.getLength()))) {
-                        doc.remove(0, doc.getLength());
-                        doc.insertString(0, text, null);
-                    }
-                } catch (BadLocationException ex) {
-                    Exceptions.printStackTrace(ex);
-                    //TODO: include stack trace:
-                    client.logMessage(new MessageParams(MessageType.Error, ex.getMessage()));
+            String text = params.getTextDocument().getText();
+            try {
+                if (doc == null) {
+                    doc = ec.openDocument();
                 }
-            } else {
-                doc = ec.openDocument();
+                if (!text.contentEquals(doc.getText(0, doc.getLength()))) {
+                    doc.remove(0, doc.getLength());
+                    doc.insertString(0, text, null);
+                }
+            } catch (BadLocationException ex) {
+                Exceptions.printStackTrace(ex);
+                //TODO: include stack trace:
+                client.logMessage(new MessageParams(MessageType.Error, ex.getMessage()));
             }
             openedDocuments.put(params.getTextDocument().getUri(), doc);
             runDiagnoticTasks(params.getTextDocument().getUri());
diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
index 8213c5b..38bccfe 100644
--- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
+++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
@@ -45,6 +45,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import javax.swing.text.Document;
 import javax.swing.text.StyledDocument;
 import org.eclipse.lsp4j.CodeAction;
 import org.eclipse.lsp4j.CodeActionContext;
@@ -277,6 +278,7 @@ public class ServerTest extends NbTestCase {
     private class OpenCloseHook {
         private Semaphore didOpenCompleted = new Semaphore(0);
         private Semaphore didCloseCompleted = new Semaphore(0);
+        private Semaphore didChangeCompleted = new Semaphore(0);
         
         public void accept(String n, Object params){
             switch (n) {
@@ -286,10 +288,24 @@ public class ServerTest extends NbTestCase {
                 case "didClose":
                     didCloseCompleted.release();
                     break;
+                case "didChange":
+                    didChangeCompleted.release();
+                    break;
             }
         }
     }
     
+    private static final String SAMPLE_CODE = 
+                "public class Test \n"
+                + "{ \n"
+                + "  int i = \"\".hashCode();\n"
+                + "  public void run() {\n"
+                + "    this.test(); \n"
+                + "  }\n\n"
+                + "  /**Test.*/public void test() {\n"
+                + "  }\n"
+                + "}";
+    
     /**
      * Checks that opening the document preserves lines. This is necessary for breakpoints
      * or computed markers. The test will:
@@ -306,16 +322,7 @@ public class ServerTest extends NbTestCase {
         File src2 = new File(getWorkDir(), "Test2.java");
         File src3 = new File(getWorkDir(), "Test3.java");
         src.getParentFile().mkdirs();
-        String code = 
-                "public class Test \n"
-                + "{ \n"
-                + "  int i = \"\".hashCode();\n"
-                + "  public void run() {\n"
-                + "    this.test(); \n"
-                + "  }\n\n"
-                + "  /**Test.*/public void test() {\n"
-                + "  }\n"
-                + "}";
+        String code = SAMPLE_CODE;
         String code2 = code.replace("Test", "Test2");
         String code3 = code.replace("Test", "Test3");
         try (Writer w = new FileWriter(src)) {
@@ -410,6 +417,53 @@ public class ServerTest extends NbTestCase {
         assertEquals(line3, nl3);
     }
     
+    /**
+     * Simulates Ctrl-N ve VScode plus paste of initial content, then save. According to the
+     * report, DidOpen will come with an empty forced initial content. The DidChange comes that will
+     * inject the pasted content. 
+     * @throws Exception 
+     */
+    public void testSimulateNewUnnamedFile() throws Exception {
+        File src = new File(getWorkDir(), "Test.java");
+        
+        String code = SAMPLE_CODE;
+        // write in an initial code on the disk
+        try (Writer w = new FileWriter(src)) {
+            w.write(code);
+        }
+        
+        FileObject f1 = FileUtil.toFileObject(src);
+        OpenCloseHook hook = new OpenCloseHook();
+        TextDocumentServiceImpl.HOOK_NOTIFICATION = hook::accept;
+
+        Launcher<LanguageServer> serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream());
+        serverLauncher.startListening();
+        LanguageServer server = serverLauncher.getRemoteProxy();
+        InitializeResult result = server.initialize(new InitializeParams()).get();
+        
+        // open with empty initial content.
+        String uriString = src.toURI().toString();
+        server.getTextDocumentService().didOpen(
+                new DidOpenTextDocumentParams(new TextDocumentItem(uriString, "java", 0, ""))
+        );
+        
+        EditorCookie cake = f1.getLookup().lookup(EditorCookie.class);
+        assertTrue(hook.didOpenCompleted.tryAcquire(400, TimeUnit.MILLISECONDS));
+        
+        VersionedTextDocumentIdentifier id = new VersionedTextDocumentIdentifier(uriString, 1);
+        server.getTextDocumentService().didChange(new DidChangeTextDocumentParams(
+                id, Arrays.asList(
+                    new TextDocumentContentChangeEvent(new Range(new Position(0, 0), new Position(0, 0)), 0, code)
+                )
+        ));
+        
+        assertTrue(hook.didChangeCompleted.tryAcquire(400, TimeUnit.MILLISECONDS));
+        
+        Document doc = cake.openDocument();
+        assertEquals(code, doc.getText(0, doc.getLength()));
+        
+    }
+    
     public void testCodeActionWithRemoval() throws Exception {
         File src = new File(getWorkDir(), "Test.java");
         src.getParentFile().mkdirs();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

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