mirror of
https://github.com/irmen/prog8.git
synced 2024-07-24 22:29:15 +00:00
fixed some parse tree node position end-columns. cleanup some todo's
This commit is contained in:
parent
730b208617
commit
23961f695d
@ -1307,9 +1307,6 @@ $repeatLabel lda $counterVar
|
|||||||
// at this time, nothing has to be done here anymore code-wise
|
// at this time, nothing has to be done here anymore code-wise
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: %asminclude and %asmbinary should be done earlier than code gen (-> put content into AST) ... (describe why?)
|
|
||||||
*/
|
|
||||||
private fun translate(stmt: Directive) {
|
private fun translate(stmt: Directive) {
|
||||||
when(stmt.directive) {
|
when(stmt.directive) {
|
||||||
"%asminclude" -> {
|
"%asminclude" -> {
|
||||||
|
@ -180,7 +180,7 @@ private fun optimizeSameAssignments(linesByFourteen: List<List<IndexedValue<Stri
|
|||||||
|
|
||||||
private fun optimizeStoreLoadSame(linesByFour: List<List<IndexedValue<String>>>): List<Modification> {
|
private fun optimizeStoreLoadSame(linesByFour: List<List<IndexedValue<String>>>): List<Modification> {
|
||||||
// sta X + lda X, sty X + ldy X, stx X + ldx X -> the second instruction can OFTEN be eliminated
|
// sta X + lda X, sty X + ldy X, stx X + ldx X -> the second instruction can OFTEN be eliminated
|
||||||
// TODO this is not true if X is not a regular RAM memory address (but instead mapped I/O or ROM)
|
// TODO this is not true if X is not a regular RAM memory address (but instead mapped I/O or ROM) but how does this code know?
|
||||||
val mods = mutableListOf<Modification>()
|
val mods = mutableListOf<Modification>()
|
||||||
for (pair in linesByFour) {
|
for (pair in linesByFour) {
|
||||||
val first = pair[0].value.trimStart()
|
val first = pair[0].value.trimStart()
|
||||||
|
@ -148,6 +148,7 @@ internal class FunctionCallAsmGen(private val program: Program, private val asmg
|
|||||||
if(arg.isSimple) { // TODO FOR ALL ARG TYPES?
|
if(arg.isSimple) { // TODO FOR ALL ARG TYPES?
|
||||||
// note this stuff below is needed to (eventually) avoid calling asmgen.translateExpression()
|
// note this stuff below is needed to (eventually) avoid calling asmgen.translateExpression()
|
||||||
// TODO but This STILL requires the translateNormalAssignment() to be fixed to avoid stack eval for expressions...
|
// TODO but This STILL requires the translateNormalAssignment() to be fixed to avoid stack eval for expressions...
|
||||||
|
// println("*** ALT PARAM PASSING FOR ASMSUB $stmt $arg") // TODO DEBUG
|
||||||
when (val dt = arg.inferType(program).getOr(DataType.UNDEFINED)) {
|
when (val dt = arg.inferType(program).getOr(DataType.UNDEFINED)) {
|
||||||
in ByteDatatypes -> {
|
in ByteDatatypes -> {
|
||||||
asmgen.assignExpressionToRegister(arg, RegisterOrPair.A)
|
asmgen.assignExpressionToRegister(arg, RegisterOrPair.A)
|
||||||
|
@ -18,7 +18,7 @@ import prog8.compilerinterface.isInRegularRAMof
|
|||||||
class BinExprSplitter(private val program: Program, private val options: CompilationOptions, private val compTarget: ICompilationTarget) : AstWalker() {
|
class BinExprSplitter(private val program: Program, private val options: CompilationOptions, private val compTarget: ICompilationTarget) : AstWalker() {
|
||||||
|
|
||||||
// override fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> {
|
// override fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> {
|
||||||
// TODO somehow if we do this, the resulting code for some programs (cube3d.p8) gets hundreds of bytes larger...:
|
// TODO somehow if we do this, the resulting code for some programs (cube3d.p8) gets hundreds of bytes larger...: [ IS THIS STILL TRUE AFTER ALL CHANGES? ]
|
||||||
// if(decl.type==VarDeclType.VAR ) {
|
// if(decl.type==VarDeclType.VAR ) {
|
||||||
// val binExpr = decl.value as? BinaryExpression
|
// val binExpr = decl.value as? BinaryExpression
|
||||||
// if (binExpr != null && binExpr.operator in augmentAssignmentOperators) {
|
// if (binExpr != null && binExpr.operator in augmentAssignmentOperators) {
|
||||||
|
@ -143,7 +143,6 @@ class ModuleImporter(private val program: Program,
|
|||||||
} else {
|
} else {
|
||||||
val dropCurDir = if(sourcePaths.isNotEmpty() && sourcePaths[0].name == ".") 1 else 0
|
val dropCurDir = if(sourcePaths.isNotEmpty() && sourcePaths[0].name == ".") 1 else 0
|
||||||
sourcePaths.drop(dropCurDir) +
|
sourcePaths.drop(dropCurDir) +
|
||||||
// TODO: won't work until Prog8Parser is fixed s.t. it fully initializes the modules it returns. // hm, what won't work?)
|
|
||||||
listOf(Path(importingModule.position.file).parent ?: Path("")) +
|
listOf(Path(importingModule.position.file).parent ?: Path("")) +
|
||||||
listOf(Path(".", "prog8lib"))
|
listOf(Path(".", "prog8lib"))
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ private fun ParserRuleContext.toPosition() : Position {
|
|||||||
pathString
|
pathString
|
||||||
}
|
}
|
||||||
// note: beware of TAB characters in the source text, they count as 1 column...
|
// note: beware of TAB characters in the source text, they count as 1 column...
|
||||||
return Position(filename, start.line, start.charPositionInLine, stop.charPositionInLine + stop.text.length)
|
return Position(filename, start.line, start.charPositionInLine, start.charPositionInLine + start.stopIndex - start.startIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun Prog8ANTLRParser.BlockContext.toAst(isInLibrary: Boolean) : Block {
|
internal fun Prog8ANTLRParser.BlockContext.toAst(isInLibrary: Boolean) : Block {
|
||||||
|
@ -100,7 +100,7 @@ object Prog8Parser {
|
|||||||
val offending = this.offendingToken
|
val offending = this.offendingToken
|
||||||
val line = offending.line
|
val line = offending.line
|
||||||
val beginCol = offending.charPositionInLine
|
val beginCol = offending.charPositionInLine
|
||||||
val endCol = beginCol + offending.stopIndex - offending.startIndex // TODO: point to col *after* token? / why, what's wrong with endCol being inclusive
|
val endCol = beginCol + offending.stopIndex - offending.startIndex
|
||||||
return Position(file, line, beginCol, endCol)
|
return Position(file, line, beginCol, endCol)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,24 +287,16 @@ class TestProg8Parser {
|
|||||||
fun `in ParseError from bad string source code`() {
|
fun `in ParseError from bad string source code`() {
|
||||||
val srcText = "bad * { }\n"
|
val srcText = "bad * { }\n"
|
||||||
|
|
||||||
assertFailsWith<ParseError> { parseModule(SourceCode.Text(srcText)) }
|
val e = assertFailsWith<ParseError> { parseModule(SourceCode.Text(srcText)) }
|
||||||
try {
|
|
||||||
parseModule(SourceCode.Text(srcText))
|
|
||||||
} catch (e: ParseError) {
|
|
||||||
assertPosition(e.position, Regex("^<String@[0-9a-f\\-]+>$"), 1, 4, 4)
|
assertPosition(e.position, Regex("^<String@[0-9a-f\\-]+>$"), 1, 4, 4)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `in ParseError from bad file source code`() {
|
fun `in ParseError from bad file source code`() {
|
||||||
val path = assumeReadableFile(fixturesDir, "file_with_syntax_error.p8")
|
val path = assumeReadableFile(fixturesDir, "file_with_syntax_error.p8")
|
||||||
|
|
||||||
assertFailsWith<ParseError> { parseModule(SourceCode.File(path)) }
|
val e = assertFailsWith<ParseError> { parseModule(SourceCode.File(path)) }
|
||||||
try {
|
assertPosition(e.position, SourceCode.relative(path).toString(), 2, 6)
|
||||||
parseModule(SourceCode.File(path))
|
|
||||||
} catch (e: ParseError) {
|
|
||||||
assertPosition(e.position, SourceCode.relative(path).toString(), 2, 6) // TODO: endCol wrong
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -312,16 +304,16 @@ class TestProg8Parser {
|
|||||||
val srcText = """
|
val srcText = """
|
||||||
main {
|
main {
|
||||||
}
|
}
|
||||||
""".trimIndent()
|
"""
|
||||||
val module = parseModule(SourceCode.Text(srcText))
|
val module = parseModule(SourceCode.Text(srcText))
|
||||||
assertPositionOf(module, Regex("^<String@[0-9a-f\\-]+>$"), 1, 0) // TODO: endCol wrong
|
assertPositionOf(module, Regex("^<String@[0-9a-f\\-]+>$"), 1, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `of Module parsed from a file`() {
|
fun `of Module parsed from a file`() {
|
||||||
val path = assumeReadableFile(fixturesDir, "simple_main.p8")
|
val path = assumeReadableFile(fixturesDir, "simple_main.p8")
|
||||||
val module = parseModule(SourceCode.File(path))
|
val module = parseModule(SourceCode.File(path))
|
||||||
assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0) // TODO: endCol wrong
|
assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -330,27 +322,24 @@ class TestProg8Parser {
|
|||||||
|
|
||||||
val module = parseModule(SourceCode.File(path))
|
val module = parseModule(SourceCode.File(path))
|
||||||
val mpf = module.position.file
|
val mpf = module.position.file
|
||||||
assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0) // TODO: endCol wrong
|
assertPositionOf(module, SourceCode.relative(path).toString(), 1, 0)
|
||||||
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
||||||
assertPositionOf(mainBlock, mpf, 2, 0) // TODO: endCol wrong!
|
assertPositionOf(mainBlock, mpf, 2, 0, 3)
|
||||||
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
||||||
assertPositionOf(startSub, mpf, 3, 4) // TODO: endCol wrong!
|
assertPositionOf(startSub, mpf, 3, 4, 6)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: this test is testing way too much at once
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
fun `of non-root Nodes parsed from a string`() {
|
fun `of non-root Nodes parsed from a string`() {
|
||||||
val srcText = """
|
val srcText = """
|
||||||
%zeropage basicsafe ; DirectiveArg directly inherits from Node - neither an Expression nor a Statement..?
|
%zeropage basicsafe
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
ubyte foo = 42
|
ubyte foo = 42
|
||||||
ubyte bar
|
ubyte bar
|
||||||
when (foo) {
|
when (foo) {
|
||||||
23 -> bar = 'x' ; WhenChoice, also directly inheriting Node
|
23 -> bar = 'x'
|
||||||
42 -> bar = 'y'
|
42 -> bar = 'y'
|
||||||
else -> bar = 'z'
|
else -> bar = 'z'
|
||||||
}
|
}
|
||||||
@ -361,22 +350,22 @@ class TestProg8Parser {
|
|||||||
val mpf = module.position.file
|
val mpf = module.position.file
|
||||||
|
|
||||||
val targetDirective = module.statements.filterIsInstance<Directive>()[0]
|
val targetDirective = module.statements.filterIsInstance<Directive>()[0]
|
||||||
assertPositionOf(targetDirective, mpf, 1, 0) // TODO: endCol wrong!
|
assertPositionOf(targetDirective, mpf, 1, 0, 8)
|
||||||
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
||||||
assertPositionOf(mainBlock, mpf, 2, 0) // TODO: endCol wrong!
|
assertPositionOf(mainBlock, mpf, 2, 0, 3)
|
||||||
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
||||||
assertPositionOf(startSub, mpf, 3, 4) // TODO: endCol wrong!
|
assertPositionOf(startSub, mpf, 3, 4, 6)
|
||||||
val declFoo = startSub.statements.filterIsInstance<VarDecl>()[0]
|
val declFoo = startSub.statements.filterIsInstance<VarDecl>()[0]
|
||||||
assertPositionOf(declFoo, mpf, 4, 8) // TODO: endCol wrong!
|
assertPositionOf(declFoo, mpf, 4, 8, 12)
|
||||||
val rhsFoo = declFoo.value!!
|
val rhsFoo = declFoo.value!!
|
||||||
assertPositionOf(rhsFoo, mpf, 4, 20) // TODO: endCol wrong!
|
assertPositionOf(rhsFoo, mpf, 4, 20, 21)
|
||||||
val declBar = startSub.statements.filterIsInstance<VarDecl>()[1]
|
val declBar = startSub.statements.filterIsInstance<VarDecl>()[1]
|
||||||
assertPositionOf(declBar, mpf, 5, 8) // TODO: endCol wrong!
|
assertPositionOf(declBar, mpf, 5, 8, 12)
|
||||||
val whenStmt = startSub.statements.filterIsInstance<WhenStatement>()[0]
|
val whenStmt = startSub.statements.filterIsInstance<WhenStatement>()[0]
|
||||||
assertPositionOf(whenStmt, mpf, 6, 8) // TODO: endCol wrong!
|
assertPositionOf(whenStmt, mpf, 6, 8, 11)
|
||||||
assertPositionOf(whenStmt.choices[0], mpf, 7, 12) // TODO: endCol wrong!
|
assertPositionOf(whenStmt.choices[0], mpf, 7, 12, 13)
|
||||||
assertPositionOf(whenStmt.choices[1], mpf, 8, 12) // TODO: endCol wrong!
|
assertPositionOf(whenStmt.choices[1], mpf, 8, 12, 13)
|
||||||
assertPositionOf(whenStmt.choices[2], mpf, 9, 12) // TODO: endCol wrong!
|
assertPositionOf(whenStmt.choices[2], mpf, 9, 12, 15)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user