mirror of
https://github.com/irmen/prog8.git
synced 2025-11-01 06:16:15 +00:00
callgraph no longer forgets some identifier occurrences
This commit is contained in:
@@ -117,11 +117,12 @@ class TestCallgraph: FunSpec({
|
|||||||
val result = compileText(C64Target(), false, sourcecode)!!
|
val result = compileText(C64Target(), false, sourcecode)!!
|
||||||
val graph = CallGraph(result.compilerAst)
|
val graph = CallGraph(result.compilerAst)
|
||||||
graph.allIdentifiers.size shouldBeGreaterThanOrEqual 5
|
graph.allIdentifiers.size shouldBeGreaterThanOrEqual 5
|
||||||
val empties = graph.allIdentifiers.keys.filter { it.nameInSource==listOf("empty") }
|
val empties = graph.allIdentifiers.filter { it.first.nameInSource==listOf("empty") }
|
||||||
|
println(graph.allIdentifiers)
|
||||||
empties.size shouldBe 3
|
empties.size shouldBe 3
|
||||||
empties[0].position.line shouldBe 4
|
empties[0].first.position.line shouldBe 4
|
||||||
empties[1].position.line shouldBe 5
|
empties[1].first.position.line shouldBe 5
|
||||||
empties[2].position.line shouldBe 6
|
empties[2].first.position.line shouldBe 6
|
||||||
}
|
}
|
||||||
|
|
||||||
test("checking block and subroutine names usage in assembly code") {
|
test("checking block and subroutine names usage in assembly code") {
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class CallGraph(private val program: Program) : IAstVisitor {
|
|||||||
val calls = mutableMapOf<Subroutine, Set<Subroutine>>().withDefault { setOf() }
|
val calls = mutableMapOf<Subroutine, Set<Subroutine>>().withDefault { setOf() }
|
||||||
val calledBy = mutableMapOf<Subroutine, Set<Node>>().withDefault { setOf() }
|
val calledBy = mutableMapOf<Subroutine, Set<Node>>().withDefault { setOf() }
|
||||||
val notCalledButReferenced = mutableSetOf<Subroutine>()
|
val notCalledButReferenced = mutableSetOf<Subroutine>()
|
||||||
private val allIdentifiersAndTargets = mutableMapOf<IdentifierReference, Statement>()
|
private val allIdentifiersAndTargets = mutableListOf<Pair<IdentifierReference, Statement>>()
|
||||||
private val allAssemblyNodes = mutableListOf<InlineAssembly>()
|
private val allAssemblyNodes = mutableListOf<InlineAssembly>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
visit(program)
|
visit(program)
|
||||||
}
|
}
|
||||||
|
|
||||||
val allIdentifiers: Map<IdentifierReference, Statement> = allIdentifiersAndTargets
|
val allIdentifiers: List<Pair<IdentifierReference, Statement>> = allIdentifiersAndTargets
|
||||||
|
|
||||||
private val usedSubroutines: Set<Subroutine> by lazy {
|
private val usedSubroutines: Set<Subroutine> by lazy {
|
||||||
calledBy.keys + program.entrypoint + notCalledButReferenced
|
calledBy.keys + program.entrypoint + notCalledButReferenced
|
||||||
@@ -36,7 +36,7 @@ class CallGraph(private val program: Program) : IAstVisitor {
|
|||||||
val used = mutableSetOf<Block>()
|
val used = mutableSetOf<Block>()
|
||||||
|
|
||||||
allIdentifiersAndTargets.forEach {
|
allIdentifiersAndTargets.forEach {
|
||||||
val target = it.value.definingBlock
|
val target = it.second.definingBlock
|
||||||
used.add(target)
|
used.add(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ class CallGraph(private val program: Program) : IAstVisitor {
|
|||||||
override fun visit(identifier: IdentifierReference) {
|
override fun visit(identifier: IdentifierReference) {
|
||||||
val target = identifier.targetStatement(program)
|
val target = identifier.targetStatement(program)
|
||||||
if(target!=null)
|
if(target!=null)
|
||||||
allIdentifiersAndTargets[identifier] = target
|
allIdentifiersAndTargets.add(identifier to target)
|
||||||
|
|
||||||
// if it's a scoped identifier, the subroutines in the name are also referenced!
|
// if it's a scoped identifier, the subroutines in the name are also referenced!
|
||||||
val scope = identifier.definingScope
|
val scope = identifier.definingScope
|
||||||
@@ -196,7 +196,7 @@ class CallGraph(private val program: Program) : IAstVisitor {
|
|||||||
val assemblyBlocks = allAssemblyNodes.filter {
|
val assemblyBlocks = allAssemblyNodes.filter {
|
||||||
decl.name in it.names || "p8v_" + decl.name in it.names
|
decl.name in it.names || "p8v_" + decl.name in it.names
|
||||||
}
|
}
|
||||||
return allIdentifiersAndTargets.filter { decl===it.value }.map{ it.key } + assemblyBlocks
|
return allIdentifiersAndTargets.filter { decl===it.second }.map{ it.first } + assemblyBlocks
|
||||||
}
|
}
|
||||||
|
|
||||||
private val prefixes = listOf("p8b_", "p8v_", "p8s_", "p8c_", "p8l_", "p8_", "")
|
private val prefixes = listOf("p8b_", "p8v_", "p8s_", "p8c_", "p8l_", "p8_", "")
|
||||||
|
|||||||
Reference in New Issue
Block a user