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