mirror of
https://github.com/irmen/prog8.git
synced 2025-11-03 04:17:16 +00:00
reducing dependencies
This commit is contained in:
@@ -1,13 +1,10 @@
|
|||||||
package prog8.codegen.cpu6502
|
package prog8.codegen.cpu6502
|
||||||
|
|
||||||
import com.github.michaelbull.result.fold
|
import com.github.michaelbull.result.fold
|
||||||
import prog8.ast.IFunctionCall
|
import prog8.ast.*
|
||||||
import prog8.ast.Node
|
|
||||||
import prog8.ast.Program
|
|
||||||
import prog8.ast.base.*
|
import prog8.ast.base.*
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.codegen.cpu6502.assignment.*
|
import prog8.codegen.cpu6502.assignment.*
|
||||||
import prog8.compilerinterface.*
|
import prog8.compilerinterface.*
|
||||||
import prog8.parser.SourceCode
|
import prog8.parser.SourceCode
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import prog8.ast.statements.ArrayIndex
|
|||||||
import prog8.ast.statements.BuiltinFunctionCallStatement
|
import prog8.ast.statements.BuiltinFunctionCallStatement
|
||||||
import prog8.ast.statements.DirectMemoryWrite
|
import prog8.ast.statements.DirectMemoryWrite
|
||||||
import prog8.ast.statements.Subroutine
|
import prog8.ast.statements.Subroutine
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.codegen.cpu6502.assignment.*
|
import prog8.codegen.cpu6502.assignment.*
|
||||||
import prog8.compilerinterface.*
|
import prog8.compilerinterface.*
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package prog8.codegen.cpu6502
|
|||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
import prog8.ast.base.*
|
import prog8.ast.base.*
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.compilerinterface.AssemblyError
|
import prog8.compilerinterface.AssemblyError
|
||||||
import prog8.compilerinterface.CpuType
|
import prog8.compilerinterface.CpuType
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import prog8.ast.Program
|
|||||||
import prog8.ast.base.ArrayToElementTypes
|
import prog8.ast.base.ArrayToElementTypes
|
||||||
import prog8.ast.base.DataType
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.RegisterOrPair
|
import prog8.ast.base.RegisterOrPair
|
||||||
|
import prog8.ast.base.toHex
|
||||||
import prog8.ast.expressions.IdentifierReference
|
import prog8.ast.expressions.IdentifierReference
|
||||||
import prog8.ast.expressions.RangeExpression
|
import prog8.ast.expressions.RangeExpression
|
||||||
import prog8.ast.statements.ForLoop
|
import prog8.ast.statements.ForLoop
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.compilerinterface.AssemblyError
|
import prog8.compilerinterface.AssemblyError
|
||||||
import prog8.compilerinterface.Zeropage
|
import prog8.compilerinterface.Zeropage
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import prog8.ast.base.*
|
|||||||
import prog8.ast.expressions.IdentifierReference
|
import prog8.ast.expressions.IdentifierReference
|
||||||
import prog8.ast.expressions.NumericLiteral
|
import prog8.ast.expressions.NumericLiteral
|
||||||
import prog8.ast.statements.PostIncrDecr
|
import prog8.ast.statements.PostIncrDecr
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.compilerinterface.AssemblyError
|
import prog8.compilerinterface.AssemblyError
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,8 @@ package prog8.codegen.cpu6502
|
|||||||
|
|
||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
import prog8.ast.antlr.escape
|
import prog8.ast.antlr.escape
|
||||||
import prog8.ast.base.ArrayDatatypes
|
import prog8.ast.base.*
|
||||||
import prog8.ast.base.ByteDatatypes
|
|
||||||
import prog8.ast.base.DataType
|
|
||||||
import prog8.ast.base.RegisterOrPair
|
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.codegen.cpu6502.assignment.AsmAssignTarget
|
import prog8.codegen.cpu6502.assignment.AsmAssignTarget
|
||||||
import prog8.codegen.cpu6502.assignment.TargetStorageKind
|
import prog8.codegen.cpu6502.assignment.TargetStorageKind
|
||||||
import prog8.compilerinterface.*
|
import prog8.compilerinterface.*
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import prog8.ast.Program
|
|||||||
import prog8.ast.base.*
|
import prog8.ast.base.*
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.codegen.cpu6502.AsmGen
|
import prog8.codegen.cpu6502.AsmGen
|
||||||
import prog8.codegen.cpu6502.VariableAllocator
|
import prog8.codegen.cpu6502.VariableAllocator
|
||||||
import prog8.compilerinterface.AssemblyError
|
import prog8.compilerinterface.AssemblyError
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import prog8.ast.Program
|
|||||||
import prog8.ast.base.*
|
import prog8.ast.base.*
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.Subroutine
|
import prog8.ast.statements.Subroutine
|
||||||
import prog8.ast.toHex
|
|
||||||
import prog8.codegen.cpu6502.AsmGen
|
import prog8.codegen.cpu6502.AsmGen
|
||||||
import prog8.codegen.cpu6502.VariableAllocator
|
import prog8.codegen.cpu6502.VariableAllocator
|
||||||
import prog8.compilerinterface.AssemblyError
|
import prog8.compilerinterface.AssemblyError
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package prog8.optimizer
|
|||||||
import prog8.ast.*
|
import prog8.ast.*
|
||||||
import prog8.ast.base.DataType
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.VarDeclType
|
import prog8.ast.base.VarDeclType
|
||||||
import prog8.ast.base.defaultZero
|
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.walk.AstWalker
|
import prog8.ast.walk.AstWalker
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
package prog8.compiler.astprocessing
|
package prog8.compiler.astprocessing
|
||||||
|
|
||||||
import prog8.ast.IFunctionCall
|
import prog8.ast.*
|
||||||
import prog8.ast.IStatementContainer
|
|
||||||
import prog8.ast.Node
|
|
||||||
import prog8.ast.Program
|
|
||||||
import prog8.ast.base.ParentSentinel
|
|
||||||
import prog8.ast.base.Position
|
import prog8.ast.base.Position
|
||||||
import prog8.ast.expressions.DirectMemoryRead
|
import prog8.ast.expressions.DirectMemoryRead
|
||||||
import prog8.ast.expressions.FunctionCallExpression
|
import prog8.ast.expressions.FunctionCallExpression
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
package prog8.compiler.astprocessing
|
package prog8.compiler.astprocessing
|
||||||
|
|
||||||
import prog8.ast.IFunctionCall
|
import prog8.ast.*
|
||||||
import prog8.ast.IPipe
|
|
||||||
import prog8.ast.Node
|
|
||||||
import prog8.ast.Program
|
|
||||||
import prog8.ast.base.DataType
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.FatalAstException
|
import prog8.ast.base.FatalAstException
|
||||||
import prog8.ast.base.Position
|
import prog8.ast.base.Position
|
||||||
import prog8.ast.base.defaultZero
|
|
||||||
import prog8.ast.expressions.Expression
|
import prog8.ast.expressions.Expression
|
||||||
import prog8.ast.expressions.FunctionCallExpression
|
import prog8.ast.expressions.FunctionCallExpression
|
||||||
import prog8.ast.expressions.PipeExpression
|
import prog8.ast.expressions.PipeExpression
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import io.kotest.matchers.doubles.plusOrMinus
|
|||||||
import io.kotest.matchers.shouldBe
|
import io.kotest.matchers.shouldBe
|
||||||
import io.kotest.matchers.shouldNotBe
|
import io.kotest.matchers.shouldNotBe
|
||||||
import io.kotest.matchers.string.shouldContain
|
import io.kotest.matchers.string.shouldContain
|
||||||
import prog8.ast.toHex
|
import prog8.ast.base.toHex
|
||||||
import prog8.codegen.target.C64Target
|
import prog8.codegen.target.C64Target
|
||||||
import prog8.codegen.target.cbm.Mflpt5
|
import prog8.codegen.target.cbm.Mflpt5
|
||||||
import prog8.compilerinterface.InternalCompilerException
|
import prog8.compilerinterface.InternalCompilerException
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import io.kotest.matchers.string.shouldContain
|
|||||||
import io.kotest.matchers.string.shouldNotBeBlank
|
import io.kotest.matchers.string.shouldNotBeBlank
|
||||||
import io.kotest.matchers.types.instanceOf
|
import io.kotest.matchers.types.instanceOf
|
||||||
import io.kotest.matchers.types.shouldBeSameInstanceAs
|
import io.kotest.matchers.types.shouldBeSameInstanceAs
|
||||||
|
import prog8.ast.ParentSentinel
|
||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
import prog8.ast.base.DataType
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.ParentSentinel
|
|
||||||
import prog8.ast.base.Position
|
import prog8.ast.base.Position
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import io.kotest.matchers.string.shouldContain
|
|||||||
import io.kotest.matchers.types.instanceOf
|
import io.kotest.matchers.types.instanceOf
|
||||||
import io.kotest.matchers.types.shouldBeSameInstanceAs
|
import io.kotest.matchers.types.shouldBeSameInstanceAs
|
||||||
import prog8.ast.GlobalNamespace
|
import prog8.ast.GlobalNamespace
|
||||||
import prog8.ast.base.ParentSentinel
|
import prog8.ast.ParentSentinel
|
||||||
import prog8.ast.expressions.NumericLiteral
|
import prog8.ast.expressions.NumericLiteral
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.codegen.target.C64Target
|
import prog8.codegen.target.C64Target
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import prog8.ast.antlr.escape
|
|||||||
import prog8.ast.base.DataType
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.NumericDatatypes
|
import prog8.ast.base.NumericDatatypes
|
||||||
import prog8.ast.base.VarDeclType
|
import prog8.ast.base.VarDeclType
|
||||||
|
import prog8.ast.base.toHex
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.walk.IAstVisitor
|
import prog8.ast.walk.IAstVisitor
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package prog8.ast
|
package prog8.ast
|
||||||
|
|
||||||
|
import prog8.ast.base.DataType
|
||||||
import prog8.ast.base.FatalAstException
|
import prog8.ast.base.FatalAstException
|
||||||
import prog8.ast.base.ParentSentinel
|
|
||||||
import prog8.ast.base.Position
|
import prog8.ast.base.Position
|
||||||
import prog8.ast.base.findParentNode
|
|
||||||
import prog8.ast.expressions.Expression
|
import prog8.ast.expressions.Expression
|
||||||
import prog8.ast.expressions.IdentifierReference
|
import prog8.ast.expressions.IdentifierReference
|
||||||
|
import prog8.ast.expressions.NumericLiteral
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
import prog8.ast.walk.AstWalker
|
import prog8.ast.walk.AstWalker
|
||||||
import prog8.ast.walk.IAstVisitor
|
import prog8.ast.walk.IAstVisitor
|
||||||
@@ -14,6 +14,18 @@ import prog8.parser.SourceCode
|
|||||||
const val internedStringsModuleName = "prog8_interned_strings"
|
const val internedStringsModuleName = "prog8_interned_strings"
|
||||||
|
|
||||||
|
|
||||||
|
object ParentSentinel : Node {
|
||||||
|
override val position = Position("<<sentinel>>", 0, 0, 0)
|
||||||
|
override var parent: Node = this
|
||||||
|
override fun linkParents(parent: Node) {}
|
||||||
|
override fun replaceChildNode(node: Node, replacement: Node) {
|
||||||
|
replacement.parent = this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun copy(): Node = throw FatalAstException("should never duplicate a ParentSentinel")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
interface IFunctionCall {
|
interface IFunctionCall {
|
||||||
var target: IdentifierReference
|
var target: IdentifierReference
|
||||||
var args: MutableList<Expression>
|
var args: MutableList<Expression>
|
||||||
@@ -248,6 +260,19 @@ interface Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// find the parent node of a specific type or interface
|
||||||
|
// (useful to figure out in what namespace/block something is defined, etc.)
|
||||||
|
inline fun <reified T> findParentNode(node: Node): T? {
|
||||||
|
var candidate = node.parent
|
||||||
|
while(candidate !is T && candidate !is ParentSentinel)
|
||||||
|
candidate = candidate.parent
|
||||||
|
return if(candidate is ParentSentinel)
|
||||||
|
null
|
||||||
|
else
|
||||||
|
candidate as T
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
open class Module(final override var statements: MutableList<Statement>,
|
open class Module(final override var statements: MutableList<Statement>,
|
||||||
final override val position: Position,
|
final override val position: Position,
|
||||||
val source: SourceCode) : Node, INameScope {
|
val source: SourceCode) : Node, INameScope {
|
||||||
@@ -316,3 +341,13 @@ internal object BuiltinFunctionScopePlaceholder : INameScope {
|
|||||||
override val name = "<<builtin-functions-scope-placeholder>>"
|
override val name = "<<builtin-functions-scope-placeholder>>"
|
||||||
override var statements = mutableListOf<Statement>()
|
override var statements = mutableListOf<Statement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun defaultZero(dt: DataType, position: Position) = when(dt) {
|
||||||
|
DataType.UBYTE -> NumericLiteral(DataType.UBYTE, 0.0, position)
|
||||||
|
DataType.BYTE -> NumericLiteral(DataType.BYTE, 0.0, position)
|
||||||
|
DataType.UWORD, DataType.STR -> NumericLiteral(DataType.UWORD, 0.0, position)
|
||||||
|
DataType.WORD -> NumericLiteral(DataType.WORD, 0.0, position)
|
||||||
|
DataType.FLOAT -> NumericLiteral(DataType.FLOAT, 0.0, position)
|
||||||
|
else -> throw FatalAstException("can only determine default zero value for a numeric type")
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,35 +8,7 @@ import prog8.ast.expressions.InferredTypes
|
|||||||
import prog8.ast.statements.VarDecl
|
import prog8.ast.statements.VarDecl
|
||||||
import prog8.ast.statements.VarDeclOrigin
|
import prog8.ast.statements.VarDeclOrigin
|
||||||
import prog8.ast.statements.ZeropageWish
|
import prog8.ast.statements.ZeropageWish
|
||||||
import kotlin.math.abs
|
|
||||||
|
|
||||||
fun Number.toHex(): String {
|
|
||||||
// 0..15 -> "0".."15"
|
|
||||||
// 16..255 -> "$10".."$ff"
|
|
||||||
// 256..65536 -> "$0100".."$ffff"
|
|
||||||
// negative values are prefixed with '-'.
|
|
||||||
val integer = this.toInt()
|
|
||||||
if(integer<0)
|
|
||||||
return '-' + abs(integer).toHex()
|
|
||||||
return when (integer) {
|
|
||||||
in 0 until 16 -> integer.toString()
|
|
||||||
in 0 until 0x100 -> "$"+integer.toString(16).padStart(2,'0')
|
|
||||||
in 0 until 0x10000 -> "$"+integer.toString(16).padStart(4,'0')
|
|
||||||
else -> throw IllegalArgumentException("number too large for 16 bits $this")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun UInt.toHex(): String {
|
|
||||||
// 0..15 -> "0".."15"
|
|
||||||
// 16..255 -> "$10".."$ff"
|
|
||||||
// 256..65536 -> "$0100".."$ffff"
|
|
||||||
return when (this) {
|
|
||||||
in 0u until 16u -> this.toString()
|
|
||||||
in 0u until 0x100u -> "$"+this.toString(16).padStart(2,'0')
|
|
||||||
in 0u until 0x10000u -> "$"+this.toString(16).padStart(4,'0')
|
|
||||||
else -> throw IllegalArgumentException("number too large for 16 bits $this")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Program.getTempVar(dt: DataType, altNames: Boolean=false): Pair<List<String>, VarDecl> {
|
fun Program.getTempVar(dt: DataType, altNames: Boolean=false): Pair<List<String>, VarDecl> {
|
||||||
val tmpvarName = if(altNames) {
|
val tmpvarName = if(altNames) {
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
package prog8.ast.base
|
package prog8.ast.base
|
||||||
|
|
||||||
import prog8.ast.Node
|
|
||||||
import prog8.ast.expressions.NumericLiteral
|
|
||||||
import kotlin.io.path.Path
|
import kotlin.io.path.Path
|
||||||
import kotlin.io.path.absolute
|
import kotlin.io.path.absolute
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
|
||||||
/**************************** AST Data classes ****************************/
|
/**************************** AST Data classes ****************************/
|
||||||
@@ -166,29 +165,6 @@ val Cx16VirtualRegisters = arrayOf(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
// find the parent node of a specific type or interface
|
|
||||||
// (useful to figure out in what namespace/block something is defined, etc.)
|
|
||||||
inline fun <reified T> findParentNode(node: Node): T? {
|
|
||||||
var candidate = node.parent
|
|
||||||
while(candidate !is T && candidate !is ParentSentinel)
|
|
||||||
candidate = candidate.parent
|
|
||||||
return if(candidate is ParentSentinel)
|
|
||||||
null
|
|
||||||
else
|
|
||||||
candidate as T
|
|
||||||
}
|
|
||||||
|
|
||||||
object ParentSentinel : Node {
|
|
||||||
override val position = Position("<<sentinel>>", 0, 0, 0)
|
|
||||||
override var parent: Node = this
|
|
||||||
override fun linkParents(parent: Node) {}
|
|
||||||
override fun replaceChildNode(node: Node, replacement: Node) {
|
|
||||||
replacement.parent = this
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun copy(): Node = throw FatalAstException("should never duplicate a ParentSentinel")
|
|
||||||
}
|
|
||||||
|
|
||||||
data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) {
|
data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) {
|
||||||
override fun toString(): String = "[$file: line $line col ${startCol+1}-${endCol+1}]"
|
override fun toString(): String = "[$file: line $line col ${startCol+1}-${endCol+1}]"
|
||||||
fun toClickableStr(): String {
|
fun toClickableStr(): String {
|
||||||
@@ -201,11 +177,31 @@ data class Position(val file: String, val line: Int, val startCol: Int, val endC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun defaultZero(dt: DataType, position: Position) = when(dt) {
|
|
||||||
DataType.UBYTE -> NumericLiteral(DataType.UBYTE, 0.0, position)
|
fun Number.toHex(): String {
|
||||||
DataType.BYTE -> NumericLiteral(DataType.BYTE, 0.0, position)
|
// 0..15 -> "0".."15"
|
||||||
DataType.UWORD, DataType.STR -> NumericLiteral(DataType.UWORD, 0.0, position)
|
// 16..255 -> "$10".."$ff"
|
||||||
DataType.WORD -> NumericLiteral(DataType.WORD, 0.0, position)
|
// 256..65536 -> "$0100".."$ffff"
|
||||||
DataType.FLOAT -> NumericLiteral(DataType.FLOAT, 0.0, position)
|
// negative values are prefixed with '-'.
|
||||||
else -> throw FatalAstException("can only determine default zero value for a numeric type")
|
val integer = this.toInt()
|
||||||
|
if(integer<0)
|
||||||
|
return '-' + abs(integer).toHex()
|
||||||
|
return when (integer) {
|
||||||
|
in 0 until 16 -> integer.toString()
|
||||||
|
in 0 until 0x100 -> "$"+integer.toString(16).padStart(2,'0')
|
||||||
|
in 0 until 0x10000 -> "$"+integer.toString(16).padStart(4,'0')
|
||||||
|
else -> throw IllegalArgumentException("number too large for 16 bits $this")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun UInt.toHex(): String {
|
||||||
|
// 0..15 -> "0".."15"
|
||||||
|
// 16..255 -> "$10".."$ff"
|
||||||
|
// 256..65536 -> "$0100".."$ffff"
|
||||||
|
return when (this) {
|
||||||
|
in 0u until 16u -> this.toString()
|
||||||
|
in 0u until 0x100u -> "$"+this.toString(16).padStart(2,'0')
|
||||||
|
in 0u until 0x10000u -> "$"+this.toString(16).padStart(4,'0')
|
||||||
|
else -> throw IllegalArgumentException("number too large for 16 bits $this")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@ package prog8.ast.walk
|
|||||||
|
|
||||||
import prog8.ast.*
|
import prog8.ast.*
|
||||||
import prog8.ast.base.FatalAstException
|
import prog8.ast.base.FatalAstException
|
||||||
import prog8.ast.base.ParentSentinel
|
|
||||||
import prog8.ast.expressions.*
|
import prog8.ast.expressions.*
|
||||||
import prog8.ast.statements.*
|
import prog8.ast.statements.*
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user