diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index bb6f78f10..4b121e839 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 2b94301d6..e986d3fcd 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,6 +2,8 @@
+
+
@@ -12,12 +14,10 @@
-
-
-
+
\ No newline at end of file
diff --git a/languageServer/languageServer.iml b/beanshell/beanshell.iml
similarity index 69%
rename from languageServer/languageServer.iml
rename to beanshell/beanshell.iml
index 65e9cf5e0..cabe3f4c3 100644
--- a/languageServer/languageServer.iml
+++ b/beanshell/beanshell.iml
@@ -4,12 +4,21 @@
+
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/languageServer/build.gradle.kts b/beanshell/build.gradle.kts
similarity index 58%
rename from languageServer/build.gradle.kts
rename to beanshell/build.gradle.kts
index 9c816c96e..d9526d7cd 100644
--- a/languageServer/build.gradle.kts
+++ b/beanshell/build.gradle.kts
@@ -3,11 +3,8 @@ plugins {
id("application")
}
-val debugPort = 8000
-val debugArgs = "-agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n,quiet=y"
-
val serverMainClassName = "prog8lsp.MainKt"
-val applicationName = "prog8-language-server"
+val applicationName = "prog8-beanshell"
application {
mainClass.set(serverMainClassName)
@@ -31,8 +28,7 @@ repositories {
}
dependencies {
- implementation("org.eclipse.lsp4j:org.eclipse.lsp4j:0.23.1")
- implementation("org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1")
+ implementation(files("lib/bsh-3.0.0-SNAPSHOT.jar"))
}
configurations.forEach { config ->
@@ -52,7 +48,7 @@ sourceSets.test {
}
tasks.startScripts {
- applicationName = "prog8-language-server"
+ applicationName = "prog8-beanshell"
}
tasks.register("fixFilePermissions") {
@@ -60,31 +56,7 @@ tasks.register("fixFilePermissions") {
// needs executable permissions to run.
onlyIf { !System.getProperty("os.name").lowercase().contains("windows") }
- commandLine("chmod", "+x", "${tasks.installDist.get().destinationDir}/bin/prog8-language-server")
-}
-
-tasks.register("debugRun") {
- mainClass.set(serverMainClassName)
- classpath(sourceSets.main.get().runtimeClasspath)
- standardInput = System.`in`
-
- jvmArgs(debugArgs)
- doLast {
- println("Using debug port $debugPort")
- }
-}
-
-tasks.register("debugStartScripts") {
- applicationName = "prog8-language-server"
- mainClass.set(serverMainClassName)
- outputDir = tasks.installDist.get().destinationDir.toPath().resolve("bin").toFile()
- classpath = tasks.startScripts.get().classpath
- defaultJvmOpts = listOf(debugArgs)
-}
-
-tasks.register("installDebugDist") {
- dependsOn("installDist")
- finalizedBy("debugStartScripts")
+ commandLine("chmod", "+x", "${tasks.installDist.get().destinationDir}/bin/prog8-beanshell")
}
tasks.withType() {
@@ -101,3 +73,11 @@ tasks.installDist {
tasks.build {
finalizedBy("installDist")
}
+
+val javaVersion: String by project
+
+kotlin {
+ jvmToolchain {
+ languageVersion = JavaLanguageVersion.of(javaVersion.toInt())
+ }
+}
\ No newline at end of file
diff --git a/beanshell/lib/bsh-3.0.0-SNAPSHOT.jar b/beanshell/lib/bsh-3.0.0-SNAPSHOT.jar
new file mode 100644
index 000000000..1cea7ea78
Binary files /dev/null and b/beanshell/lib/bsh-3.0.0-SNAPSHOT.jar differ
diff --git a/beanshell/src/prog8beanshell/CommandLineReader.kt b/beanshell/src/prog8beanshell/CommandLineReader.kt
new file mode 100644
index 000000000..a242c8de2
--- /dev/null
+++ b/beanshell/src/prog8beanshell/CommandLineReader.kt
@@ -0,0 +1,48 @@
+package prog8beanshell
+
+import java.io.FilterReader
+import java.io.Reader
+
+
+class CommandLineReader(val input: Reader): FilterReader(input) {
+ private val normal = 0
+ private val lastCharNL = 1
+ private val sentSemi = 2
+ private var state = lastCharNL
+
+ override fun read(): Int {
+ if (state == sentSemi) {
+ this.state = lastCharNL
+ return 10
+ } else {
+ var b = input.read()
+ while(b==13) b = input.read()
+
+ if (b == 10) {
+ if (this.state == lastCharNL) {
+ b = 59
+ this.state = sentSemi
+ } else {
+ this.state = lastCharNL
+ }
+ } else {
+ this.state = normal
+ }
+
+ return b
+ }
+
+ }
+
+ override fun read(buff: CharArray, off: Int, len: Int): Int {
+ val b = read()
+ if (b == -1) {
+ return -1
+ } else {
+ buff[off] = b.toChar()
+ return 1
+ }
+
+ }
+}
+
diff --git a/beanshell/src/prog8beanshell/Main.kt b/beanshell/src/prog8beanshell/Main.kt
new file mode 100644
index 000000000..d5f9e086f
--- /dev/null
+++ b/beanshell/src/prog8beanshell/Main.kt
@@ -0,0 +1,23 @@
+package prog8beanshell
+
+import bsh.FileReader
+import bsh.Interpreter
+
+
+class BeanshellInterpreter {
+
+ fun run(symbols: Map) {
+ val interpreter = Interpreter(CommandLineReader(FileReader(System.`in`)), System.out, System.err, true)
+ interpreter.setExitOnEOF(false)
+ interpreter.set("env", System.getenv())
+ symbols.forEach { (name, value) -> interpreter.set(name, value) }
+ interpreter.run()
+ }
+}
+
+fun main(args: Array) {
+ val i = BeanshellInterpreter()
+ i.run(mapOf(
+ "irmen" to 50
+ ))
+}
diff --git a/compiler/build.gradle b/compiler/build.gradle
index 16eade8b0..2d8881ff7 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -32,6 +32,7 @@ dependencies {
implementation project(':codeGenIntermediate')
implementation project(':codeGenExperimental')
implementation project(':virtualmachine')
+ // implementation project(':beanshell')
implementation "org.antlr:antlr4-runtime:4.13.2"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
// implementation "org.jetbrains.kotlin:kotlin-reflect"
diff --git a/compiler/compiler.iml b/compiler/compiler.iml
index 8bbb96375..d43f3eaf9 100644
--- a/compiler/compiler.iml
+++ b/compiler/compiler.iml
@@ -25,5 +25,6 @@
+
\ No newline at end of file
diff --git a/languageServer/src/prog8lsp/AsyncExecutor.kt b/languageServer/src/prog8lsp/AsyncExecutor.kt
deleted file mode 100644
index 5858e86e9..000000000
--- a/languageServer/src/prog8lsp/AsyncExecutor.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package prog8lsp
-
-import java.util.function.Supplier
-import java.util.concurrent.CompletableFuture
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
-
-private var threadCount = 0
-
-class AsyncExecutor {
- private val workerThread = Executors.newSingleThreadExecutor { Thread(it, "async${threadCount++}") }
-
- fun execute(task: () -> Unit) =
- CompletableFuture.runAsync(Runnable(task), workerThread)
-
- fun compute(task: () -> R) =
- CompletableFuture.supplyAsync(Supplier(task), workerThread)
-
- fun computeOr(defaultValue: R, task: () -> R?) =
- CompletableFuture.supplyAsync(Supplier {
- try {
- task() ?: defaultValue
- } catch (e: Exception) {
- defaultValue
- }
- }, workerThread)
-
- fun shutdown(awaitTermination: Boolean) {
- workerThread.shutdown()
- if (awaitTermination) {
- workerThread.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS)
- }
- }
-}
\ No newline at end of file
diff --git a/languageServer/src/prog8lsp/Main.kt b/languageServer/src/prog8lsp/Main.kt
deleted file mode 100644
index 69779ca4f..000000000
--- a/languageServer/src/prog8lsp/Main.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package prog8lsp
-
-import org.eclipse.lsp4j.launch.LSPLauncher
-import java.util.concurrent.Executors
-import java.util.logging.Level
-import java.util.logging.Logger
-
-fun main(args: Array) {
- Logger.getLogger("").level = Level.INFO
-
- val inStream = System.`in`
- val outStream = System.out
- val server = Prog8LanguageServer()
- val threads = Executors.newSingleThreadExecutor { Thread(it, "client") }
- val launcher = LSPLauncher.createServerLauncher(server, inStream, outStream, threads) { it }
-
- server.connect(launcher.remoteProxy)
- launcher.startListening()
-}
diff --git a/languageServer/src/prog8lsp/Prog8LanguageServer.kt b/languageServer/src/prog8lsp/Prog8LanguageServer.kt
deleted file mode 100644
index bfd044bed..000000000
--- a/languageServer/src/prog8lsp/Prog8LanguageServer.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package prog8lsp
-
-import org.eclipse.lsp4j.InitializeParams
-import org.eclipse.lsp4j.InitializeResult
-import org.eclipse.lsp4j.services.*
-import java.io.Closeable
-import java.util.concurrent.CompletableFuture
-import java.util.concurrent.CompletableFuture.completedFuture
-import java.util.logging.Logger
-
-class Prog8LanguageServer: LanguageServer, LanguageClientAware, Closeable {
- private lateinit var client: LanguageClient
- private val textDocuments = Prog8TextDocumentService()
- private val workspaces = Prog8WorkspaceService()
- private val async = AsyncExecutor()
- private val logger = Logger.getLogger(Prog8LanguageServer::class.simpleName)
-
- override fun initialize(params: InitializeParams): CompletableFuture = async.compute {
- logger.info("Initializing LanguageServer")
-
- InitializeResult()
- }
-
- override fun shutdown(): CompletableFuture {
- close()
- return completedFuture(null)
- }
-
- override fun exit() { }
-
- override fun getTextDocumentService(): TextDocumentService = textDocuments
-
- override fun getWorkspaceService(): WorkspaceService = workspaces
-
- override fun connect(client: LanguageClient) {
- logger.info("connecting to language client")
- this.client = client
- workspaces.connect(client)
- textDocuments.connect(client)
- }
-
- override fun close() {
- logger.info("closing down")
- async.shutdown(awaitTermination = true)
- }
-}
diff --git a/languageServer/src/prog8lsp/Prog8TextDocumentService.kt b/languageServer/src/prog8lsp/Prog8TextDocumentService.kt
deleted file mode 100644
index 40d76ab4a..000000000
--- a/languageServer/src/prog8lsp/Prog8TextDocumentService.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package prog8lsp
-
-import org.eclipse.lsp4j.*
-import org.eclipse.lsp4j.jsonrpc.messages.Either
-import org.eclipse.lsp4j.services.LanguageClient
-import org.eclipse.lsp4j.services.TextDocumentService
-import java.util.concurrent.CompletableFuture
-import java.util.logging.Logger
-import kotlin.system.measureTimeMillis
-
-class Prog8TextDocumentService: TextDocumentService {
- private var client: LanguageClient? = null
- private val async = AsyncExecutor()
- private val logger = Logger.getLogger(Prog8TextDocumentService::class.simpleName)
-
- fun connect(client: LanguageClient) {
- this.client = client
- }
-
- override fun didOpen(params: DidOpenTextDocumentParams) {
- logger.info("didOpen: $params")
- }
-
- override fun didChange(params: DidChangeTextDocumentParams) {
- logger.info("didChange: $params")
- }
-
- override fun didClose(params: DidCloseTextDocumentParams) {
- logger.info("didClose: $params")
- }
-
- override fun didSave(params: DidSaveTextDocumentParams) {
- logger.info("didSave: $params")
- }
-
- override fun documentSymbol(params: DocumentSymbolParams): CompletableFuture>> = async.compute {
- logger.info("Find symbols in ${params.textDocument.uri}")
- val result: MutableList>
- val time = measureTimeMillis {
- result = mutableListOf()
- val range = Range(Position(1,1), Position(1,5))
- val selectionRange = Range(Position(1,2), Position(1,10))
- val symbol = DocumentSymbol("test-symbolName", SymbolKind.Constant, range, selectionRange)
- result.add(Either.forRight(symbol))
- }
- logger.info("Finished in $time ms")
- result
- }
-
- override fun completion(position: CompletionParams): CompletableFuture, CompletionList>> = async.compute{
- logger.info("Completion for ${position}")
- val result: Either, CompletionList>
- val time = measureTimeMillis {
- val list = CompletionList(false, listOf(CompletionItem("test-completionItem")))
- result = Either.forRight(list)
- }
- logger.info("Finished in $time ms")
- result
- }
-
- // TODO add all other methods that get called.... :P
-}
diff --git a/languageServer/src/prog8lsp/Prog8WorkspaceService.kt b/languageServer/src/prog8lsp/Prog8WorkspaceService.kt
deleted file mode 100644
index 87fc9cba2..000000000
--- a/languageServer/src/prog8lsp/Prog8WorkspaceService.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package prog8lsp
-
-import org.eclipse.lsp4j.*
-import org.eclipse.lsp4j.jsonrpc.messages.Either
-import org.eclipse.lsp4j.services.LanguageClient
-import org.eclipse.lsp4j.services.WorkspaceService
-import java.util.concurrent.CompletableFuture
-import java.util.logging.Logger
-
-class Prog8WorkspaceService: WorkspaceService {
- private var client: LanguageClient? = null
- private val logger = Logger.getLogger(Prog8WorkspaceService::class.simpleName)
-
- fun connect(client: LanguageClient) {
- this.client = client
- }
-
- override fun executeCommand(params: ExecuteCommandParams): CompletableFuture {
- logger.info("executeCommand $params")
- return super.executeCommand(params)
- }
-
- override fun symbol(params: WorkspaceSymbolParams): CompletableFuture, MutableList>> {
- logger.info("symbol $params")
- return super.symbol(params)
- }
-
- override fun resolveWorkspaceSymbol(workspaceSymbol: WorkspaceSymbol): CompletableFuture {
- logger.info("resolveWorkspaceSymbol $workspaceSymbol")
- return super.resolveWorkspaceSymbol(workspaceSymbol)
- }
-
- override fun didChangeConfiguration(params: DidChangeConfigurationParams) {
- logger.info("didChangeConfiguration: $params")
- }
-
- override fun didChangeWatchedFiles(params: DidChangeWatchedFilesParams) {
- logger.info("didChangeWatchedFiles: $params")
- }
-
- override fun didChangeWorkspaceFolders(params: DidChangeWorkspaceFoldersParams) {
- logger.info("didChangeWorkspaceFolders $params")
- super.didChangeWorkspaceFolders(params)
- }
-
- override fun willCreateFiles(params: CreateFilesParams): CompletableFuture {
- logger.info("willCreateFiles $params")
- return super.willCreateFiles(params)
- }
-
- override fun didCreateFiles(params: CreateFilesParams) {
- logger.info("didCreateFiles $params")
- super.didCreateFiles(params)
- }
-
- override fun willRenameFiles(params: RenameFilesParams): CompletableFuture {
- logger.info("willRenameFiles $params")
- return super.willRenameFiles(params)
- }
-
- override fun didRenameFiles(params: RenameFilesParams) {
- logger.info("didRenameFiles $params")
- super.didRenameFiles(params)
- }
-
- override fun willDeleteFiles(params: DeleteFilesParams): CompletableFuture {
- logger.info("willDeleteFiles $params")
- return super.willDeleteFiles(params)
- }
-
- override fun didDeleteFiles(params: DeleteFilesParams) {
- logger.info("didDeleteFiles $params")
- super.didDeleteFiles(params)
- }
-
- override fun diagnostic(params: WorkspaceDiagnosticParams): CompletableFuture {
- logger.info("diagnostic $params")
- return super.diagnostic(params)
- }
-}
diff --git a/settings.gradle b/settings.gradle
index 9a99e5a39..3b825d1c3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -9,5 +9,5 @@ include(
':codeGenCpu6502',
':codeGenExperimental',
':compiler',
- ':languageServer'
+ ':beanshell'
)