mirror of
https://github.com/irmen/prog8.git
synced 2024-11-26 11:49:22 +00:00
improve compiler error when defining duplicate block names
This commit is contained in:
parent
95a62fcdd1
commit
049dbf5a78
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user