improve compiler error when defining duplicate block names

This commit is contained in:
Irmen de Jong 2021-07-04 15:14:39 +02:00
parent 95a62fcdd1
commit 049dbf5a78
2 changed files with 11 additions and 16 deletions

View File

@ -1,6 +1,5 @@
package prog8.compiler.astprocessing package prog8.compiler.astprocessing
import prog8.ast.Module
import prog8.ast.Program import prog8.ast.Program
import prog8.ast.base.Position import prog8.ast.base.Position
import prog8.ast.expressions.StringLiteralValue import prog8.ast.expressions.StringLiteralValue
@ -17,29 +16,20 @@ internal class AstIdentifiersChecker(private val program: Program, private val e
errors.err("name conflict '$name', also defined in ${existing.position.file} line ${existing.position.line}", position) errors.err("name conflict '$name', also defined in ${existing.position.file} line ${existing.position.line}", position)
} }
override fun visit(module: Module) {
blocks.clear() // blocks may be redefined within a different module
super.visit(module)
}
override fun visit(block: Block) { override fun visit(block: Block) {
if(block.name in compTarget.machine.opcodeNames) if(block.name in compTarget.machine.opcodeNames)
errors.err("can't use a cpu opcode name as a symbol: '${block.name}'", block.position) errors.err("can't use a cpu opcode name as a symbol: '${block.name}'", block.position)
val existing = blocks[block.name] val existing = blocks[block.name]
if(existing!=null) if(existing!=null) {
if(block.isInLibrary)
nameError(existing.name, existing.position, block)
else
nameError(block.name, block.position, existing) nameError(block.name, block.position, existing)
}
else else
blocks[block.name] = block blocks[block.name] = block
if(!block.isInLibrary) {
val libraries = program.modules.filter { it.isLibraryModule }
val libraryBlockNames = libraries.flatMap { it.statements.filterIsInstance<Block>().map { b -> b.name } }
if(block.name in libraryBlockNames)
errors.err("block is already defined in an included library module", block.position)
}
super.visit(block) super.visit(block)
} }

View File

@ -4,6 +4,11 @@ TODO
For next release For next release
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
- rename libdirs option to srcdirs?
- can we derive module.name from module.source (taking just the filename base)?
- can Position.file be a Path- making the source variable for nodes unnecessary?
- refactor code to improve testability and other things, see [CompilerDevelopment](CompilerDevelopment.md) - refactor code to improve testability and other things, see [CompilerDevelopment](CompilerDevelopment.md)
- simplify cx16.joystick_get2() once this cx16 rom issue is resolved: https://github.com/commanderx16/x16-rom/issues/203 - simplify cx16.joystick_get2() once this cx16 rom issue is resolved: https://github.com/commanderx16/x16-rom/issues/203
(I hope this will still be included into the final v39 roms release for the cx16) (I hope this will still be included into the final v39 roms release for the cx16)