From ea837ba6dd21bfa5d5629a3ff8d3717842c137de Mon Sep 17 00:00:00 2001
From: SeeBasTStick <sebastian.stock@hhu.de>
Date: Sat, 15 Aug 2020 12:00:18 +0200
Subject: [PATCH] moved from process exceution to process builder output of
 executions should no longer fail to poor string formatting OS which block
 until output/error is read are now supported Added improved debugging support

---
 .idea/.gitignore                              |  8 --------
 .../b/language/server/BDocumentService.kt     |  8 ++++----
 .../b/language/server/BWorkspaceService.kt    |  4 ++--
 src/main/kotlin/b/language/server/Server.kt   |  2 +-
 .../server/communication/Communicator.kt      | 20 +++++++++++++++++++
 .../communication/CommunicatorInterface.kt    |  8 ++++++++
 .../probCli/ProBCommandLineAccess.kt          | 11 +++++-----
 7 files changed, 40 insertions(+), 21 deletions(-)
 delete mode 100644 .idea/.gitignore

diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 73f69e0..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/src/main/kotlin/b/language/server/BDocumentService.kt b/src/main/kotlin/b/language/server/BDocumentService.kt
index 147d7c9..57a0b86 100644
--- a/src/main/kotlin/b/language/server/BDocumentService.kt
+++ b/src/main/kotlin/b/language/server/BDocumentService.kt
@@ -35,7 +35,7 @@ class BDocumentService(private val server: Server, private val communicator: Com
      */
     override fun didSave(params: DidSaveTextDocumentParams?) {
 
-        communicator.sendDebugMessage("document ${params!!.textDocument.uri} was saved", MessageType.Info)
+        communicator.bufferDebugMessage("document ${params!!.textDocument.uri} was saved", MessageType.Info)
         val currentUri = params.textDocument.uri
         checkDocument(currentUri)
 
@@ -48,7 +48,7 @@ class BDocumentService(private val server: Server, private val communicator: Com
     fun checkDocument(currentUri : String){
 
         val clientSettings = server.getDocumentSettings(currentUri)
-        communicator.sendDebugMessage("waiting for document settings", MessageType.Info)
+        communicator.bufferDebugMessage("waiting for document settings", MessageType.Info)
 
         clientSettings.thenAccept{ settings ->
             communicator.setDebugMode(settings.debugMode)
@@ -80,7 +80,7 @@ class BDocumentService(private val server: Server, private val communicator: Com
 
     /**
      * Gets all uris that are no longer contain problems
-     * @param currentUri the uri of the curre   nt main file
+     * @param currentUri the uri of the current main file
      * @param filesWithProblems uris of files containing problems
      */
     fun calculateToInvalidate(currentUri : String, filesWithProblems : List<String>) : List<String>{
@@ -108,7 +108,7 @@ class BDocumentService(private val server: Server, private val communicator: Com
      * Registration Options: TextDocumentChangeRegistrationOptions
      */
     override fun didChange(params: DidChangeTextDocumentParams?) {
-        communicator.sendDebugMessage("document ${params!!.textDocument.uri} was changed", MessageType.Info)
+        communicator.bufferDebugMessage("document ${params!!.textDocument.uri} was changed", MessageType.Info)
         val currentUri = params.textDocument.uri
         checkDocument(currentUri)
     }
diff --git a/src/main/kotlin/b/language/server/BWorkspaceService.kt b/src/main/kotlin/b/language/server/BWorkspaceService.kt
index 7dfc24d..603b6da 100644
--- a/src/main/kotlin/b/language/server/BWorkspaceService.kt
+++ b/src/main/kotlin/b/language/server/BWorkspaceService.kt
@@ -16,7 +16,7 @@ class BWorkspaceService(private val server : Server) : WorkspaceService {
      * the client detects changes to file watched by the language client.
      */
     override fun didChangeWatchedFiles(params: DidChangeWatchedFilesParams?) {
-        Communicator.sendDebugMessage("----------changed watched files", MessageType.Info)
+        Communicator.bufferDebugMessage("changed watched files", MessageType.Info)
 
         // Not needed
     }
@@ -26,7 +26,7 @@ class BWorkspaceService(private val server : Server) : WorkspaceService {
      * configuration settings.
      */
     override fun didChangeConfiguration(params: DidChangeConfigurationParams?) {
-        Communicator.sendDebugMessage("received change in configuration settings", MessageType.Info)
+        Communicator.bufferDebugMessage("received change in configuration settings", MessageType.Info)
         if(server.configurationAbility) {
             server.documentSettings.clear()
         }else{
diff --git a/src/main/kotlin/b/language/server/Server.kt b/src/main/kotlin/b/language/server/Server.kt
index c0bfd91..274196f 100644
--- a/src/main/kotlin/b/language/server/Server.kt
+++ b/src/main/kotlin/b/language/server/Server.kt
@@ -83,7 +83,7 @@ class Server : LanguageServer{
      * @return settings of the document requested
      */
     fun getDocumentSettings(uri : String) : CompletableFuture<Settings> {
-        Communicator.sendDebugMessage("received configuration Data of the document $uri", MessageType.Info)
+        Communicator.bufferDebugMessage("received configuration data of the document $uri", MessageType.Info)
         return if(!configurationAbility){
             val returnValue = CompletableFuture<Settings>()
             returnValue.complete(globalSettings)
diff --git a/src/main/kotlin/b/language/server/communication/Communicator.kt b/src/main/kotlin/b/language/server/communication/Communicator.kt
index 7b8f591..3472e80 100644
--- a/src/main/kotlin/b/language/server/communication/Communicator.kt
+++ b/src/main/kotlin/b/language/server/communication/Communicator.kt
@@ -15,6 +15,7 @@ object Communicator : CommunicatorInterface {
     lateinit var client : LanguageClient
 
     private var debugMode : Boolean = true
+    private val storedMessages = mutableListOf<Pair<String, MessageType>>()
 
     /**
      * Sends the diagnostics
@@ -32,7 +33,13 @@ object Communicator : CommunicatorInterface {
      * @param severity the Severity of the message (Error/Info/Warning)
      */
     override fun sendDebugMessage(message: String, severity: MessageType) {
+
+
         if(debugMode) {
+            if(storedMessages.isNotEmpty()) {
+                storedMessages.toList().forEach { element -> client.logMessage(MessageParams(element.second, element.first)) }
+                storedMessages.clear()
+            }
             client.logMessage(MessageParams(severity, message))
         }
 
@@ -57,4 +64,17 @@ object Communicator : CommunicatorInterface {
     override fun setDebugMode(mode : Boolean){
         debugMode = mode
     }
+
+    /**
+     * Can be used to store a messages until a "sendDebugMessage" command is sent. The messages will be sent as FIFO
+     * @param message the message to send
+     * @param severity tne message severity
+     */
+    override fun bufferDebugMessage(message: String, severity: MessageType) {
+        if(debugMode) {
+            storedMessages.add(Pair(message, severity))
+        }
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/b/language/server/communication/CommunicatorInterface.kt b/src/main/kotlin/b/language/server/communication/CommunicatorInterface.kt
index b9096f0..850b781 100644
--- a/src/main/kotlin/b/language/server/communication/CommunicatorInterface.kt
+++ b/src/main/kotlin/b/language/server/communication/CommunicatorInterface.kt
@@ -38,4 +38,12 @@ interface CommunicatorInterface {
      * @param mode the new state of the debug mode
      */
     fun setDebugMode(mode : Boolean)
+
+
+    /**
+     * Can be used to store a messages until a "sendDebugMessage" command is sent. The messages will be sent as FIFO
+     * @param message the message to send
+     * @param severity tne message severity
+     */
+    fun bufferDebugMessage(message : String, severity: MessageType)
 }
\ No newline at end of file
diff --git a/src/main/kotlin/b/language/server/proBMangement/probCli/ProBCommandLineAccess.kt b/src/main/kotlin/b/language/server/proBMangement/probCli/ProBCommandLineAccess.kt
index 11360e0..4f4265c 100644
--- a/src/main/kotlin/b/language/server/proBMangement/probCli/ProBCommandLineAccess.kt
+++ b/src/main/kotlin/b/language/server/proBMangement/probCli/ProBCommandLineAccess.kt
@@ -64,7 +64,8 @@ class ProBCommandLineAccess(val communicator : CommunicatorInterface) : ProBInte
         val typeCheckDefinitions = "TYPE_CHECK_DEFINITIONS"
         val lint = "-lint"
         val tRUE = "TRUE"
-        val performanceHints = "PERFORMANCE_INFO"
+        val performanceHints = "" +
+                "PERFORMANCE_INFO"
 
 
         val command = mutableListOf<String>()
@@ -113,7 +114,7 @@ class ProBCommandLineAccess(val communicator : CommunicatorInterface) : ProBInte
                     .redirectError(ProcessBuilder.Redirect.PIPE)
 
         }catch (e : IllegalArgumentException){
-            communicator.sendDebugMessage("illigal argument exception", MessageType.Info)
+            communicator.sendDebugMessage("illegal argument exception", MessageType.Info)
         }
         return ProcessBuilder()
     }
@@ -144,16 +145,14 @@ class ProBCommandLineAccess(val communicator : CommunicatorInterface) : ProBInte
 
         val process: Process = command.start()
 
-     //   val output  = InputStreamReader(process.inputStream)
-     //   val error  = InputStreamReader(process.errorStream)
 
         val outputAsString = readFromStream(process.inputStream)
-        readFromStream(process.errorStream)
+        readFromStream(process.errorStream) //just void error
 
 
        // process.waitFor() //we must wait here to ensure correct behavior when reading an error
         val exitStatus = process.waitFor()
-        communicator.sendDebugMessage("output of execution + ${exitStatus}", MessageType.Info)
+        communicator.sendDebugMessage("exit status of execution: $exitStatus", MessageType.Info)
         if(!outputAsString.contains("ProB Command Line Interface")){
             throw CommandCouldNotBeExecutedException("Error when trying to call probcli with command $command")
         }
-- 
GitLab