mirror of
https://github.com/irmen/prog8.git
synced 2024-10-17 10:24:55 +00:00
reducing ast dependencies
This commit is contained in:
parent
9e05e97d7f
commit
c97d76dbf2
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,7 +9,6 @@ import prog8.ast.base.Position
|
|||||||
import prog8.ast.base.SyntaxError
|
import prog8.ast.base.SyntaxError
|
||||||
import prog8.ast.statements.Directive
|
import prog8.ast.statements.Directive
|
||||||
import prog8.ast.statements.DirectiveArg
|
import prog8.ast.statements.DirectiveArg
|
||||||
import prog8.compiler.astprocessing.ImportedModuleDirectiveRemover
|
|
||||||
import prog8.pathFrom
|
import prog8.pathFrom
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
@ -129,14 +128,19 @@ internal class ModuleImporter {
|
|||||||
importModule(program, modulePath, encoder, compilationTargetName)
|
importModule(program, modulePath, encoder, compilationTargetName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO don't do this via an AstWalker:
|
removeDirectivesFromImportedModule(importedModule)
|
||||||
val imr = ImportedModuleDirectiveRemover()
|
|
||||||
imr.visit(importedModule, importedModule.parent)
|
|
||||||
imr.applyModifications()
|
|
||||||
|
|
||||||
return 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>? {
|
private fun tryGetModuleFromResource(name: String, compilationTargetName: String): Pair<InputStream, String>? {
|
||||||
val targetSpecificPath = "/prog8lib/$compilationTargetName/$name"
|
val targetSpecificPath = "/prog8lib/$compilationTargetName/$name"
|
||||||
val targetSpecificResource = object{}.javaClass.getResourceAsStream(targetSpecificPath)
|
val targetSpecificResource = object{}.javaClass.getResourceAsStream(targetSpecificPath)
|
||||||
|
Loading…
Reference in New Issue
Block a user