|
|
|
@ -9,10 +9,10 @@ import prog8.ast.expressions.*
|
|
|
|
|
import prog8.ast.statements.*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract class AstModification(val node: Node) {
|
|
|
|
|
abstract fun perform()
|
|
|
|
|
interface IAstModification {
|
|
|
|
|
fun perform()
|
|
|
|
|
|
|
|
|
|
class Remove(node: Node, val parent: Node) : AstModification(node) {
|
|
|
|
|
class Remove(val node: Node, val parent: Node) : IAstModification {
|
|
|
|
|
override fun perform() {
|
|
|
|
|
if(parent is INameScope) {
|
|
|
|
|
if (!parent.statements.remove(node))
|
|
|
|
@ -23,10 +23,10 @@ abstract class AstModification(val node: Node) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Replace(statement: Statement, val replacement: Statement, val parent: Node) : AstModification(statement) {
|
|
|
|
|
class Replace(val statement: Statement, val replacement: Statement, val parent: Node) : IAstModification {
|
|
|
|
|
override fun perform() {
|
|
|
|
|
if(parent is INameScope) {
|
|
|
|
|
val idx = parent.statements.indexOf(node)
|
|
|
|
|
val idx = parent.statements.indexOf(statement)
|
|
|
|
|
parent.statements[idx] = replacement
|
|
|
|
|
replacement.linkParents(parent)
|
|
|
|
|
} else {
|
|
|
|
@ -38,97 +38,97 @@ abstract class AstModification(val node: Node) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract class AstWalker {
|
|
|
|
|
open fun before(addressOf: AddressOf, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(array: ArrayLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(assignTarget: AssignTarget, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(assignment: Assignment, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(block: Block, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(branchStatement: BranchStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(breakStmt: Break, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(contStmt: Continue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(decl: VarDecl, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(directive: Directive, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(expr: BinaryExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(expr: PrefixExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(forLoop: ForLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(foreverLoop: ForeverLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(functionCall: FunctionCall, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(identifier: IdentifierReference, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(ifStatement: IfStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(inlineAssembly: InlineAssembly, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(jump: Jump, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(label: Label, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(memread: DirectMemoryRead, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(memwrite: DirectMemoryWrite, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(module: Module, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(nopStatement: NopStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(numLiteral: NumericLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(postIncrDecr: PostIncrDecr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(program: Program, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(range: RangeExpr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(registerExpr: RegisterExpr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(returnStmt: Return, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(scope: AnonymousScope, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(string: StringLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(structDecl: StructDecl, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(structLv: StructLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(subroutine: Subroutine, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(typecast: TypecastExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(whenChoice: WhenChoice, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(whenStatement: WhenStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(whileLoop: WhileLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun before(addressOf: AddressOf, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(array: ArrayLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(assignTarget: AssignTarget, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(assignment: Assignment, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(block: Block, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(branchStatement: BranchStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(breakStmt: Break, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(contStmt: Continue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(decl: VarDecl, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(directive: Directive, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(expr: BinaryExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(expr: PrefixExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(forLoop: ForLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(foreverLoop: ForeverLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(functionCall: FunctionCall, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(identifier: IdentifierReference, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(ifStatement: IfStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(inlineAssembly: InlineAssembly, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(jump: Jump, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(label: Label, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(memread: DirectMemoryRead, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(memwrite: DirectMemoryWrite, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(module: Module, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(nopStatement: NopStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(numLiteral: NumericLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(postIncrDecr: PostIncrDecr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(program: Program, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(range: RangeExpr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(registerExpr: RegisterExpr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(returnStmt: Return, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(scope: AnonymousScope, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(string: StringLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(structDecl: StructDecl, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(structLv: StructLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(subroutine: Subroutine, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(typecast: TypecastExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(whenChoice: WhenChoice, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(whenStatement: WhenStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun before(whileLoop: WhileLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
|
|
|
|
|
open fun after(addressOf: AddressOf, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(array: ArrayLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(assignTarget: AssignTarget, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(assignment: Assignment, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(block: Block, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(branchStatement: BranchStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(breakStmt: Break, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(contStmt: Continue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(decl: VarDecl, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(directive: Directive, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(expr: BinaryExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(expr: PrefixExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(forLoop: ForLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(foreverLoop: ForeverLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(functionCall: FunctionCall, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(identifier: IdentifierReference, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(ifStatement: IfStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(inlineAssembly: InlineAssembly, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(jump: Jump, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(label: Label, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(memread: DirectMemoryRead, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(memwrite: DirectMemoryWrite, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(module: Module, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(nopStatement: NopStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(numLiteral: NumericLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(postIncrDecr: PostIncrDecr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(program: Program, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(range: RangeExpr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(registerExpr: RegisterExpr, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(repeatLoop: RepeatLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(returnStmt: Return, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(scope: AnonymousScope, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(string: StringLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(structDecl: StructDecl, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(structLv: StructLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(subroutine: Subroutine, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(typecast: TypecastExpression, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(whenChoice: WhenChoice, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(whenStatement: WhenStatement, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(whileLoop: WhileLoop, parent: Node): Iterable<AstModification> = emptyList()
|
|
|
|
|
open fun after(addressOf: AddressOf, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(array: ArrayLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(assignTarget: AssignTarget, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(assignment: Assignment, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(block: Block, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(branchStatement: BranchStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(breakStmt: Break, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(contStmt: Continue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(directive: Directive, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(expr: BinaryExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(expr: PrefixExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(forLoop: ForLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(foreverLoop: ForeverLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(functionCall: FunctionCall, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(identifier: IdentifierReference, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(ifStatement: IfStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(inlineAssembly: InlineAssembly, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(jump: Jump, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(label: Label, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(memread: DirectMemoryRead, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(memwrite: DirectMemoryWrite, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(module: Module, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(nopStatement: NopStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(numLiteral: NumericLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(postIncrDecr: PostIncrDecr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(program: Program, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(range: RangeExpr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(registerExpr: RegisterExpr, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(repeatLoop: RepeatLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(returnStmt: Return, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(scope: AnonymousScope, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(string: StringLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(structDecl: StructDecl, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(structLv: StructLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(subroutine: Subroutine, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(typecast: TypecastExpression, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(whenChoice: WhenChoice, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(whenStatement: WhenStatement, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
open fun after(whileLoop: WhileLoop, parent: Node): Iterable<IAstModification> = emptyList()
|
|
|
|
|
|
|
|
|
|
private val modifications = mutableListOf<Triple<AstModification, Node, Node>>()
|
|
|
|
|
private val modifications = mutableListOf<Triple<IAstModification, Node, Node>>()
|
|
|
|
|
|
|
|
|
|
private fun track(mods: Iterable<AstModification>, node: Node, parent: Node) {
|
|
|
|
|
private fun track(mods: Iterable<IAstModification>, node: Node, parent: Node) {
|
|
|
|
|
for (it in mods) modifications += Triple(it, node, parent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|