mirror of
https://github.com/irmen/prog8.git
synced 2025-01-12 19:29:50 +00:00
added a beanshell interpreter experiment
This commit is contained in:
parent
62458216c9
commit
040a6c62de
2
.idea/kotlinc.xml
generated
2
.idea/kotlinc.xml
generated
@ -4,6 +4,6 @@
|
||||
<option name="jvmTarget" value="11" />
|
||||
</component>
|
||||
<component name="KotlinJpsPluginSettings">
|
||||
<option name="version" value="1.9.24" />
|
||||
<option name="version" value="2.0.21" />
|
||||
</component>
|
||||
</project>
|
||||
|
6
.idea/modules.xml
generated
6
.idea/modules.xml
generated
@ -2,6 +2,8 @@
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/beanshell/beanshell.iml" filepath="$PROJECT_DIR$/beanshell/beanshell.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/benchmark-program/benchmark-program.iml" filepath="$PROJECT_DIR$/benchmark-program/benchmark-program.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/codeCore/codeCore.iml" filepath="$PROJECT_DIR$/codeCore/codeCore.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/codeGenCpu6502/codeGenCpu6502.iml" filepath="$PROJECT_DIR$/codeGenCpu6502/codeGenCpu6502.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/codeGenExperimental/codeGenExperimental.iml" filepath="$PROJECT_DIR$/codeGenExperimental/codeGenExperimental.iml" />
|
||||
@ -12,12 +14,10 @@
|
||||
<module fileurl="file://$PROJECT_DIR$/compilerAst/compilerAst.iml" filepath="$PROJECT_DIR$/compilerAst/compilerAst.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/docs/docs.iml" filepath="$PROJECT_DIR$/docs/docs.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/examples/examples.iml" filepath="$PROJECT_DIR$/examples/examples.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/benchmark-program/benchmark-program.iml" filepath="$PROJECT_DIR$/benchmark-program/benchmark-program.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/intermediate/intermediate.iml" filepath="$PROJECT_DIR$/intermediate/intermediate.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/languageServer/languageServer.iml" filepath="$PROJECT_DIR$/languageServer/languageServer.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/parser/parser.iml" filepath="$PROJECT_DIR$/parser/parser.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/prog8.iml" filepath="$PROJECT_DIR$/.idea/modules/prog8.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/virtualmachine/virtualmachine.iml" filepath="$PROJECT_DIR$/virtualmachine/virtualmachine.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
</project>
|
@ -4,12 +4,21 @@
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||
<orderEntry type="library" name="jetbrains.kotlinx.cli.jvm" level="project" />
|
||||
<orderEntry type="library" name="michael.bull.kotlin.result.jvm" level="project" />
|
||||
<orderEntry type="library" name="eclipse.lsp4j" level="project" />
|
||||
<orderEntry type="module-library">
|
||||
<library>
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/bsh-3.0.0-SNAPSHOT.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
</component>
|
||||
</module>
|
@ -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<Exec>("fixFilePermissions") {
|
||||
@ -60,31 +56,7 @@ tasks.register<Exec>("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<JavaExec>("debugRun") {
|
||||
mainClass.set(serverMainClassName)
|
||||
classpath(sourceSets.main.get().runtimeClasspath)
|
||||
standardInput = System.`in`
|
||||
|
||||
jvmArgs(debugArgs)
|
||||
doLast {
|
||||
println("Using debug port $debugPort")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register<CreateStartScripts>("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<Sync>("installDebugDist") {
|
||||
dependsOn("installDist")
|
||||
finalizedBy("debugStartScripts")
|
||||
commandLine("chmod", "+x", "${tasks.installDist.get().destinationDir}/bin/prog8-beanshell")
|
||||
}
|
||||
|
||||
tasks.withType<Test>() {
|
||||
@ -101,3 +73,11 @@ tasks.installDist {
|
||||
tasks.build {
|
||||
finalizedBy("installDist")
|
||||
}
|
||||
|
||||
val javaVersion: String by project
|
||||
|
||||
kotlin {
|
||||
jvmToolchain {
|
||||
languageVersion = JavaLanguageVersion.of(javaVersion.toInt())
|
||||
}
|
||||
}
|
BIN
beanshell/lib/bsh-3.0.0-SNAPSHOT.jar
Normal file
BIN
beanshell/lib/bsh-3.0.0-SNAPSHOT.jar
Normal file
Binary file not shown.
48
beanshell/src/prog8beanshell/CommandLineReader.kt
Normal file
48
beanshell/src/prog8beanshell/CommandLineReader.kt
Normal file
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
23
beanshell/src/prog8beanshell/Main.kt
Normal file
23
beanshell/src/prog8beanshell/Main.kt
Normal file
@ -0,0 +1,23 @@
|
||||
package prog8beanshell
|
||||
|
||||
import bsh.FileReader
|
||||
import bsh.Interpreter
|
||||
|
||||
|
||||
class BeanshellInterpreter {
|
||||
|
||||
fun run(symbols: Map<String, Any>) {
|
||||
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<String>) {
|
||||
val i = BeanshellInterpreter()
|
||||
i.run(mapOf(
|
||||
"irmen" to 50
|
||||
))
|
||||
}
|
@ -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"
|
||||
|
@ -25,5 +25,6 @@
|
||||
<orderEntry type="module" module-name="virtualmachine" />
|
||||
<orderEntry type="module" module-name="intermediate" scope="TEST" />
|
||||
<orderEntry type="library" name="antlr.antlr4" level="project" />
|
||||
<orderEntry type="module" module-name="beanshell" />
|
||||
</component>
|
||||
</module>
|
@ -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 <R> compute(task: () -> R) =
|
||||
CompletableFuture.supplyAsync(Supplier(task), workerThread)
|
||||
|
||||
fun <R> 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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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<String>) {
|
||||
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()
|
||||
}
|
@ -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<InitializeResult> = async.compute {
|
||||
logger.info("Initializing LanguageServer")
|
||||
|
||||
InitializeResult()
|
||||
}
|
||||
|
||||
override fun shutdown(): CompletableFuture<Any> {
|
||||
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)
|
||||
}
|
||||
}
|
@ -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<MutableList<Either<SymbolInformation, DocumentSymbol>>> = async.compute {
|
||||
logger.info("Find symbols in ${params.textDocument.uri}")
|
||||
val result: MutableList<Either<SymbolInformation, DocumentSymbol>>
|
||||
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<Either<MutableList<CompletionItem>, CompletionList>> = async.compute{
|
||||
logger.info("Completion for ${position}")
|
||||
val result: Either<MutableList<CompletionItem>, 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
|
||||
}
|
@ -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<Any> {
|
||||
logger.info("executeCommand $params")
|
||||
return super.executeCommand(params)
|
||||
}
|
||||
|
||||
override fun symbol(params: WorkspaceSymbolParams): CompletableFuture<Either<MutableList<out SymbolInformation>, MutableList<out WorkspaceSymbol>>> {
|
||||
logger.info("symbol $params")
|
||||
return super.symbol(params)
|
||||
}
|
||||
|
||||
override fun resolveWorkspaceSymbol(workspaceSymbol: WorkspaceSymbol): CompletableFuture<WorkspaceSymbol> {
|
||||
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<WorkspaceEdit> {
|
||||
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<WorkspaceEdit> {
|
||||
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<WorkspaceEdit> {
|
||||
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<WorkspaceDiagnosticReport> {
|
||||
logger.info("diagnostic $params")
|
||||
return super.diagnostic(params)
|
||||
}
|
||||
}
|
@ -9,5 +9,5 @@ include(
|
||||
':codeGenCpu6502',
|
||||
':codeGenExperimental',
|
||||
':compiler',
|
||||
':languageServer'
|
||||
':beanshell'
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user