frontend: implement basic scope analysis

This commit is contained in:
alex committed 2023-09-17 00:38:47 -07:00
1 parent aadc8282a5
commit 821aa3563a
15 files changed
+172 -45

No files matched your search

@@ -19,6 +19,9 @@ abstract class Tool {
abstract fun createContentSource(): ContentSource
abstract fun rootFilePath(): String
val rootImportLocator: ImportLocator
get() = ImportLocator("local", rootFilePath())
fun tokenize(): TokenStream =
Tokenizer(createCharSource()).tokenize()
@@ -33,16 +36,20 @@ abstract class Tool {
fun <T> visit(visitor: NodeVisitor<T>): T = visitor.visit(parse())
fun loadMainFunction(scope: Scope, setupEvaluator: Evaluator.() -> Unit = {}): CallableFunction {
val world = buildWorld()
val evaluator = Evaluator(world, scope)
setupEvaluator(evaluator)
val resultingScope = evaluator.evaluate(rootImportLocator)
return resultingScope.value("main") as CallableFunction
}
fun buildWorld(): World {
val fileContentSource = createContentSource()
val dynamicImportSource = DynamicImportSource()
dynamicImportSource.addContentSource("std", PorkStdlib)
dynamicImportSource.addContentSource("local", fileContentSource)
dynamicImportSource.addContentSource("java", JavaAutogenContentSource)
val world = World(dynamicImportSource)
val evaluator = Evaluator(world, scope)
setupEvaluator(evaluator)
val resultingScope = evaluator.evaluate(ImportLocator("local", rootFilePath()))
return resultingScope.value("main") as CallableFunction
return World(dynamicImportSource)
}
fun run(scope: Scope, quiet: Boolean = false) {