From c97d76dbf2dc3274a78e89cbe7ceeb2af43f2d0d Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 9 Feb 2021 00:05:56 +0100 Subject: [PATCH] reducing ast dependencies --- .../ImportedModuleDirectiveRemover.kt | 26 ------------------- compiler/src/prog8/parser/ModuleParsing.kt | 16 +++++++----- 2 files changed, 10 insertions(+), 32 deletions(-) delete mode 100644 compiler/src/prog8/compiler/astprocessing/ImportedModuleDirectiveRemover.kt diff --git a/compiler/src/prog8/compiler/astprocessing/ImportedModuleDirectiveRemover.kt b/compiler/src/prog8/compiler/astprocessing/ImportedModuleDirectiveRemover.kt deleted file mode 100644 index edb7d7b45..000000000 --- a/compiler/src/prog8/compiler/astprocessing/ImportedModuleDirectiveRemover.kt +++ /dev/null @@ -1,26 +0,0 @@ -package prog8.compiler.astprocessing - -import prog8.ast.INameScope -import prog8.ast.Node -import prog8.ast.statements.Directive -import prog8.ast.walk.AstWalker -import prog8.ast.walk.IAstModification - - -internal class ImportedModuleDirectiveRemover: AstWalker() { - /** - * Most global directives don't apply for imported modules, so remove them - */ - - // TODO don't use an AstWalker for this, do it directly on the imported module - - private val moduleLevelDirectives = listOf("%output", "%launcher", "%zeropage", "%zpreserved", "%address") - private val noModifications = emptyList() - - override fun before(directive: Directive, parent: Node): Iterable { - if(directive.directive in moduleLevelDirectives) { - return listOf(IAstModification.Remove(directive, parent as INameScope)) - } - return noModifications - } -} diff --git a/compiler/src/prog8/parser/ModuleParsing.kt b/compiler/src/prog8/parser/ModuleParsing.kt index 06b11da0c..7f3448226 100644 --- a/compiler/src/prog8/parser/ModuleParsing.kt +++ b/compiler/src/prog8/parser/ModuleParsing.kt @@ -9,7 +9,6 @@ import prog8.ast.base.Position import prog8.ast.base.SyntaxError import prog8.ast.statements.Directive import prog8.ast.statements.DirectiveArg -import prog8.compiler.astprocessing.ImportedModuleDirectiveRemover import prog8.pathFrom import java.io.InputStream import java.nio.file.Files @@ -129,14 +128,19 @@ internal class ModuleImporter { importModule(program, modulePath, encoder, compilationTargetName) } - // TODO don't do this via an AstWalker: - val imr = ImportedModuleDirectiveRemover() - imr.visit(importedModule, importedModule.parent) - imr.applyModifications() - + removeDirectivesFromImportedModule(importedModule) return importedModule } + private fun removeDirectivesFromImportedModule(importedModule: Module) { + // Most global directives don't apply for imported modules, so remove them + val moduleLevelDirectives = listOf("%output", "%launcher", "%zeropage", "%zpreserved", "%address", "%target") + var directives = importedModule.statements.filterIsInstance() + importedModule.statements.removeAll(directives) + directives = directives.filter{ it.directive !in moduleLevelDirectives } + importedModule.statements.addAll(0, directives) + } + private fun tryGetModuleFromResource(name: String, compilationTargetName: String): Pair? { val targetSpecificPath = "/prog8lib/$compilationTargetName/$name" val targetSpecificResource = object{}.javaClass.getResourceAsStream(targetSpecificPath)