From 847d20b5c15282e166c0c73db1dccdda07d214ec Mon Sep 17 00:00:00 2001 From: SeeBasTStick <sebastian.stock@hhu.de> Date: Thu, 3 Sep 2020 11:17:47 +0200 Subject: [PATCH] cleanup and todos --- src/main/kotlin/b/language/server/App.kt | 6 +--- .../b/language/server/BWorkspaceService.kt | 6 ++-- src/main/kotlin/b/language/server/Server.kt | 2 +- src/main/kotlin/b/language/server/Util.kt | 3 +- .../b/language/server/dataStorage/Settings.kt | 1 - .../server/proBMangement/prob/ProBKernel.kt | 26 ++++++++++++--- .../proBMangement/prob/ProBKernelManager.kt | 33 +++++++++++++------ .../proBMangement/prob/ProBKernelModule.kt | 3 +- .../server/proBMangement/prob/Util.kt | 11 +++++-- 9 files changed, 60 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/b/language/server/App.kt b/src/main/kotlin/b/language/server/App.kt index 5244546..e86d1da 100644 --- a/src/main/kotlin/b/language/server/App.kt +++ b/src/main/kotlin/b/language/server/App.kt @@ -1,20 +1,16 @@ package b.language.server -import b.language.server.proBMangement.prob.ProBKernelManager import org.eclipse.lsp4j.jsonrpc.Launcher import org.eclipse.lsp4j.launch.LSPLauncher import org.eclipse.lsp4j.services.LanguageClient import java.io.* -import java.net.InetAddress import java.net.ServerSocket -import java.net.Socket -import java.nio.charset.StandardCharsets import java.util.concurrent.Future fun main() { println("opening connection and waiting ...") - val socket = ServerSocket(5555) + val socket = ServerSocket(55555) val channel = socket.accept() println("accepted connection from ${channel.inetAddress}") startServer(channel.getInputStream(), channel.getOutputStream()) diff --git a/src/main/kotlin/b/language/server/BWorkspaceService.kt b/src/main/kotlin/b/language/server/BWorkspaceService.kt index 86952c3..6ed6d36 100644 --- a/src/main/kotlin/b/language/server/BWorkspaceService.kt +++ b/src/main/kotlin/b/language/server/BWorkspaceService.kt @@ -8,13 +8,13 @@ import org.eclipse.lsp4j.MessageType import org.eclipse.lsp4j.services.WorkspaceService -class BWorkspaceService(private val server: Server) : WorkspaceService { +class BWorkspaceService(private val server: Server, val communicator: Communicator) : WorkspaceService { /** * The watched files notification is sent from the client to the server when * the client detects changes to file watched by the language client. */ override fun didChangeWatchedFiles(params: DidChangeWatchedFilesParams?) { - Communicator.sendDebugMessage("----------changed watched files", MessageType.Info) + communicator.sendDebugMessage("----------changed watched files", MessageType.Info) // Not needed } @@ -24,7 +24,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.sendDebugMessage("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 554624e..1f751b1 100644 --- a/src/main/kotlin/b/language/server/Server.kt +++ b/src/main/kotlin/b/language/server/Server.kt @@ -14,7 +14,7 @@ import kotlin.system.exitProcess class Server : LanguageServer{ private val textDocumentService : TextDocumentService = BDocumentService(this, Communicator, ProBKernelManager(Communicator)) - private val bWorkspaceService : WorkspaceService = BWorkspaceService(this) + private val bWorkspaceService : WorkspaceService = BWorkspaceService(this, Communicator) private lateinit var languageClient : LanguageClient var globalSettings : Settings = Settings() val documentSettings : HashMap<String, CompletableFuture<Settings>> = HashMap() diff --git a/src/main/kotlin/b/language/server/Util.kt b/src/main/kotlin/b/language/server/Util.kt index 18cee9e..ce08112 100644 --- a/src/main/kotlin/b/language/server/Util.kt +++ b/src/main/kotlin/b/language/server/Util.kt @@ -4,7 +4,6 @@ import b.language.server.dataStorage.Settings import com.google.gson.Gson import com.google.gson.JsonObject -import java.io.File /** @@ -21,3 +20,5 @@ fun castJsonToSetting(json : JsonObject) : Settings { Gson().fromJson(json.get("debugMode"), Boolean::class.java)) } + + diff --git a/src/main/kotlin/b/language/server/dataStorage/Settings.kt b/src/main/kotlin/b/language/server/dataStorage/Settings.kt index 50b5117..40708a6 100644 --- a/src/main/kotlin/b/language/server/dataStorage/Settings.kt +++ b/src/main/kotlin/b/language/server/dataStorage/Settings.kt @@ -1,6 +1,5 @@ package b.language.server.dataStorage -import java.io.File data class Settings(val strictChecks : Boolean = true, val wdChecks : Boolean = true, val performanceHints : Boolean = true , val probHome : String = "DEFAULT", diff --git a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernel.kt b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernel.kt index 966642b..6eb1e55 100644 --- a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernel.kt +++ b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernel.kt @@ -4,10 +4,12 @@ package b.language.server.proBMangement.prob import b.language.server.communication.Communicator import b.language.server.communication.CommunicatorInterface import b.language.server.dataStorage.ProBSettings +import com.google.gson.Gson import com.google.inject.Inject import com.google.inject.Injector import de.prob.animator.ReusableAnimator import de.prob.animator.command.CheckWellDefinednessCommand +import de.prob.animator.domainobjects.ErrorItem import de.prob.exception.ProBError import de.prob.scripting.ClassicalBFactory import de.prob.scripting.FactoryProvider @@ -17,7 +19,10 @@ import de.prob.statespace.StateSpace import de.prob.statespace.Trace import org.eclipse.lsp4j.Diagnostic import org.eclipse.lsp4j.MessageType +import org.ietf.jgss.GSSContext +import java.io.File import java.io.IOException +import java.nio.charset.Charset /** * Represents the interface to communicate with prob kernel @@ -41,12 +46,13 @@ class ProBKernel @Inject constructor(private val injector : Injector, Communicator.sendDebugMessage("Unload old machine", MessageType.Info) unloadMachine() - //TODO Rules factory val factory = injector.getInstance(FactoryProvider.factoryClassFromExtension(path.substringAfterLast("."))) + val warningListener = WarningListener() animator.addWarningListener(warningListener) val parseErrors = mutableListOf<Diagnostic>() - Communicator.sendDebugMessage("Load new machine", MessageType.Info) + + Communicator.sendDebugMessage("loading new machine", MessageType.Info) val strictProblems = loadMachine( { stateSpace : StateSpace -> @@ -61,8 +67,10 @@ class ProBKernel @Inject constructor(private val injector : Injector, } Trace(stateSpace) }, settings) + communicator.sendDebugMessage("returning from kernel", MessageType.Info) - return listOf(warningListener.getWarnings(), parseErrors).flatten() + + return listOf(warningListener.getWarnings(), parseErrors, strictProblems).flatten() } /** @@ -70,21 +78,28 @@ class ProBKernel @Inject constructor(private val injector : Injector, * @param newTraceCreator a anonymous function dealing with the state space * @param settings the settings to be applied */ - private fun loadMachine(newTraceCreator :java.util.function.Function<StateSpace, Trace>, settings: ProBSettings){ + private fun loadMachine(newTraceCreator :java.util.function.Function<StateSpace, Trace>, settings: ProBSettings): List<Diagnostic> { val newStateSpace = animator.createStateSpace() newStateSpace.changePreferences(prepareAdditionalSettings(settings)) + val resultLint = mutableListOf<ErrorItem>() // see java doc of prepareAdditionalSettings try { communicator.sendDebugMessage("changing animation", MessageType.Info) animationSelector.changeCurrentAnimation(newTraceCreator.apply(newStateSpace)) communicator.sendDebugMessage("executing optional steps", MessageType.Info) executeAdditionalOptions(settings) - newStateSpace.performExtendedStaticChecks() //TODO move to additional options + + if (settings.strictChecks) { + resultLint.addAll(newStateSpace.performExtendedStaticChecks()) + } + communicator.sendDebugMessage("returning...", MessageType.Info) } catch (e: RuntimeException) { newStateSpace.kill() throw e } + + return convertErrorItems(resultLint) } @@ -115,6 +130,7 @@ class ProBKernel @Inject constructor(private val injector : Injector, /** * prepares a map with additional settings + * note that the -lint option is an extra call to the state space and must be performed elsewhere * @param proBSettings the settings to put in the map * @return the settings map */ diff --git a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelManager.kt b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelManager.kt index f18f925..4370b32 100644 --- a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelManager.kt +++ b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelManager.kt @@ -10,6 +10,8 @@ import org.eclipse.lsp4j.Diagnostic import org.eclipse.lsp4j.MessageType import java.io.File import java.net.URI +import java.nio.file.Files +import java.nio.file.Path /** * Creates the prob kernel access and maintenance @@ -46,13 +48,21 @@ class ProBKernelManager(private val communicator : CommunicatorInterface) : ProB private fun checkProBVersionSetting(probNewHome : String) : Boolean{ return if(probNewHome != probHome) { - if(File(probNewHome).exists()) { - System.setProperty("prob.home", "/home/sebastian/prob_prolog") + if(probNewHome == "DEFAULT"){ //Use default prob + System.setProperty("prob.home", "null") kernel = setup() probHome = probNewHome true - } else{ - false + } + else { + if (File(probNewHome).exists()) { // Use custom prob + System.setProperty("prob.home", probNewHome) + kernel = setup() + probHome = probNewHome + true + } else { + false + } } }else{ true @@ -70,12 +80,15 @@ class ProBKernelManager(private val communicator : CommunicatorInterface) : ProB */ override fun checkDocument(uri: String, settings: Settings): List<Diagnostic> { val path = URI(uri).path - communicator.sendDebugMessage("try to use ${settings.probHome} as prob version", MessageType.Info) - val result = checkProBVersionSetting(settings.probHome) - if(!result){ - throw CouldNotFindProBHomeException("searched at ${settings.probHome} for prob but found nothing") - } - communicator.sendDebugMessage("success...", MessageType.Info) + + Files.exists(Path.of(URI(uri))) + communicator.sendDebugMessage("try to use ${settings.probHome} as prob version instead of ${System.getProperty("prob.home")}", MessageType.Info) + // val result = checkProBVersionSetting(settings.probHome) + // if(!result){ + // throw CouldNotFindProBHomeException("searched at ${settings.probHome} for prob but found nothing") + //} + + communicator.sendDebugMessage("success!", MessageType.Info) communicator.sendDebugMessage("checking document", MessageType.Info) return kernel.check(path, ProBSettings(wdChecks = settings.wdChecks, strictChecks = settings.strictChecks, performanceHints = settings.performanceHints)) } diff --git a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelModule.kt b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelModule.kt index b66e683..2546591 100644 --- a/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelModule.kt +++ b/src/main/kotlin/b/language/server/proBMangement/prob/ProBKernelModule.kt @@ -1,11 +1,10 @@ package b.language.server.proBMangement.prob -import b.language.server.communication.Communicator import b.language.server.communication.CommunicatorInterface import com.google.inject.AbstractModule import de.prob.MainModule -class ProBKernelModule(val communicator : CommunicatorInterface) : AbstractModule() { +class ProBKernelModule(private val communicator : CommunicatorInterface) : AbstractModule() { override fun configure() { install(MainModule()) bind(CommunicatorInterface::class.java).toInstance(communicator) diff --git a/src/main/kotlin/b/language/server/proBMangement/prob/Util.kt b/src/main/kotlin/b/language/server/proBMangement/prob/Util.kt index d0d3c44..fa1a55b 100644 --- a/src/main/kotlin/b/language/server/proBMangement/prob/Util.kt +++ b/src/main/kotlin/b/language/server/proBMangement/prob/Util.kt @@ -5,11 +5,16 @@ import org.eclipse.lsp4j.Diagnostic import org.eclipse.lsp4j.DiagnosticSeverity import org.eclipse.lsp4j.Position import org.eclipse.lsp4j.Range +import java.io.BufferedWriter +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStreamWriter -fun convertErrorItems(errorItems : List<ErrorItem>) : List<Diagnostic>{ + +fun convertErrorItems(errorItems: List<ErrorItem>) : List<Diagnostic>{ return errorItems.toList().map { errorItem -> errorItem.locations.map { location -> - Diagnostic(Range(Position(location.startLine-1, location.startColumn), Position(location.endLine-1, location.endColumn)), + Diagnostic(Range(Position(location.startLine - 1, location.startColumn), Position(location.endLine - 1, location.endColumn)), errorItem.message, getErrorItemType(errorItem), location.filename) @@ -17,7 +22,7 @@ fun convertErrorItems(errorItems : List<ErrorItem>) : List<Diagnostic>{ }.flatten() } -fun getErrorItemType(errorItem : ErrorItem) : DiagnosticSeverity{ +fun getErrorItemType(errorItem: ErrorItem) : DiagnosticSeverity{ return when(errorItem.type){ ErrorItem.Type.ERROR -> { DiagnosticSeverity.Error -- GitLab