Files
pork/minimal/src/main/kotlin/gay/pizza/pork/minimal/Tool.kt

61 lines
2.3 KiB
Kotlin
Raw Normal View History

2023-09-11 02:34:28 -04:00
package gay.pizza.pork.minimal
import gay.pizza.pork.ast.gen.CompilationUnit
import gay.pizza.pork.ast.gen.NodeVisitor
import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.ast.gen.visit
2023-09-11 02:34:28 -04:00
import gay.pizza.pork.evaluator.*
import gay.pizza.pork.execution.ExecutionContext
import gay.pizza.pork.execution.ExecutionContextProvider
import gay.pizza.pork.execution.InternalNativeProvider
import gay.pizza.pork.execution.NativeRegistry
import gay.pizza.pork.ffi.FfiNativeProvider
2023-09-07 01:51:50 -07:00
import gay.pizza.pork.ffi.JavaAutogenContentSource
2023-09-11 02:34:28 -04:00
import gay.pizza.pork.ffi.JavaNativeProvider
import gay.pizza.pork.frontend.ContentSource
import gay.pizza.pork.frontend.ImportLocator
import gay.pizza.pork.frontend.DynamicImportSource
import gay.pizza.pork.frontend.World
2023-09-04 01:56:24 -07:00
import gay.pizza.pork.parser.*
import gay.pizza.pork.stdlib.PorkStdlib
import gay.pizza.pork.tokenizer.*
2023-09-03 01:11:27 -07:00
abstract class Tool {
abstract fun createCharSource(): CharSource
abstract fun createContentSource(): ContentSource
abstract fun rootFilePath(): String
val rootImportLocator: ImportLocator
get() = ImportLocator("local", rootFilePath())
2023-10-14 03:28:07 -07:00
fun tokenize(): Tokenizer =
Tokenizer(createCharSource())
2023-09-02 20:22:08 -07:00
fun parse(attribution: NodeAttribution = DiscardNodeAttribution): CompilationUnit =
2023-10-14 03:28:07 -07:00
Parser(tokenize(), attribution).parseCompilationUnit()
fun highlight(scheme: HighlightScheme): Sequence<Highlight> =
Highlighter(scheme).highlight(tokenize())
fun reprint(): String = buildString { visit(Printer(this)) }
fun <T> visit(visitor: NodeVisitor<T>): T = visitor.visit(parse())
2023-09-02 23:28:40 -07:00
fun createExecutionContextProvider(type: ExecutionType): ExecutionContextProvider =
type.create(buildWorld())
fun createExecutionContext(type: ExecutionType, symbol: Symbol, nativeRegistry: NativeRegistry): ExecutionContext {
val executionContextProvider = createExecutionContextProvider(type)
return executionContextProvider.prepare(rootImportLocator, symbol, nativeRegistry)
}
fun buildWorld(): World {
val fileContentSource = createContentSource()
val dynamicImportSource = DynamicImportSource()
dynamicImportSource.addContentSource("std", PorkStdlib)
dynamicImportSource.addContentSource("local", fileContentSource)
2023-09-07 01:51:50 -07:00
dynamicImportSource.addContentSource("java", JavaAutogenContentSource)
return World(dynamicImportSource)
2023-09-02 23:28:40 -07:00
}
}