reducing dependencies

This commit is contained in:
Irmen de Jong 2022-03-10 02:09:34 +01:00
parent ab1fffb721
commit 251b6fcf70
73 changed files with 113 additions and 209 deletions

View File

@ -1,10 +1,10 @@
package prog8.codegen.cpu6502
import prog8.ast.Program
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.VarDecl
import prog8.compilerinterface.IMachineDefinition
import prog8.compilerinterface.VarDeclType
// note: see https://wiki.nesdev.org/w/index.php/6502_assembly_optimisations

View File

@ -3,8 +3,7 @@ package prog8.codegen.cpu6502
import prog8.ast.Program
import prog8.ast.base.*
import prog8.ast.expressions.*
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.CpuType
import prog8.compilerinterface.*
import kotlin.math.absoluteValue
internal class ExpressionsAsmGen(private val program: Program,

View File

@ -2,15 +2,10 @@ package prog8.codegen.cpu6502
import com.github.michaelbull.result.fold
import prog8.ast.Program
import prog8.ast.base.ArrayToElementTypes
import prog8.ast.base.DataType
import prog8.ast.base.RegisterOrPair
import prog8.ast.base.toHex
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.RangeExpression
import prog8.ast.statements.ForLoop
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.Zeropage
import prog8.compilerinterface.*
import kotlin.math.absoluteValue
internal class ForLoopsAsmGen(private val program: Program, private val asmgen: AsmGen, private val zeropage: Zeropage) {

View File

@ -3,7 +3,6 @@ package prog8.codegen.cpu6502
import prog8.ast.IFunctionCall
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.*
import prog8.ast.expressions.AddressOf
import prog8.ast.expressions.Expression
import prog8.ast.expressions.IdentifierReference
@ -13,7 +12,7 @@ import prog8.codegen.cpu6502.assignment.AsmAssignSource
import prog8.codegen.cpu6502.assignment.AsmAssignTarget
import prog8.codegen.cpu6502.assignment.AsmAssignment
import prog8.codegen.cpu6502.assignment.TargetStorageKind
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.*
internal class FunctionCallAsmGen(private val program: Program, private val asmgen: AsmGen) {

View File

@ -1,11 +1,10 @@
package prog8.codegen.cpu6502
import prog8.ast.Program
import prog8.ast.base.*
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.PostIncrDecr
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.*
internal class PostIncrDecrAsmGen(private val program: Program, private val asmgen: AsmGen) {

View File

@ -2,9 +2,6 @@ package prog8.codegen.cpu6502
import com.github.michaelbull.result.fold
import com.github.michaelbull.result.onSuccess
import prog8.ast.base.ArrayDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.IntegerDatatypes
import prog8.ast.statements.Subroutine
import prog8.compilerinterface.*

View File

@ -1,12 +1,10 @@
package prog8.codegen.cpu6502.assignment
import prog8.ast.Program
import prog8.ast.base.*
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.codegen.cpu6502.AsmGen
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.IMemSizer
import prog8.compilerinterface.*
internal enum class TargetStorageKind {

View File

@ -6,9 +6,7 @@ import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.codegen.cpu6502.AsmGen
import prog8.codegen.cpu6502.VariableAllocator
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.CpuType
import prog8.compilerinterface.builtinFunctionReturnType
import prog8.compilerinterface.*
internal class AssignmentAsmGen(private val program: Program,

View File

@ -6,8 +6,7 @@ import prog8.ast.expressions.*
import prog8.ast.statements.Subroutine
import prog8.codegen.cpu6502.AsmGen
import prog8.codegen.cpu6502.VariableAllocator
import prog8.compilerinterface.AssemblyError
import prog8.compilerinterface.CpuType
import prog8.compilerinterface.*
internal class AugmentableAssignmentAsmGen(private val program: Program,

View File

@ -1,19 +1,12 @@
package prog8.codegen.target
import prog8.ast.base.ByteDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.PassByReferenceDatatypes
import prog8.ast.base.WordDatatypes
import prog8.ast.expressions.Expression
import prog8.ast.statements.RegisterOrStatusflag
import prog8.ast.statements.Subroutine
import prog8.codegen.target.atari.AtariMachineDefinition
import prog8.codegen.target.cbm.asmsub6502ArgsEvalOrder
import prog8.codegen.target.cbm.asmsub6502ArgsHaveRegisterClobberRisk
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IMemSizer
import prog8.compilerinterface.IStringEncoding
import prog8.compilerinterface.*
class AtariTarget: ICompilationTarget, IStringEncoding by Encoder, IMemSizer {

View File

@ -1,12 +1,12 @@
package prog8.codegen.target.cbm
import prog8.ast.base.Cx16VirtualRegisters
import prog8.ast.base.RegisterOrPair
import prog8.ast.expressions.ArrayIndexedExpression
import prog8.ast.expressions.BuiltinFunctionCall
import prog8.ast.expressions.Expression
import prog8.ast.statements.RegisterOrStatusflag
import prog8.ast.statements.Subroutine
import prog8.compilerinterface.Cx16VirtualRegisters
import prog8.compilerinterface.RegisterOrPair
internal fun asmsub6502ArgsEvalOrder(sub: Subroutine): List<Int> {

View File

@ -1,10 +1,6 @@
package prog8.codegen.target.cbm
import prog8.ast.base.ByteDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.PassByReferenceDatatypes
import prog8.ast.base.WordDatatypes
import prog8.compilerinterface.IMemSizer
import prog8.compilerinterface.*
internal object CbmMemorySizer: IMemSizer {
override fun memorySize(dt: DataType): Int {

View File

@ -1,10 +1,6 @@
package prog8.codegen.target.cx16
import prog8.ast.base.DataType
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.InternalCompilerException
import prog8.compilerinterface.Zeropage
import prog8.compilerinterface.ZeropageType
import prog8.compilerinterface.*
class CX16Zeropage(options: CompilationOptions) : Zeropage(options) {

View File

@ -3,7 +3,6 @@ package prog8.optimizer
import prog8.ast.IStatementContainer
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.expressions.AugmentAssignmentOperators
import prog8.ast.expressions.BinaryExpression
import prog8.ast.expressions.IdentifierReference
@ -15,6 +14,7 @@ import prog8.ast.statements.AssignmentOrigin
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.DataType
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.isIOAddress

View File

@ -3,6 +3,9 @@ package prog8.optimizer
import prog8.ast.base.*
import prog8.ast.expressions.Expression
import prog8.ast.expressions.NumericLiteral
import prog8.compilerinterface.DataType
import prog8.compilerinterface.IntegerDatatypes
import prog8.compilerinterface.Position
import kotlin.math.pow

View File

@ -9,6 +9,9 @@ import prog8.ast.statements.ForLoop
import prog8.ast.statements.VarDecl
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.DataType
import prog8.compilerinterface.IntegerDatatypes
import prog8.compilerinterface.VarDeclType
import kotlin.math.pow

View File

@ -7,9 +7,7 @@ import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.InternalCompilerException
import prog8.compilerinterface.*
// Fix up the literal value's type to match that of the vardecl
// (also check range literal operands types before they get expanded into arrays for instance)
@ -22,7 +20,7 @@ class VarConstantValueTypeAdjuster(private val program: Program, private val err
try {
val declConstValue = decl.value?.constValue(program)
if(declConstValue!=null && (decl.type==VarDeclType.VAR || decl.type==VarDeclType.CONST)
if(declConstValue!=null && (decl.type== VarDeclType.VAR || decl.type==VarDeclType.CONST)
&& declConstValue.type != decl.datatype) {
// avoid silent float roundings
if(decl.datatype in IntegerDatatypes && declConstValue.type==DataType.FLOAT) {

View File

@ -1,15 +1,15 @@
package prog8.optimizer
import prog8.ast.*
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.base.IntegerDatatypes
import prog8.ast.base.NumericDatatypes
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.DataType
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.IntegerDatatypes
import prog8.compilerinterface.NumericDatatypes
import kotlin.math.abs
import kotlin.math.log2
import kotlin.math.pow

View File

@ -1,16 +1,11 @@
package prog8.optimizer
import prog8.ast.*
import prog8.ast.base.ArrayDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.IntegerDatatypes
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.*
import kotlin.math.floor

View File

@ -1,16 +1,11 @@
package prog8.optimizer
import prog8.ast.*
import prog8.ast.base.DataType
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.CallGraph
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.isIOAddress
import prog8.compilerinterface.*
class UnusedCodeRemover(private val program: Program,
@ -67,7 +62,7 @@ class UnusedCodeRemover(private val program: Program,
return listOf(IAstModification.Remove(block, parent as IStatementContainer))
}
if(callgraph.unused(block)) {
if(block.statements.any{ it !is VarDecl || it.type==VarDeclType.VAR})
if(block.statements.any{ it !is VarDecl || it.type== VarDeclType.VAR})
errors.warn("removing unused block '${block.name}'", block.position)
program.removeInternedStringsFromRemovedBlock(block)
return listOf(IAstModification.Remove(block, parent as IStatementContainer))

View File

@ -6,7 +6,6 @@ import prog8.ast.IBuiltinFunctions
import prog8.ast.IStatementContainer
import prog8.ast.Program
import prog8.ast.base.AstException
import prog8.ast.base.Position
import prog8.ast.expressions.Expression
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.Directive

View File

@ -1,7 +1,7 @@
package prog8.compiler
import prog8.ast.base.Position
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.Position
internal class ErrorReporter: IErrorReporter {
private enum class MessageSeverity {

View File

@ -3,11 +3,11 @@ package prog8.compiler
import com.github.michaelbull.result.*
import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.base.Position
import prog8.ast.base.SyntaxError
import prog8.ast.statements.Directive
import prog8.ast.statements.DirectiveArg
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.Position
import prog8.parser.Prog8Parser
import prog8.parser.SourceCode
import java.io.File

View File

@ -2,7 +2,6 @@ package prog8.compiler.astprocessing
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.expressions.CharLiteral
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
@ -10,10 +9,7 @@ import prog8.ast.statements.Directive
import prog8.ast.statements.VarDeclOrigin
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.*
internal fun Program.checkValid(errors: IErrorReporter, compilerOptions: CompilationOptions) {

View File

@ -4,7 +4,6 @@ import prog8.ast.IFunctionCall
import prog8.ast.IPipe
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.Position
import prog8.ast.expressions.FunctionCallExpression
import prog8.ast.expressions.StringLiteral
import prog8.ast.statements.*
@ -12,6 +11,7 @@ import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.BuiltinFunctions
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.Position
internal class AstIdentifiersChecker(private val errors: IErrorReporter,
private val program: Program,

View File

@ -3,17 +3,12 @@ package prog8.compiler.astprocessing
import prog8.ast.IPipe
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.NumericDatatypes
import prog8.ast.base.SyntaxError
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.InternalCompilerException
import prog8.compilerinterface.*
class AstPreprocessor(val program: Program, val errors: IErrorReporter, val compTarget: ICompilationTarget) : AstWalker() {

View File

@ -2,7 +2,6 @@ package prog8.compiler.astprocessing
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.expressions.ArrayIndexedExpression
import prog8.ast.expressions.BinaryExpression
import prog8.ast.expressions.DirectMemoryRead
@ -13,6 +12,7 @@ import prog8.ast.statements.Subroutine
import prog8.ast.statements.VarDecl
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.DataType
internal class AstVariousTransforms(private val program: Program) : AstWalker() {

View File

@ -3,16 +3,12 @@ package prog8.compiler.astprocessing
import prog8.ast.IFunctionCall
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.ByteDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.PassByReferenceDatatypes
import prog8.ast.base.WordDatatypes
import prog8.ast.expressions.*
import prog8.ast.statements.BuiltinFunctionCallStatement
import prog8.ast.statements.FunctionCallStatement
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.*
internal class BeforeAsmTypecastCleaner(val program: Program,
private val errors: IErrorReporter

View File

@ -1,7 +1,6 @@
package prog8.compiler.astprocessing
import prog8.ast.*
import prog8.ast.base.Position
import prog8.ast.expressions.DirectMemoryRead
import prog8.ast.expressions.FunctionCallExpression
import prog8.ast.expressions.IdentifierReference
@ -10,6 +9,7 @@ import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.Position
private var generatedLabelSequenceNumber: Int = 0

View File

@ -3,7 +3,6 @@ package prog8.compiler.astprocessing
import prog8.ast.IFunctionCall
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.expressions.ArrayLiteral
import prog8.ast.expressions.ContainmentCheck
import prog8.ast.expressions.IdentifierReference
@ -12,6 +11,7 @@ import prog8.ast.statements.VarDecl
import prog8.ast.statements.WhenChoice
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter

View File

@ -6,10 +6,7 @@ import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.BuiltinFunctions
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.ICompilationTarget
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.*
internal class StatementReorderer(val program: Program,
val errors: IErrorReporter,

View File

@ -2,8 +2,6 @@ package prog8.compiler.astprocessing
import prog8.ast.Program
import prog8.ast.base.FatalAstException
import prog8.ast.base.Position
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.IAstVisitor

View File

@ -8,9 +8,7 @@ import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.BuiltinFunctions
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.*
class TypecastsAdder(val program: Program, val options: CompilationOptions, val errors: IErrorReporter) : AstWalker() {
@ -21,7 +19,7 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val
override fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> {
val declValue = decl.value
if(decl.type==VarDeclType.VAR && declValue!=null) {
if(decl.type== VarDeclType.VAR && declValue!=null) {
val valueDt = declValue.inferType(program)
if(valueDt isnot decl.datatype) {

View File

@ -4,8 +4,6 @@ import prog8.ast.IFunctionCall
import prog8.ast.IStatementContainer
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.ArrayDatatypes
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.expressions.*
import prog8.ast.statements.AnonymousScope
@ -13,7 +11,9 @@ import prog8.ast.statements.Assignment
import prog8.ast.statements.FunctionCallStatement
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstModification
import prog8.compilerinterface.ArrayDatatypes
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.DataType
import prog8.compilerinterface.IErrorReporter

View File

@ -1,18 +1,14 @@
package prog8.compiler.astprocessing
import prog8.ast.*
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.base.Position
import prog8.ast.expressions.Expression
import prog8.ast.expressions.FunctionCallExpression
import prog8.ast.expressions.PipeExpression
import prog8.ast.expressions.TypecastExpression
import prog8.ast.statements.*
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.BuiltinFunctions
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.builtinFunctionReturnType
import prog8.compilerinterface.*
internal class VerifyFunctionArgTypes(val program: Program, val errors: IErrorReporter) : IAstVisitor {

View File

@ -2,10 +2,10 @@ package prog8tests
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import prog8.ast.base.DataType
import prog8.ast.base.NumericDatatypes
import prog8.ast.base.RegisterOrPair
import prog8.compilerinterface.BuiltinFunctions
import prog8.compilerinterface.DataType
import prog8.compilerinterface.NumericDatatypes
import prog8.compilerinterface.RegisterOrPair
class TestBuiltinFunctions: FunSpec({

View File

@ -6,12 +6,12 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.instanceOf
import prog8.ast.IFunctionCall
import prog8.ast.base.DataType
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.codegen.target.Cx16Target
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.VarDeclType
import prog8tests.helpers.compileText

View File

@ -6,8 +6,6 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.types.instanceOf
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.expressions.ArrayLiteral
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
@ -16,7 +14,9 @@ import prog8.ast.statements.ForLoop
import prog8.ast.statements.VarDecl
import prog8.codegen.target.C64Target
import prog8.codegen.target.Cx16Target
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.Position
import prog8tests.helpers.*

View File

@ -5,9 +5,6 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.ArrayIndexedExpression
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
@ -15,6 +12,9 @@ import prog8.ast.expressions.PrefixExpression
import prog8.ast.statements.*
import prog8.codegen.target.C64Target
import prog8.compiler.printProgram
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Position
import prog8.compilerinterface.VarDeclType
import prog8.compilerinterface.isIOAddress
import prog8.parser.SourceCode
import prog8tests.helpers.*

View File

@ -6,10 +6,10 @@ import io.kotest.matchers.doubles.plusOrMinus
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.kotest.matchers.string.shouldContain
import prog8.ast.base.toHex
import prog8.codegen.target.C64Target
import prog8.codegen.target.cbm.Mflpt5
import prog8.compilerinterface.InternalCompilerException
import prog8.compilerinterface.toHex
import prog8tests.helpers.ErrorReporterForTests
import prog8tests.helpers.compileText

View File

@ -5,14 +5,14 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.kotest.matchers.string.shouldContain
import prog8.ast.base.DataType
import prog8.ast.base.ExpressionError
import prog8.ast.base.Position
import prog8.ast.expressions.ArrayLiteral
import prog8.ast.expressions.InferredTypes
import prog8.ast.expressions.NumericLiteral
import prog8.ast.expressions.StringLiteral
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.Position
class TestNumericLiteral: FunSpec({

View File

@ -11,18 +11,14 @@ import io.kotest.matchers.types.instanceOf
import io.kotest.matchers.types.shouldBeSameInstanceAs
import prog8.ast.ParentSentinel
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.codegen.target.C64Target
import prog8.compiler.astprocessing.processAstBeforeAsmGeneration
import prog8.compiler.printProgram
import prog8.compilerinterface.CbmPrgLauncherType
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.OutputType
import prog8.compilerinterface.ZeropageType
import prog8.compilerinterface.*
import prog8tests.helpers.*
import prog8.compilerinterface.Position.Companion as Position1
class TestOptimization: FunSpec({
test("remove empty subroutine except start") {
@ -74,8 +70,8 @@ class TestOptimization: FunSpec({
}
test("generated constvalue from typecast inherits proper parent linkage") {
val number = NumericLiteral(DataType.UBYTE, 11.0, Position.DUMMY)
val tc = TypecastExpression(number, DataType.BYTE, false, Position.DUMMY)
val number = NumericLiteral(DataType.UBYTE, 11.0, Position1.DUMMY)
val tc = TypecastExpression(number, DataType.BYTE, false, Position1.DUMMY)
val program = Program("test", DummyFunctions, DummyMemsizer, DummyStringEncoder)
tc.linkParents(ParentSentinel)
tc.parent shouldNotBe null
@ -89,8 +85,8 @@ class TestOptimization: FunSpec({
}
test("generated constvalue from prefixexpr inherits proper parent linkage") {
val number = NumericLiteral(DataType.UBYTE, 11.0, Position.DUMMY)
val pfx = PrefixExpression("-", number, Position.DUMMY)
val number = NumericLiteral(DataType.UBYTE, 11.0, Position1.DUMMY)
val pfx = PrefixExpression("-", number, Position1.DUMMY)
val program = Program("test", DummyFunctions, DummyMemsizer, DummyStringEncoder)
pfx.linkParents(ParentSentinel)
pfx.parent shouldNotBe null
@ -141,23 +137,23 @@ class TestOptimization: FunSpec({
val addR0value = (stmts[5] as Assignment).value
val binexpr0 = addR0value as BinaryExpression
binexpr0.operator shouldBe "+"
binexpr0.right shouldBe NumericLiteral(DataType.UWORD, 10000.0, Position.DUMMY)
binexpr0.right shouldBe NumericLiteral(DataType.UWORD, 10000.0, Position1.DUMMY)
val addR2value = (stmts[7] as Assignment).value
val binexpr2 = addR2value as BinaryExpression
binexpr2.operator shouldBe "+"
binexpr2.right shouldBe NumericLiteral(DataType.UWORD, 10000.0, Position.DUMMY)
binexpr2.right shouldBe NumericLiteral(DataType.UWORD, 10000.0, Position1.DUMMY)
val addR4value = (stmts[9] as Assignment).value
val binexpr4 = addR4value as BinaryExpression
binexpr4.operator shouldBe "+"
binexpr4.right shouldBe NumericLiteral(DataType.UWORD, 22.0, Position.DUMMY)
binexpr4.right shouldBe NumericLiteral(DataType.UWORD, 22.0, Position1.DUMMY)
val subR5value = (stmts[11] as Assignment).value
val binexpr5 = subR5value as BinaryExpression
binexpr5.operator shouldBe "-"
binexpr5.right shouldBe NumericLiteral(DataType.UWORD, 1899.0, Position.DUMMY)
binexpr5.right shouldBe NumericLiteral(DataType.UWORD, 1899.0, Position1.DUMMY)
val subR7value = (stmts[13] as Assignment).value
val binexpr7 = subR7value as BinaryExpression
binexpr7.operator shouldBe "+"
binexpr7.right shouldBe NumericLiteral(DataType.UWORD, 99.0, Position.DUMMY)
binexpr7.right shouldBe NumericLiteral(DataType.UWORD, 99.0, Position1.DUMMY)
}
test("const folding multiple scenarios * and /") {
@ -194,27 +190,27 @@ class TestOptimization: FunSpec({
val mulR0Value = (stmts[3] as Assignment).value
val binexpr0 = mulR0Value as BinaryExpression
binexpr0.operator shouldBe "*"
binexpr0.right shouldBe NumericLiteral(DataType.UWORD, 180.0, Position.DUMMY)
binexpr0.right shouldBe NumericLiteral(DataType.UWORD, 180.0, Position1.DUMMY)
val mulR1Value = (stmts[5] as Assignment).value
val binexpr1 = mulR1Value as BinaryExpression
binexpr1.operator shouldBe "*"
binexpr1.right shouldBe NumericLiteral(DataType.UWORD, 180.0, Position.DUMMY)
binexpr1.right shouldBe NumericLiteral(DataType.UWORD, 180.0, Position1.DUMMY)
val divR2Value = (stmts[7] as Assignment).value
val binexpr2 = divR2Value as BinaryExpression
binexpr2.operator shouldBe "/"
binexpr2.right shouldBe NumericLiteral(DataType.UWORD, 90.0, Position.DUMMY)
binexpr2.right shouldBe NumericLiteral(DataType.UWORD, 90.0, Position1.DUMMY)
val mulR3Value = (stmts[9] as Assignment).value
val binexpr3 = mulR3Value as BinaryExpression
binexpr3.operator shouldBe "*"
binexpr3.right shouldBe NumericLiteral(DataType.UWORD, 5.0, Position.DUMMY)
binexpr3.right shouldBe NumericLiteral(DataType.UWORD, 5.0, Position1.DUMMY)
val mulR4Value = (stmts[11] as Assignment).value
val binexpr4 = mulR4Value as BinaryExpression
binexpr4.operator shouldBe "*"
binexpr4.right shouldBe NumericLiteral(DataType.UWORD, 90.0, Position.DUMMY)
binexpr4.right shouldBe NumericLiteral(DataType.UWORD, 90.0, Position1.DUMMY)
val divR4Value = (stmts[12] as Assignment).value
val binexpr4b = divR4Value as BinaryExpression
binexpr4b.operator shouldBe "/"
binexpr4b.right shouldBe NumericLiteral(DataType.UWORD, 5.0, Position.DUMMY)
binexpr4b.right shouldBe NumericLiteral(DataType.UWORD, 5.0, Position1.DUMMY)
}
test("constantfolded and silently typecasted for initializervalues") {
@ -489,23 +485,23 @@ class TestOptimization: FunSpec({
val z6plus = statements[13] as Assignment
z1decl.name shouldBe "z1"
z1init.value shouldBe NumericLiteral(DataType.UBYTE, 10.0, Position.DUMMY)
z1init.value shouldBe NumericLiteral(DataType.UBYTE, 10.0, Position1.DUMMY)
z2decl.name shouldBe "z2"
z2init.value shouldBe NumericLiteral(DataType.UBYTE, 255.0, Position.DUMMY)
z2init.value shouldBe NumericLiteral(DataType.UBYTE, 255.0, Position1.DUMMY)
z3decl.name shouldBe "z3"
z3init.value shouldBe NumericLiteral(DataType.UBYTE, 1.0, Position.DUMMY)
z3init.value shouldBe NumericLiteral(DataType.UBYTE, 1.0, Position1.DUMMY)
z4decl.name shouldBe "z4"
z4init.value shouldBe NumericLiteral(DataType.UBYTE, 0.0, Position.DUMMY)
z4init.value shouldBe NumericLiteral(DataType.UBYTE, 0.0, Position1.DUMMY)
z5decl.name shouldBe "z5"
(z5init.value as? IdentifierReference)?.nameInSource shouldBe listOf("z1")
z5plus.isAugmentable shouldBe true
(z5plus.value as BinaryExpression).operator shouldBe "+"
(z5plus.value as BinaryExpression).right shouldBe NumericLiteral(DataType.UBYTE, 5.0, Position.DUMMY)
(z5plus.value as BinaryExpression).right shouldBe NumericLiteral(DataType.UBYTE, 5.0, Position1.DUMMY)
z6decl.name shouldBe "z6"
(z6init.value as? IdentifierReference)?.nameInSource shouldBe listOf("z1")
z6plus.isAugmentable shouldBe true
(z6plus.value as BinaryExpression).operator shouldBe "-"
(z6plus.value as BinaryExpression).right shouldBe NumericLiteral(DataType.UBYTE, 5.0, Position.DUMMY)
(z6plus.value as BinaryExpression).right shouldBe NumericLiteral(DataType.UBYTE, 5.0, Position1.DUMMY)
}
test("force_output option should work with optimizing memwrite assignment") {
@ -659,12 +655,12 @@ class TestOptimization: FunSpec({
stmts.filterIsInstance<Assignment>().size shouldBe 5
val assignXX1 = stmts[1] as Assignment
assignXX1.target.identifier!!.nameInSource shouldBe listOf("xx")
assignXX1.value shouldBe NumericLiteral(DataType.UBYTE, 20.0, Position.DUMMY)
assignXX1.value shouldBe NumericLiteral(DataType.UBYTE, 20.0, Position1.DUMMY)
val assignXX2 = stmts.last() as Assignment
assignXX2.target.identifier!!.nameInSource shouldBe listOf("xx")
val xxValue = assignXX2.value as BinaryExpression
xxValue.operator shouldBe "+"
(xxValue.left as? IdentifierReference)?.nameInSource shouldBe listOf("xx")
xxValue.right shouldBe NumericLiteral(DataType.UBYTE, 10.0, Position.DUMMY)
xxValue.right shouldBe NumericLiteral(DataType.UBYTE, 10.0, Position1.DUMMY)
}
})

View File

@ -6,8 +6,6 @@ import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.types.instanceOf
import prog8.ast.IFunctionCall
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.expressions.*
import prog8.ast.statements.Assignment
import prog8.ast.statements.FunctionCallStatement
@ -15,6 +13,8 @@ import prog8.ast.statements.Pipe
import prog8.ast.statements.VarDecl
import prog8.codegen.target.C64Target
import prog8.compiler.astprocessing.AstPreprocessor
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Position
import prog8.parser.Prog8Parser.parseModule
import prog8.parser.SourceCode
import prog8tests.helpers.*

View File

@ -6,13 +6,13 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.types.instanceOf
import prog8.ast.base.DataType
import prog8.ast.expressions.BinaryExpression
import prog8.ast.expressions.DirectMemoryRead
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.*
import prog8.codegen.target.C64Target
import prog8.compilerinterface.DataType
import prog8tests.helpers.ErrorReporterForTests
import prog8tests.helpers.compileText

View File

@ -4,8 +4,6 @@ import io.kotest.assertions.fail
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.compilerinterface.*
class TestSymbolTable: FunSpec({

View File

@ -12,7 +12,6 @@ import io.kotest.matchers.collections.shouldNotBeIn
import io.kotest.matchers.comparables.shouldBeGreaterThan
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import prog8.ast.base.DataType
import prog8.codegen.target.C64Target
import prog8.codegen.target.Cx16Target
import prog8.codegen.target.c64.C64Zeropage

View File

@ -4,12 +4,12 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.instanceOf
import prog8.ast.Program
import prog8.ast.base.Position
import prog8.ast.expressions.AddressOf
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.ast.expressions.PrefixExpression
import prog8.ast.statements.*
import prog8.compilerinterface.Position
import prog8.parser.Prog8Parser
import prog8.parser.SourceCode
import prog8tests.helpers.DummyFunctions

View File

@ -15,13 +15,13 @@ import prog8.ast.IFunctionCall
import prog8.ast.Module
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.codegen.target.C64Target
import prog8.codegen.target.cbm.PetsciiEncoding
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.Position
import prog8.parser.ParseError
import prog8.parser.Prog8Parser.parseModule
import prog8.parser.SourceCode

View File

@ -9,8 +9,8 @@ import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.types.shouldBeSameInstanceAs
import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.base.Position
import prog8.ast.internedStringsModuleName
import prog8.compilerinterface.Position
import prog8.parser.SourceCode
import prog8tests.helpers.DummyFunctions
import prog8tests.helpers.DummyMemsizer

View File

@ -2,9 +2,9 @@ package prog8tests.ast
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.shouldBe
import prog8.ast.base.DataType
import prog8.ast.statements.Block
import prog8.ast.statements.Subroutine
import prog8.compilerinterface.DataType
import prog8.parser.Prog8Parser.parseModule
import prog8.parser.SourceCode

View File

@ -3,10 +3,9 @@ package prog8tests.ast
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import prog8.ast.base.Position
import prog8.ast.statements.InlineAssembly
import prog8.codegen.target.C64Target
import prog8.compiler.compileProgram
import prog8.compilerinterface.Position
import prog8tests.helpers.compileText
class TestVarious: FunSpec({

View File

@ -4,10 +4,6 @@ import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.base.RegisterOrPair
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.AddressOf
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
@ -16,10 +12,7 @@ import prog8.codegen.cpu6502.AsmGen
import prog8.codegen.target.C64Target
import prog8.codegen.target.c64.C64Zeropage
import prog8.compiler.astprocessing.SymbolTableMaker
import prog8.compilerinterface.CbmPrgLauncherType
import prog8.compilerinterface.CompilationOptions
import prog8.compilerinterface.OutputType
import prog8.compilerinterface.ZeropageType
import prog8.compilerinterface.*
import prog8.parser.SourceCode
import prog8tests.helpers.DummyFunctions
import prog8tests.helpers.DummyMemsizer

View File

@ -1,8 +1,6 @@
package prog8tests.helpers
import prog8.ast.IBuiltinFunctions
import prog8.ast.base.DataType
import prog8.ast.base.Position
import prog8.ast.expressions.Expression
import prog8.ast.expressions.InferredTypes
import prog8.ast.expressions.NumericLiteral

View File

@ -1,7 +1,7 @@
package prog8tests.helpers
import prog8.ast.base.Position
import prog8.compilerinterface.IErrorReporter
import prog8.compilerinterface.Position
internal class ErrorReporterForTests(private val throwExceptionAtReportIfErrors: Boolean=true, private val keepMessagesAfterReporting: Boolean=false): IErrorReporter {

View File

@ -1,14 +1,10 @@
package prog8.ast
import prog8.ast.antlr.escape
import prog8.ast.base.DataType
import prog8.ast.base.NumericDatatypes
import prog8.ast.base.VarDeclType
import prog8.ast.base.toHex
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.*
/**

View File

@ -1,14 +1,14 @@
package prog8.ast
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.base.Position
import prog8.ast.expressions.Expression
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Position
import prog8.parser.SourceCode
const val internedStringsModuleName = "prog8_interned_strings"

View File

@ -1,13 +1,13 @@
package prog8.ast
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.base.Position
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.InferredTypes
import prog8.ast.statements.VarDecl
import prog8.ast.statements.VarDeclOrigin
import prog8.ast.statements.ZeropageWish
import prog8.compilerinterface.DataType
import prog8.compilerinterface.Position
import prog8.compilerinterface.VarDeclType
fun Program.getTempVar(dt: DataType, altNames: Boolean=false): Pair<List<String>, VarDecl> {

View File

@ -1,9 +1,9 @@
package prog8.ast
import prog8.ast.base.Position
import prog8.ast.expressions.Expression
import prog8.ast.expressions.InferredTypes
import prog8.ast.expressions.NumericLiteral
import prog8.compilerinterface.Position
interface IBuiltinFunctions {
val names: Set<String>

View File

@ -1,15 +1,11 @@
package prog8.ast
import prog8.ast.base.DataType
import prog8.ast.base.FatalAstException
import prog8.ast.base.Position
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.StringLiteral
import prog8.ast.statements.*
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.IMemSizer
import prog8.compilerinterface.IStringEncoding
import prog8.compilerinterface.*
import prog8.parser.SourceCode
/*********** Everything starts from here, the Program; zero or more modules *************/

View File

@ -5,7 +5,7 @@ import org.antlr.v4.runtime.tree.TerminalNode
import prog8.ast.base.*
import prog8.ast.expressions.*
import prog8.ast.statements.*
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.*
import prog8.parser.Prog8ANTLRParser
import prog8.parser.SourceCode
import java.nio.file.Path

View File

@ -1,7 +1,7 @@
package prog8.ast.antlr
import prog8.ast.base.Position
import prog8.ast.base.SyntaxError
import prog8.compilerinterface.Position
fun escape(str: String): String {
val es = str.map {

View File

@ -1,6 +1,7 @@
package prog8.ast.base
import prog8.ast.expressions.IdentifierReference
import prog8.compilerinterface.Position
/**
* A severe problem in the Ast (such as internal inconsistency or failed invariant)

View File

@ -6,7 +6,7 @@ import prog8.ast.base.*
import prog8.ast.statements.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.Encoding
import prog8.compilerinterface.*
import java.util.*
import kotlin.math.abs
import kotlin.math.round

View File

@ -1,6 +1,7 @@
package prog8.ast.expressions
import prog8.ast.base.*
import prog8.compilerinterface.*
import java.util.*

View File

@ -5,6 +5,7 @@ import prog8.ast.base.*
import prog8.ast.expressions.*
import prog8.ast.walk.AstWalker
import prog8.ast.walk.IAstVisitor
import prog8.compilerinterface.*
interface INamedStatement {

View File

@ -1,4 +1,4 @@
package prog8.ast.base
package prog8.compilerinterface
import kotlin.io.path.Path
import kotlin.io.path.absolute
@ -205,3 +205,8 @@ fun UInt.toHex(): String {
else -> throw IllegalArgumentException("number too large for 16 bits $this")
}
}
interface IMemSizer {
fun memorySize(dt: DataType): Int
}

View File

@ -1,11 +1,2 @@
package prog8.compilerinterface
import prog8.ast.base.DataType
// note: this is a separate interface in the compilerAst module because
// otherwise a cyclic dependency with the compilerInterfaces module would be needed.
interface IMemSizer {
fun memorySize(dt: DataType): Int
}

View File

@ -3,9 +3,9 @@ package prog8.parser
import org.antlr.v4.runtime.*
import prog8.ast.Module
import prog8.ast.antlr.toAst
import prog8.ast.base.Position
import prog8.ast.statements.Block
import prog8.ast.statements.Directive
import prog8.compilerinterface.Position
class ParseError(override var message: String, val position: Position, cause: RuntimeException): Exception(message, cause)

View File

@ -1,7 +1,6 @@
package prog8.compilerinterface
import prog8.ast.base.FatalAstException
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.IdentifierReference
import prog8.ast.expressions.NumericLiteral
import prog8.ast.statements.AssignTarget

View File

@ -4,7 +4,6 @@ import prog8.ast.Module
import prog8.ast.Node
import prog8.ast.Program
import prog8.ast.base.FatalAstException
import prog8.ast.base.VarDeclType
import prog8.ast.expressions.AddressOf
import prog8.ast.expressions.FunctionCallExpression
import prog8.ast.expressions.IdentifierReference

View File

@ -1,8 +1,5 @@
package prog8.compilerinterface
import prog8.ast.base.Position
interface IErrorReporter {
fun err(msg: String, position: Position)
fun warn(msg: String, position: Position)

View File

@ -1,8 +1,6 @@
package prog8.compilerinterface
import prog8.ast.Node
import prog8.ast.base.DataType
import prog8.ast.base.Position
/**

View File

@ -3,7 +3,6 @@ package prog8.compilerinterface
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.Result
import prog8.ast.base.*
class ZeropageAllocationError(message: String) : Exception(message)