reducing ast dependencies

This commit is contained in:
Irmen de Jong 2021-02-09 00:05:56 +01:00
parent 9e05e97d7f
commit c97d76dbf2
2 changed files with 10 additions and 32 deletions

View File

@ -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<IAstModification>()
override fun before(directive: Directive, parent: Node): Iterable<IAstModification> {
if(directive.directive in moduleLevelDirectives) {
return listOf(IAstModification.Remove(directive, parent as INameScope))
}
return noModifications
}
}

View File

@ -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<Directive>()
importedModule.statements.removeAll(directives)
directives = directives.filter{ it.directive !in moduleLevelDirectives }
importedModule.statements.addAll(0, directives)
}
private fun tryGetModuleFromResource(name: String, compilationTargetName: String): Pair<InputStream, String>? {
val targetSpecificPath = "/prog8lib/$compilationTargetName/$name"
val targetSpecificResource = object{}.javaClass.getResourceAsStream(targetSpecificPath)